pondělí 26. prosince 2016

T-Mobile VoIP a Asterisk za NATem 2

Zklamáním je přístup společnosti T-Mobile (TM) k zákazníkům používající hlasovou službu VoIP, kteří neprovolají stovky až tisíce minut. To co provedl TM nemá obdoby. Jednoho krásného dne se rozhodl, že službu, kterou nabízí přemigruje na svou nově zřízenou VoIP ústřednu. Ale zapomněl o tom spraviti koncového zákazníka. Kdyby jen změnil IP adresu serveru schovanou pod doménovým jménem starší hlasové služby, asi by se nic vážného nestalo. Samozřejmě, došlo k nejhoršímu a změn bylo víc než dost. Služba nefungovala cca 3 týdny, nekonečně mnoho telefonátů než se podařilo službu nějakým způsobem oživit zpět, protože na dohledu TM je asi jen jeden jediný člověk, který pravděpodobně ví jak VoIP u TM funguje! 
Vzhledem k mnoha dotazů ke službě TM, přináším poznatky a poznámky jak snad službu zprovozniti.
V první řadě je tedy potřeba změnit doménu VoIP ústředny TM na "ims.t-mobile.cz". DNS servery prostě neumí rozumně nasměrovat původní "sip.tmip.cz", nebo umí, ale stará služba je prostě odpojena a nic nedělá. Druhou věcí ke změně je "extension" na konci registračního řetězce. Dle TM používají ověřování ještě v SIP Header? a to už ne v národním formátu, ale v mezinárodním formátu čísla. To obstará funkce register na konci stringu za lomítkem. Pozor, tato hodnota označovaná v Asterisku jako extension přechází při příchozím volání do dialplánu a je na to potřeba myslet.
register => 420123456789:321654987852@ims.t-mobile.cz:5060/420123456789
V dalším kroku je nutno v general parametrech sip.conf změnit externip, pokud máte Asterisk za NATem. Doporučuji ověřit danou adresu pingem na doménu ústředny TM. Bude li zde adresa chybná buď nebude ústředna za NATem fungovat správně, nebo bude expiry time - Refresh (sip show registry) ve velkých nebo nesmyslných hodnotách. (registrace VoIP u TM probíhá nejdříve přes SBC, pak přes nějakou databázi a pak k samotné VoIP ústředně???, proto je správné nastavení důležité až kritické!)
[general]
port = 5060
;tcpenable=yes                   ;v případě TCP odkomentovat
;tcpbindaddr=0.0.0.0
bindaddr = 0.0.0.0
externip = 89.24.84.22           ;dulezite pro prichozi hovory - IP ims.t-mobile.cz
localnet = 10.0.0.1/255.255.255.0 
nat=force_rport
Neuvěřitelná byla, ale informace o zvětšení délky paketu a jeho fragmentaci na straně zákazníka a proto bylo doporučeno přejít na TCP z důvodu potvrzování paketů a tudíž doručení kompletního datagramu. Nějak to nefungovalo, tak jsme zpět u UDP. V případě potřeby, je nutné nastavit Asterisk tak, aby používal TCP. Kontext konkrétní linky se moc nezměnil, až na doménu.
[420123456789]
type = friend
host = ims.t-mobile.cz
fromdomain = ims.t-mobile.cz  
context = from_VOIP_ISP
dtmfmode = rfc2833
insecure=invite,port
defaultuser = 420123456789
fromuser = 420123456789
secret = 321654987852
canreinvite = no  ;drzi spojeni pres RTP
qualify=yes       ;zasilani SIP OPTIONS - udrzuje spojeni - musi podporovat obe strany   
;defaultexpiry=300
;transport=tcp
V routeru se musí vypnout funkce SIP AGL!
V dialplánu v souboru extension.conf je potřeba použít jako extension na příchozí hovor celé národní číslo, tak jak bylo řečeno u položky register.
[from_VOIP_ISP]
exten => 420123456789,1,NoOp(number=${CALLERID(number)})
 same => n,NoOp(all=${CALLERID(all)})
 same => n,Goto(internal,${EXTEN:3},1)  ;skoci na kontext internal a odreze prefix 420
Služba se po mnoha telefonátech, čekání na správného člověka z dohledu TM povedla rozjet. Stále vykazuje nějaké muchy, které se snad podaří odstranit, ale pokud se v TM nezamyslí a nezlepší komunikaci ze zákazníkem jsme připraveni k návratu ke "kyslíku" a jejich "bezproblémových ISDN".
Budu rád za vaše připomínky, popřípadě zkušenosti se službou.

6 komentářů:

  1. Nam se take podarilo dotelefonovat nekomu z tmobile, tan nam sdelil ze nas asterisk odesila : Contact:., ale ze tam nema byt "s" , ale telefoni cislo, pritom "s" je platny extent. Neprisli jsme na to jak asterisk verze 1.8.20.0 donutit vyplnit tuto cast hlavicky :(.

    OdpovědětVymazat
    Odpovědi
    1. A mate vyplnene cislo za lomitkem v registraci k uctu TM? Kdyz tam nic nenapisete, odesila Asterisk "s".

      Vymazat
  2. Dobrý den, díky za podstatné informace. Mám jeden dotaz, vlastně dva:
    1. jak přesměrováváte příchozí hovory na externí linku?
    2. jak jim přiřadíte původní číslo volajícího?

    Ad 1. Mám Asterisk 13 za natem, kde příchozí i odchozí hovory fungují. Problém je v přesměrovaných hovorech, ustavených v dial planu jako Dial(SIP/TMtrunk/číslo). Asterisk je spojí, ale zvuk neprochází. Když použiju konkurenční účet od 802, krásně to vypíše Probation passed - setting RTP source address to ... a bez problému se to spojí.

    Ad 2. ani na 802 se mi nedaří přiřadit původní CID tak, aby je viděl cílový volaný

    Díky za odpověď.

    OdpovědětVymazat
  3. 1. Pokud to lze tak FWD nastavuji v koncových bodech, tj. v telefonech. Jinak lze nastavit přesměrování v Asterisku, ale zde je potřeba mnoho nastavení (jedná li se o fresh instalaci).
    2. Původní číslo volajícího nepřiřadíte. Pokud nejste operátor manipulace s Caller ID není dle české legislativy povolena. Musíte použít ID linky, přes kterou je hovor uskutečněn. Z praxe ale vím, že mnoho VoIP operátorů nedokáže tuto službu hlídat a na odchozí ID lze nastavit cokoliv. Potom stačí v Asterisku v dialplánu nastavit parametr callerid(all) na požadoované číslo!

    OdpovědětVymazat
  4. Díky. Ad 1) no, mohl bych změnit dial plán pravidelně po prac. době tak, že se bude vytáčet jedna pobočková linka (místo všech), která po nějaké době zvonění provede forward. Ale radši bych to udělal pomocí dialplanu rovnou. Je tam freepbx, kterou pro určité situace ručně pomocí conf. souboru asterisku obcházím - např. právě pro určité hodiny nebo blokovaná čísla.
    2) zkusím. A nejde poslat příchozí TM ústředně hlavičku redirect (nebo jinou) tak, aby se sama spojila s cílovým určením a "vynechala" naší ústřednu? Pak by si přenos CID obstarala sama. Snažím se informace dostat z TM, ale zatím bez úspěchu.

    OdpovědětVymazat
  5. Vyřešeno. Přesměroval jsem příkazem Transfer(). Spojeno, číslo přeneseno původní. Díky za pomoc.

    OdpovědětVymazat