Tento díl seriálu se věnuje propojení Asterisku s jinými ústřednami pomocí protokolu SIPi. Typickým využitím je propojení s bránou do veřejné telefonní sítě (PSTNi), která hovory vedené protokolem SIP převádí na technologie využívané v klasické telefonní síti. Propojení dvou ústředen se od propojení s telefonem liší hlavně tím, že je možné vést několik hovorů naráz pro různá telefonní čísla. Takovému propojení se říká trunk.
Jak jsme již naznačili v minulém dílu seriálu, trunk je realizován jako speciální extension. (Poznámka k terminologii: Pojem extension se bohužel používá poměrně vágně a můžeme se setkat s několika různými významy. Základní význam je telefon připojený k ústředně. Historickým vývojem došlo k tomu, že jako extensions jsou také často označována pravidla v souboru extensions.conf -- začínají na exten => ...). Pro úplnost dodejme, že existují i alternativní způsoby zprovoznění trunku, které nevyžadují definici extension, ale o těch budeme psát později. Definovat pro trunk jeho vlastní extension je technicky mnohem čistčí varianta.
sip.conf
Probereme napřed jednodušší případ. Předpokládejme, že naše ústředna i protistrana (brána do PSTN) má veřejnou IP adresu, tj. mezi bránou do PSTN a naší ústřednou neprobíhá žádný překlad adres pomocí NATu. Hovory je nutné zabezpečit, aby nikdo nemohl vydávat svoje zařízení za naší ústřednu a telefonovat na náš účet. Mezi ústřednami se často používá zabezpečení na základě IP adresy. Brána má v konfiguraci nastavenou IP adresu naší ústředny a rozsah našich telefonních čísel. Obdrží-li žádost o navázání hovoru, ve které je odchozí telefonní číslo z našeho rozsahu (a nám tedy bude hovor vyúčtován), zkontroluje, zda požadavek přišel z IP adresy naší ústředny. Tím je zaručena základní bezpečnost. I když cizí IP adresy se lze zmocnit mnoha způsoby, žádný z nich není úplně jednoduchý. V praxi se tento způsob zabezpečení často používá.
Předpokládejme, že náš Asterisk má IP adresu 8.8.8.1 a brána má adresu 8.8.8.2, jak je naznačeno na obrázku.

