V dnešním článku si ukážeme, jak nastavit Asteriski tak, aby příjmal hovory pro SIP URIi typu sip:jan.novak@telegro.cz. Protokol SIPi se dá používat podobně jako email. To znamená, že hovory jsou příjmány přes internet prakticky od kohokoliv a jsou zdarma. Telefonní spam se zatím nevyskytuje, doporučujeme čtenářům užívat si tento stav dokud to jde.
Kontext pro volání z internetu
Hned v prvním dílu seriálu jsme se zmínili o volbě allowguest=no v souboru sip.conf. Výchozí hodnota volby allowguest je yes a podle dokumentace na www.voip-info.org umožňuje příchozí anonymní volání. Vezměme si nejjednodušší možnou konfiguraci souborů sip.conf a extensions.conf:
;sip.conf [general] allowguest=yes
;extensions.conf [default] exten => 999,1,Answer() exten => 999,n,Playback(hello-world) exten => 999,n,Hangup()
Výše uvedený příklad uvádí soubory v plném znění, nejde jen o jejich části. I tak málo stačí k rozběhnutí anonymního volání z internetu. Asterisk teď bude příjmat hovory s cílovým SIP URI sip:999@telegro.cz, a to z jakékoliv IP adresy od kohokoliv (až na výjimky). Lokální část SIP URI (tj. to co je před zavináčem) se použije jako volané číslo. Doména za zavináčem se v této nejjednodušší konfiguraci ignoruje. Jak už jsme v seriálu psali, každému příchozímu hovoru je přiřazen kontext, který určuje, jaká část konfiguračního souboru extensions.conf se použije. Jméno kontextu se obvykle nastavuje v souboru sip.conf (viz dále). Pokud tam není nastaveno, použije se kontext default.
Speciální kontext pro příchozí anonymní hovory je velmi užitečný nástroj pro zabezpečení Asterisku. V kontextu default se provádí většinou jen přepojení hovorů na místní telefony. Přeposílat anonymní hovory dál do internetu může být nebezpečné (někdo by například mohl přes vaši ústřednu ohlásit bombu). Propojení hovorů do placené PSTNi do kontextu default už vůbec nepatří.
Kontext, který se použije pro zpracování příchozích anonymních hovorů, lze nastavit pomocí volby context.
;sip.conf [general] allowguest=yes context=wild_internet
;extensions.conf [wild_internet] exten => 999,1,Answer() exten => 999,n,Playback(hello-world) exten => 999,n,Hangup()
Volba context neovlivňuje jen příchozí anonymní hovory, její hodnota se používá všude tam, kde by jinak žádný kontext nebyl nastaven.
;sip.conf [general] allowguest=yes context=wild_internet [novak] type=friend secret=heslonovak userid=Jan Novak <200> host=dynamic [cerny] type=friend secret=heslocerny userid=Jiri Cerny <201> host=dynamic context=internal
Extension novak nemá volbu context a proto se použije výchozí hodnota nastavená na wild_internet. U extension cerny se použije kontext internal. O tom, jaké mají SIP extensions přiděleny kontexty, se můžete přesvědčit pomocí konzolového příkazu sip show peer:
sip show peer novak astest*CLI> sip show peer novak astest*CLI> * Name : novak Secret : <Set> MD5Secret : <Not set> Context : wild_internet ...
Obsluha domén
Uvedené příklady mají jeden nedostatek. Takto nakonfigurovaný Asterisk ignoruje doménovou část SIP URI na které je voláno, každou doménu považuje za svou. Je to vidět i při zadání konzolového příkazu sip show settings:
astest*CLI> sip show settings astest*CLI> Global Settings: ---------------- SIP Port: 5060 ... SIP domain support: No ...
Situaci lze změnit volbou domain.
;sip.conf [general] allowguest=yes context=wild_internet domain=telegro.cz [cerny] type=friend secret=heslocerny userid=Jiri Cerny <201> host=dynamic context=internal
Po nastavení domény začne Asterisk vyžadovat za zavináčem doménu telegro.cz. Týká se to nejen volaných SIP URI, ale i požadavků na registraci. Telefon při registraci posílá SIP URI a pokud není za zavináčem telegro.cz, Asterisk registraci odmítne. Hodnota domain by měla být stejná jako doména nastavená v telefonu. Změnou tohoto parametru můžete prakticky odpojit všechny telefony, opatrnost je na místě.
Asterisk může obsloužit více domén a každá z nich může mít přiřazen vlastní kontext. K tomu slouží rozšířená forma volby domain=domena,kontext.
;sip.conf [general] allowguest=yes context=wild_internet domain=telegro.cz,telegro domain=sip.telegro.cz,telegro domain=skymia.cz,skymia [novak] type=friend secret=heslonovak userid=Jan Novak <200> host=dynamic [cerny] type=friend secret=heslocerny userid=Jiri Cerny <201> host=dynamic context=internal
Všimněte si, že kontext telegro je v konfiguraci vícekrát. Různé domény mohou sdílet jeden kontext. Výsledek zpracování konfiguračního souboru lze přehledně zobrazit pomocí konzolového příkazu sip show domains:
astest*CLI> sip show domains Our local SIP domains: Context Set by telegro.cz telegro [Configured] sip.telegro.cz telegro [Configured] skymia.cz skymia [Configured]
Konfiguraci domén můžeme otestovat například na tomto souboru extensions.conf:
[wild_internet] exten => 999,1,NoOp(wild_internet) exten => 999,n,Hangup() [telegro] exten => jan.novak,1,Dial(SIP/novak) exten => 999,1,NoOp(telegro) exten => 999,n,Hangup() [skymia] exten => 999,1,NoOp(skymia) exten => 999,n,Hangup()
Anonymní volání (například z neregistrovaného telefonu - situace je složitější, viz závěrečný odstavec článku) na sip:999@telegro.cz nebo sip:999@sip.telegro.cz bude zpracováváno podle pravidel v kontextu [telegro]. Obdobně je to s doménou skymia.cz. Ostatní domény (například sip.skymia.cz) budou zpracovány podle výchozího kontextu [wild_internet]. Rozšířenou formu volby domain lze kombinovat s její jednodušší variantou:
;sip.conf [general] allowguest=yes context=wild_internet domain=telegro.cz domain=skymia.cz,skymia
Při nastavení domén podle tohoto příkladu musí mít všechny příchozí hovory cílovou doménu buď telegro.cz, nebo skymia.cz. V prvním případě budou zpracováný podle kontextu wild_internet, v druhém podle kontextu skymia.
Jak už bylo zdůrazněno, volba domain ovlivňuje konfiguraci telefonů. Je-li nastaveno více domén, může být za zavináčem SIP URI v registračním požadavku kterákoliv doména, tj. v našem posledním příkladu telegro.cz, skymia.cz nebo skymia.com.
Pravidla pro volbu kontextu
Volá-li účastník z registrovaného telefonu, určí se kontext podle volby context u jeho extension v sip.conf (pokud chybí, použije se výchozí kontext). V tomto případě Asterisk určuje kontext podle toho kdo volá. Pokud přichází anonymní hovor z internetu (z neregistrovaného telefonu), určuje Asterisk kontext podle domény cílového URI. To znamená, že ho určuje podle toho komu je voláno. V některých případech může dojít ke konfliktu:
;sip.conf [general] allowguest=yes context=wild_internet domain=telegro.cz [cerny] type=friend secret=heslocerny userid=Jiri Cerny <201> host=dynamic context=internal
Zavolá-li účastník Černý na SIP URI sip:999@telegro.cz, nastane konflikt mezi kontexty internal a wild_internet. Asterisk dá přednost kontextu internal, který je nastavený u extension. Hovor bude zpracován podle pravidel v kontextu internal. Kam nakonec bude směřovat volání je dáno pravidly tohoto kontextu, které odpovídají telefonnímu číslu 999. Je jen na správci Asterisku, jestli s ním bude naloženo stejně jako při anonymním volání na sip:999@telegro.cz.
Pravidla pro volbu kontextu jsou komplikovaná a zároveň důležitá pro praktické použití. U extensions totiž záleží na typu (friend nebo peer). Při rozhodování o anonymitě příchozího volání se bere v úvahu i SIP URI volajícího a ne jen zda byla z jeho IP adresy provedena registrace. Přiřadí-li Asterisk příchozí volání nějaké extensions a nepovažuje ho za anonymní, začne vyžadovat autorizaci. V tomto dílu už není místo, tématu se budeme věnovat někdy příště.







