V rozdílu mezi typem extension user a peer má mnoho správců nejasnosti. Může za to nedostatečná dokumentace na voip-info.org a také fakt, že odpověď vydá v podstatě na celý článek. Přitom rozdíl může podstatně ovlivnit chování Asterisku. Dnešní díl celou situaci vyjasní. K jeho přípravě bylo potřeba prozkoumat zdrojové kódy Asterisku, protože tyto informace nikde jinde na webu nenajdete.
User, peer a friend
V druhém dílu seriálu jsme v souboru sip.conf nastavili typ extension na friend pomocí parametru type. Definice extension vypadala následovně:
[novak] type=friend secret=heslonovak userid=Jan Novak <200> host=dynamic context=internal
Kromě typu friend existují ještě další dva typy: user a peer. Začneme typem peer.
Typ peer
[novak] type=peer secret=heslonovak userid=Jan Novak <200> host=dynamic context=internal
Asterisk si udržuje seznam extensions typu peer. Tento seznam můžete zobrazit na konzoli příkazem sip show peers, případně můžete Asterisk požádat o detaily pomocí příkazu sip show peer novak.
astest*CLI> sip show peers Name/username Host Dyn Nat ACL Port Status novak (Unspecified) D 0 Unmonitored 1 sip peers [Monitored: 0 online, 0 offline Unmonitored: 0 online, 1 offline] astest*CLI> sip show peer novak astest*CLI> * Name : novak Secret : <Set> MD5Secret : <Not set> Context : internal ...
U každého peeru si Asterisk pamatuje jeho IPi adresu. Adresa může být nastavena buď rovnou v konfiguračním souboru pomocí volby host (např. host=8.8.8.1), nebo může být nastavena pomocí registrace (tomu odpovídá volba host=dynamic). Pevné nastavení IP adres se používá pro zařízení typu ústředna (ústředny svoje adresy nemění a některé se ani neumí registrovat). Nastavení pomocí registrace se používá u telefonů. Najde-li Asterisk v dialplanu příkaz pro volání na nějaký peer, pošle požadavek INVITE na IP adresu peeru.
Při příchozím hovoru Asterisk může prohledat seznam peers a podle IP adresy, ze které požadavek přišel, najde odpovídající peer. Kontext peeru pak určuje konfiguraci pro zpracování hovoru (až na výjimky, viz dále).
Typ user
Změníte-li typ z peer na user, zjistíte, že Asterisk odmítá registrace, které mu telefon posílá. Volba secret, která slouží k nastavení hesla má ale pořád ještě význam. Protokol SIPi umožňuje ústředně, aby si vyžádala autorizaci jménem a heslem při začátku nového hovoru. Telefon se sice nemůže registrovat, ale pokud z něj zkusíte zavolat, hovor projde.
Asterisk má podobně jako u typu peer seznam extensions typu user:
stest*CLI> sip show users Username Secret Accountcode Def.Context ACL NAT novak heslonovak internal No RFC3581 astest*CLI> sip show user novak astest*CLI> * Name : novak Secret : <Set> MD5Secret : <Not set> Context : internal Language : ...
Oba seznamy jsou na sobě nezávislé. Jedním z podstatných rozdílů je, že u extensions typu user nejsou evidovány IP adresy. Na extension typu user nelze zavolat. Slouží jen pro příchozí hovory (příchozí z hlediska ústředny).
Neuškodí připomenout formát SIPového paketu s metodou INVITE, který se posílá při navazování nového hovoru:
INVITE sip:cerny@telegro.cz 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:cerny@telegro.cz> Contact: <sip:novak@8.8.8.1> Call-ID: 384495ac0217e43c1096153434a4b48e@mojedomena.cz CSeq: 102 INVITE User-Agent: Asterisk PBX
Při zpracování žádosti o nový hovor Asterisk vyhledá řádek s hlavičkou From: a ze SIP URIi na tomto řádku vezme jméno uživatele před zavináčem (novak). Následně hledá v seznamu extensions typu user a najde-li extension s takovým názvem, začne vyžadovat autorizaci. Proběhne-li autorizace, použije Asterisk kontext uvedený u extension (až na výjimky, viz dále). Nepodaří-li se autorizace, je hovor odmítnut.
Typ friend
Typ friend je user i peer naráz. Zapíšete-li do konfiguračního souboru typ friend, bude extension v obou seznamech. Pořadí zpracování seznamů objasníme níže. Typ friend je nejpožívanější typ pro připojení telefonů.
Volba kontextu
Jak už jsme několikrát psali, Asterisk u každého příchozího volání určí kontext. Kontext je konfigurace, podle které pak Asterisk zpracovává hovor. Výběr kontextu tak vlastně určuje jak se bude ústředna vůči hovoru chovat. Je na místě upozornit čtenáře, že chování Asterisku není ani logické, ani koncepční. Nehledejte tedy v následujícím popisu žádnou hlubokou logiku - tak to prostě je.
Asterisk při určuje kontext podle tři věcí:
- Uživatelské jméno před zavináčem z hlavičky From (
novak), - IP adresa ze které byl požadavek odeslán,
- doména za zavináčem SIP URI z prvního řádku.
Asterisk si nastaví do proměnné kontext jméno výchozího kontextu. Během zpracování požadavku může tuto hodnotu přepsat. Výsledná hodnota se použije jako kontext pro zpracování hovoru.
Asterisk nejprve vyhledá hlavičku From a zjistí jméno před zavináčem SIP URI. Potom prohledá seznam extensions typu user. Najde-li extension se stejným jménem jako jméno před zavináčem, nastaví kontext podle hodnoty z definice extension.
Není-li nalezena extension typu user, vezme Asterisk IP adresu, ze které byl přijat zpracovávaný požadavek INVITE a hledá ji v seznamu peers. Najde-li, nastaví podle nalezeného peeru kontext.
Není-li nalezen ani žádný odpovídající peer a je-li nastaveno allowguest=no, je hovor odmítnut.
Následně se Asterisk podívá na doménu za zavináčem na prvním řádku požadavku. Prohledá seznam domén a je-li nalezená doména v konfiguračním souboru v rozšířené formě domain=domena,kontext, nastaví či přepíše kontext. Tím algoritmus volby kontextu končí.
Záludnosti a vlastnosti
Vezměme si následující konfiguraci:
allowguest=yes domain=alfa.cz domain=beta.cz context=vychozi domain=gama.cz,special domain=delta.cz,special [novak] type=friend secret=heslonovak userid=Jan Novak <200> host=dynamic context=internal [cerny] type=friend secret=heslocerny userid=Jiri Cerny<201> host=dynamic context=internal
Protože typ friend je zároveň i typ user, bude extension novak v seznamu users. Tento seznam Asterisk prohledává jako první. Přijme-li Asterisk požadavek INVITE, který má v hlavičce From před zavináčem novak, bude vyžadovat autorizaci bez ohledu na doménu za zavináčem. Zavolá-li na takovou ústřednu pan Novák z firmy Něco s.r.o., přičemž požadavek na navázání hovoru bude obsahovat řádek
From: "Karel Novak" <sip:novak@neco.cz>;tag=as594ea820
ústředna bude vyžadovat autorizaci (volající pan Novák nezná heslo místního pana Nováka, hovor je tak prakticky odmítnut). Přitom vůbec nezáleží na tom, komu se snaží pan Novák dovolat. Stačí jméno novak před zavináčem. Použití typu user způsobí, že Asterisk chybně zpracuje některé požadavky na navázání hovoru! Při nastavení Asterisku pro anonymní volání z internetu doporučuji typ user buď vůbec nepoužívat, nebo aspoň pojmenovat extensions telefonními čísly, nejlépe v mezinárodním tvaru. Tím se omezí riziko konfliktu uživatelského jména volajícího se jmény user extensions.
Zavolá-li uživatel Černý na nějaké SIP URI z telefonu připojeného k naší ústředně přes extension cerny, najde ho Asterisk v seznamu user extensions a bude vyžadovat autorizaci. Telefon má v konfiguraci uložené heslo heslocerny a autorizací úspěšně projde. Následně Asterisk určí kontext výše popsaným algoritmem. Přesný výsledek závisí na tom, na jaké SIP URI pan Černý volá.
Prvním krokem je nastavení kontextu na hodnotu internal díky nalezení uživatele cerny v seznamu user extensions. Tento kontext ale může být přepsán při dalším zpracování. Záleží na doméně volaného SIP URI. Prozkoumáme seznam domén:
astest*CLI> sip show domains Our local SIP domains: Context Set by alfa.cz (default) [Configured] beta.cz (default) [Configured] gama.cz special [Configured] delta.cz special [Configured]
Při volání na cokoliv@omega.cz zůstane nastaven kontext internal, protože doménu omega.cz Asterisk nenajde v seznamu a tak hodnotu kontextu nemění.
Při volání na cokoliv@delta.cz nalezne Asterisk v seznamu domén shodu a přepíše hodnotu kontextu na special. Hovor se bude řídit konfigurací v tomto kontextu.
Jak už jsme psali výše, Asterisk přepisuje kontext jen nalezne-li doménu, která byla v sip.conf zapsána v rozšířené formě. V našem příkladu jsou to domény gama.cz a delta.cz. První dvě domény alfa.cz a beta.cz nebyly zapsány v rozšířené formě. Při volání na cokoliv@alfa.cz nedojde k přepsání kontextu, Asterisk nakonec použije dříve nastavený kontext internal.
Závěr
Dnešní díl byl velmi technický, ale odkrývá některé detaily zpracování hovorů o kterých je potřeba vědět. Příště se zaměříme na tvorbu Dialplanu. Ukážeme si proměnné a některé užitečné funkce.








Various people all over the world take the loans from different banks, because it is comfortable.
Diky za vycerpavajici studium zdrojovych kodu! Uz jsem do zdrojaku asterisku nekolikrat musel z podobnych duvodu a vim, kolik to zabere casu.. Tohle je opravdu vycerpavajici a vse vysvetlujici. Dokonce to zavani nejakym bugreportem primo na digium, ten algoritmus je opravdu nelogicky.
Diky!
Lukas