V souboru sip.conf je potřeba definovat trunk pomocí sekce muj_trunk:
[general] allowguests=no [authentication] ;definice SIP trunku [muj_trunk] type=peer host=8.8.8.2 fromdomain=mojedomena.cz canrenvite=no context=incoming [novak] type=friend secret=heslonovak userid=Jan Novak <200> host=dynamic context=internal
Všimněte si komentáře těsně před začátkem sekce muj_trunk. Komentáře v konfiguračních souborech Asterisku se zapisují pomocí středníku. Volba type=peer se používá pro konfiguraci trunku. peer se dá využit i pro příchozí volání, rozdíl mezi typem friend a peer je podrobně popsán v článku User, friend a peer. Volba host na dalším řádku nastavuje IP adresu brány, kam budou volání ven směrována. Všimněte si, že u telefonů se používá host=dynamic a svoji IP adresu si pak telefon nastaví sám pomocí registrace. I u telefonů je možné nastavit IP adresu staticky.
V protokolu SIP se používají SIP URIi, které jsou jakousi obdobou emailových adres. Příklad SIP URI:
sip:420123456789@mojedomena.cz
Před SIP URI se píše prefix sip:, aby se odlišilo od emailu. Každá žádost o nový hovor musí obsahovat SIP URI volajícího účastníka. Parametr fromdomain udává, jakou doménu má Asterisk vložit za zavináč SIP URI při sestavování požadavku pro bránu. Správná hodnota závisí na nastavení brány. Často to bývá IP adresa Asterisku, někdy také doménové jméno serveru s Asteriskem. Některé brány doménu za zavináčem prostě ignorují a na nastavení nezáleží. Jindy zase vyžadují IP adresu brány, nebo doménu poskytovatele propojení. Doména v SIP URI volaného účastníka se získá z parametru host.
Je-li navázán hovor mezi dvěma SIPovými telefony, pošle jim Asterisk speciální požadavek re-INVITE, který způsobí, že hlasová data nebudou proudit přes Asterisk, ale přímo mezi oběma telefony. Předpokladem je, že telefony tuto funkci podporují a jsou ve stejné síti (mohou spolu přímo komunikovat). Některé telefony reinvite nepodporují a právě volba canreinvite=no způsobí, že se Asterisk nebude snažit o přímý přenos hlasových dat. reinvite se používá většinou jen pro hovory v rámci lokální sítě (kde mohou telefony přímo komunikovat a hovory jsou zdarma). Pokud hlasová data neprochází ústřednou, nedá se spolehlivě určit skutečný konec hovoru a sestavit správně vyúčtování.
Poslední volba context=incoming má úplně stejný význam jako pro telefony. Určuje kontext, který se použije pro zpracování příchozích volání.
Nezapomeňte, že po změně sip.conf je potřeba spustit příkaz sip reload v konzoli Asterisku.
extensions.conf
V minulých dílech jsme pro směrování hovoru na telefon připojený k Asterisku používali pravidlo typu
[internal] exten =>200,1,Dial(SIP/novak) exten =>201,1,Dial(SIP/cerny)
Pro hovory směrované na bránu potřebujeme navíc dodat volané číslo, aby brána věděla kam hovor dál směrovat. Funkční, ale nepříliš praktické pravidlo by mohlo vypadat takto:
[internal] exten =>200,1,Dial(SIP/novak) exten =>201,1,Dial(SIP/cerny) exten =>800123456,1,Dial(SIP/420800123456789@muj_trunk)
Pokud na připojeném telefonu někdo vytočí 800123456, dovolá se na linku 800 123456789. Prefix 420 je mezinárodní kód pro českou republiku. Některé brány ho vyžadují, u jiných nemusí být potřeba. Ukážeme si jak s pomocí šablon vytvořit pravidlo pro všechna devítimístná telefonní čísla.
[internal]
exten =>200,1,Dial(SIP/novak)
exten =>201,1,Dial(SIP/cerny)
exten =>_XXXXXXXXX,1,Dial(SIP/420${EXTEN}@muj_trunk)
Podtržítko na začátku _XXXXXXXXX znamená, že jde o šablonu a ne o zobecněné telefonní číslo s devíti písmeny X. Každý znak X v šabloně je symbol pro jednu číslici od 0 do 9. Více o šablonách můžete najít na www.voip-info.org a v rámci seriálu se k nim ještě vrátíme. Poslední pravidlo se použije v případě, že účastník vytočí devítimístné číslo. Speciální symbol ${EXTEN} je proměnná, která obsahuje právě volané (vytočené) číslo. Asterisk pokaždé nahradí ${EXTEN} tímto číslem. Proměnné lze využívat i na jiných místech dialplanu, například jako parametr příkazu NoOp
exten => 998,1,NoOp(volani na ${EXTEN})
exten => 998,n,Busy()
Nyní máme ústřednu nastavenou pro volání ven. Příchozí volání ošetříme v kontextu incoming, který je dán parametrem context v sip.conf.
[incoming] exten =>420999888200,1,Dial(SIP/novak) exten =>420999888201,1,Dial(SIP/cerny)
V našem příkladu předpokládáme, že máme přidělena čísla 999 888 200 a 999 888 201.
Nezapomeňte, že po změně extensions.conf je potřeba spustit příkaz dialplan reload v konzoli Asterisku.
Nastavení údajů volajícího
Chcete-li sledovat obsah paketů, můžete použít utilitu tcpdump. Typické použití je
tcpdump -i eth0 -s 0 -v udp port 5060
- -i eth0
- Udává na jakém síťovém rozhraní má
tcpdumpnaslouchat. Můžete použít i variantu-i any, tato volba způsobí, žetcpdumpbude naslouchat na všech rozhraních. - -s 0
- Udává maximální množství dat, které budou pro každý zachyceny a vypsány. Hodnota 0 znamená zachytávání bez omezení velikosti. Bez této volby by se vypsal jen začátek každého paketu.
- -v
- Verbose, způsobí, že bude na konzoli vypsán obsah paketu.
- udp port 5060
- Specifikuje, že bude nasloucháno jen na portu 5060 (standardní SIPový port) a budou zachyceny jen pakety protokolu UDPi.
Výpis paketu s metodou INVITE, který obsahuje požadavek na navázání hovoru vypadá přibližně takto:
INVITE sip:123456789@8.8.8.2 SIP/2.0 Via: SIP/2.0/UDP 8.8.8.1:5060;branch=z9hG4bK4b7d8f1f;rport From: "Jan Novak" <sip:novak@mojedomena.cz>;tag=as594ea820 To: <sip:123456789@8.8.8.2> Contact: <sip:novak@8.8.8.1> Call-ID: 384495ac0217e43c1096153434a4b48e@mojedomena.cz CSeq: 102 INVITE User-Agent: Asterisk PBX
Paket obsahuje SIP URI volaného hned na dvou místech: na prvním řádku paketu (SIP URI na prvním řádku se říká request URI, zkráceně RURI) a v hlavičce To. SIP URI na těchto místech se obecně mohou lišit, ale Asterisk je nastavuje stejně. Rozdíl ve významu je nad rámec tohoto seriálu. SIP URI volaného je dáno parametrem příkazu Dial a parametrem host v souboru sip.conf. Obojí musí být nastaveno tak, aby to bráně "chutnalo". Část před zavináčem může vyžadovat prefixy (jako například 420), část za zavináčem závisí kompletně na konfiguraci brány.
SIP URI volajícího je v paketu jen na jednom místě, a to na řádku s hlavičkou From. Hodnota před zavináčem se použije pro zjištění telefonního čísla volajícího. Z uvedeného příkladu paketu brána nemůže poznat telefonní číslo volajícího, protože před zavináčem je místo něj novak. Pokud by tam bylo číslo, zobrazilo by se na displeji volaného telefonu (například mobilu). Nezobrazuje-li se vám korektně číslo volajícího, je pravděpodobně nastavena špatně hlavička From. Hovor někdy projde i při chybném nastavení, někdy je naopak (celkem správně) bránou odmítnut. Právě z této hodnoty se pozná, jakému účastníkovi hovor vyúčtovat. Mnoho provozovatelů bran poskytuje podrobné vyúčtování pro jednotlivá telefonní čísla.
Ukažme si, jak lze SIP URI volajícího nastavit v dialplanu.
[internal]
exten =>200,1,Dial(SIP/novak)
exten =>201,1,Dial(SIP/cerny)
exten =>_XXXXXXXXX,1,Set(CALLERID(all)=Jan Samuel Novak <420999888200>)
exten =>_XXXXXXXXX,2,Dial(SIP/420${EXTEN}@muj_trunk)
V uvedeném příkladu příkazem Set nastavujeme proměnnou CALLERID(all). Hodnota této proměnné se použije pro nastavení občanského jména a části SIP URI, která je před zavináčem. Nastavení způsobí, že původní řádek From bude vypadat takto:
From: "Jan Samuel Novak" <sip:420999888200@mojedomena.cz>;tag=as594ea820
Nechcete-li nastavovat jméno uživatele, můžete použít jednodušší variantu
exten =>_XXXXXXXXX,1,Set(CALLERID(number)=420999888200)
Nastavíte tak jen to, co je bezprostředně před zavináčem SIP URI volajícího. Za zavináčem je vždy hodnota parametru fromdomain.
Pozorného čtenáře už jistě napadlo, že příklad pravidla pro nastavení telefonního čísla volajícího vždy nastavuje hodnotu 999888200, což je v pořádku, pokud volá ven Novák, ale Černému by mělo být nastaveno číslo 201. Asterisk umožňuje vytvořit pravidla, která se aktivují jen při volání ze zadané extension. Stačí přidat lomítko za šablonu následované jménem extension ze sip.conf.
exten =>_XXXXXXXXX/novak,1,Set(CALLERID(number)=420999888200)
exten =>_XXXXXXXXX/cerny,1,Set(CALLERID(number)=420999888201)
exten =>_XXXXXXXXX,2,Dial(SIP/420${EXTEN}@muj_trunk)
Všimněte si, že je potřeba jen jeden Dial a že má prioritu 2, ale o tom podrobněji někdy v pokračování.
Jak je vidět, změna řetězce novak před zavináčem SIP URI je relativně složitá. Nic nebrání použít jako jméno extension telefonní číslo místo jména novak. Výsledkem je o trochu méně pružná konfigurace. Budete-li chtít změnit Novákovi odchozí číslo, budete muset změnit konfiguraci uvnitř jeho telefonu. Jméno extension se používá při registraci.
Trunk s registrací
Některé brány mohou vyžadovat, aby se Asterisk registroval podobně jako telefon. V sip.conf v sekci [general] stačí přidat řádek
register => fromuser@fromdomain:secret@host
V našem případě bysme použili něco jako
register => ucetnabrane@8.8.8.1:heslo@8.8.8.2
Příkaz register má několik variant a parametry jsou opět závislé na konfiguraci konkrétní brány. (Bránou ve skutečnosti často bývá další Asterisk.) Tento jediný řádek informuje Asterisk o tom, že se má registrovat a jak se má autorizovat (autorizace je často vyžadována také při začátku hovoru). Máte-li u nějakého poskytovatele telefonní účet jen pro jeden telefon, můžete místo něj použit Asterisk. Vzdálené bráně by mělo být jedno, jestli se k ní registruje Asterisk, nebo nějaký telefon. Registrace v obou případech probíhá stejně. K Asterisku pak můžete připojit několik telefonů, které mohou sdílet telefonní číslo pro odchozí volání.
Stav registrace můžete zobrazit v konzoli Asterisku pomocí příkazu sip show registry. V případě problémů s registrací může pomoci příkaz tcpdump. Můžete se například podívat na obsah paketů s metodou REGISTER při úspěšné registraci ze softwareového telefonu a potom hledat rozdíl v požadavcích na registraci generovaných Asteriskem.
Závěr
Propojením s okolním světem se Asterisk stává zajímavým nástrojem. V příštích dílech si ukážeme další praktické možnosti této ústředny. V pátém dílu se můžete těšit na podrobný výklad o zpracování šablon.







