Konfigurace Asterisku (6) - Anonymní SIP

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ě.