Asterisk

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
a
a
293. sor: 293. sor:
 
* [http://voip-info.org/wiki/ VoIP Info] - igen hasznos wiki
 
* [http://voip-info.org/wiki/ VoIP Info] - igen hasznos wiki
 
* [http://voipspeak.net VoIPSpeak.net] - van itt egy tutorial a VoIP gateway-hez, na ennek NE higgyünk!
 
* [http://voipspeak.net VoIPSpeak.net] - van itt egy tutorial a VoIP gateway-hez, na ennek NE higgyünk!
  +
  +
--Makár János Zénó

A lap 2007. december 28., 21:12-kori változata

Az Asterisk egy nyílt forrású szoftveres alközpont. A megfelelő hardverrel képes pl. primer ISDN trönk kezelésére is, de most csak VoIP használatra térünk ki. Támogatja többek közt a két legelterjedtebb, a SIP és a H.323 protokollokat, illetve az Asterisk fejlesztői készítettek egy új protokollt is, az Inter-Asterisk eXchange-t.

Tartalomjegyzék

1 Az Asterisk telepítése

Lehet fordítani is, de csomagból is felrakhatjuk. A részletekbe nem mennék bele, mindenki használt már apt-get -et vagy make-et. A szükséges csomagok:

  • asterisk
  • asterisk-sounds
  • libpri

valamint ha nem csak VoIP-t szeretnénk, vagy időzítés szükséges hardveresen (pl. a MeetMe konferenciához), és van is megfelelő hardverünk, akkor szükségesek még:

  • zaptel
  • libzap1.

2 A konfiguráció

2.1 A konfigurációs fájlok

A szintaxisról:

  • szekciók megjelölése: [szekció neve]
  • megjegyzések: ";" után
  • értékadás: "="
  • további fájlok figyelembe vétele: #include "filename.conf"
  • változók értékeire hivatkozás: ${változó_neve}
  • valamint használatos sok esetben a "=>", pl. egy dial plan kialakításakor (ha valaki meg tudja szépen fogalmazni a célját, ne habozzon :))

A továbbiakban áttekintjük a fontosabb konfigurációs fájlokat.

2.1.1 /etc/asterisk/modules.conf

Sokan elhanyagolják ennek megfelelő beállítását, ami nagy hiba: pár stabilitási problémát ki lehet küszöbölni, ha csak a szükséges modulokat töltjük be, pl. ha csak SIP-et használunk, ne töltsük be feleslegesen a chan_h323.so-t, a chan_iax.so -t. Fontos lehet még kiszedni a nem használt modulokat, ha a PBX-ünket mondjuk egy OpenWRT-s routeren akarjuk kialakítani.

  • egy szekció: [modules]
  • egy beállítható paraméter: autoload=no; érdemes no-n hagyni a fent említettek miatt
  • három utasítás:
    • load => chan_sip.so ; modul betöltése
    • noload => chan_h323.so ; modul kihagyása
    • preload => res_odbc.so ; modul betöltése az asterisk core inicializálása előtt - ritkán van rá szükség.

Milyen modulokat is lehet betölteni?

  • források (resources), pl. res_musiconhold.so, általában külön konfigurációs fájllal rendelkeznek
  • alkalmazások, pl. app_dial.so, a dial plan -ben használt utasítások
  • adatbázis csatolók, pl. cdr_psql.so, ha a hívások adatait nem plain text-ben akarjuk tárolni
  • csatorna kezelő modulok, pl. chan_sip.so
  • codec-ek, pl. codec_ulaw.so
  • formátumok, pl. format_wav.so, hasonló a codec-hez, csak nem live media stream-hez, hanem fájlokhoz
  • PBX core modulok, pl. pbx_config.so
  • egyedülálló funkciók, pl. func_callerid.so, megvan a pdb_functions.so -ban is, de ha nem akarjuk az egészet betölteni, mert pl. egy kevés memóriával rendelkező vason fut az Asteriskünk

2.1.2 /etc/asterisk/sip.conf

A csatorna általános jellemzőinek beállítását és a SIP csatornák felvételét oldjuk meg itt. Az általános beállítások:

  • a [general] részben
  • IPcím, port: bindaddr, bindport
  • külső IP cím (NAT esetén fontos): externip
  • helyi hálózati tartomány: localnet (ha van NAT is, akkor kell, hogy mikor használja az externip-t a SIP fejlécben)
  • vendégek beengedése: allowguest (lényegében az, hogy legyen-e autentikáció, de figyeljünk oda, vannak kliensek, amik nem támogatják az autentikációt, ekkor allowguest=yes legyen)
  • hívás előzmények rögzítése: recordhistory
  • videó hívás támogatása: videosupport (csak két végpont között, a videó konferencia még nem támogatott)

Egy csatorna (és itt ez lényegében egy kliens, végpont) felvétele:

  • [SIP név] szekció
  • típus: type={friend, user, peer} - a user csak bejövő, a peer csak kimenő, a friend pedig két irányú csatornát jelöl
  • használt/nem használt codec-ek: allow, disallow
  • csoportok: callgroup, pickupgroup, segítségükkel az adott csoportba tartozó csatornák válaszolhatnak a többi csoporttagnak szóló hívásra (felvehetik)
  • melyik dial plan vonatkozzon a csatornára: context
  • IP cím, port: host={IP vagy "dynamic"}, port=5060
  • NAT mögött van-e a kliens: nat=yes/no
  • felhasználói név, jelszó: username, secret

Egyes opciók, mind pl. a recordhistory beállítható csatornánként is.

2.1.3 /etc/asterisk/extensions.conf

Itt definiálhatjuk a fentebb már emlegetett dial plan-eket. Mik is ezek? Megmondják, hogy mi történjen, ha pl. hívnak egy számot, vagy éppen csak egy gombot megnyomnak a telefonon, pl. ha tárcsázzák a 123-at, akkor csörögjön ki az egyik SIP kliensen, vagy ha a 100-at, akkor egy kellemes női hang mondja be, hogy nyomják meg az 1es gombot az első mellékhez stb.

  • [general] rész: pár általános beállítás, kettő fontos
    • static=yes
    • writeprotect=no - ezzel a két beállítással CLI-ből is menthetjük a dial plant a "save dialplan" paranccsal.
  • [globals] rész: globális változó definíciók
  • [context] - a konkrét dial plan-ek, ezekre hivatkozhatunk a csatornák beállításainál
    • formája: exten => név/szám, prioritás, alkalmazás
    • a start kiterjesztés: ha a név helyére s-t írunk, akkor a konkrét cím nélküli hívásokat kezeljük (pl. egy csörgő telefonvonal esetén)
    • név helyett még lehet minta is, ez "_"-al kezdődik, és a következő speciális karaktereket tartalmazhatja:
      • X : 0-9 számjegyek
      • Z : 1-9 számjegyek
      • N : 2-9 számjegyek
      • [] -ek között tartományokat adhatunk meg, pl. [14-6] az 1,4,5,6 számokra érvényes
      • .() - joker, több karaktert vesz figyelembe.
    • prioritás: meghatározzák az alkalmazások lefutásának sorrendjét, egyben címkék is a Goto-hoz. 1-el kezdődően egyesével növekedve kell lenniük (de lehetnek kivételek, pl. Goto-val, vagy egyes parancsok hiba esetén úgy térnek vissza, hogy mondjuk az n+101. prioritásra ugranak); valamint szám helyett írhatunk "n"-et, ekkor ezt 1-el nagyobbnak értelmezi az előző prioritásnál, és ha egy új sort be akarunk szúrni a hívás tervbe, akkor nem kell az összes sorszámot átírni.
    • alkalmazás: megmondja, hogy mit is csináljon, ha hívják a számot
  • pár alkalmazás:
    • Dial(hívott(ak), [timeout], [flag-ek]), hasznosabb flag-ek:
      • t illetve T: hívás átirányítás illetve átadás engedélyezése (# gomb hatására)
      • w illetve W: hívás rögzítésének engedélyezése
      • M(x[^argumentumok]) : x makró futtatása kapcsolódáskor
      • a Dial alkalmazás kilépéskor állítja a következő változók értékét:
        • DIALEDTIME : a Dial meghívásától a kilépéséig eltelt idő
        • ANSWEREDTIME : magának a hívásnak az időtartama
        • DIALSTATUS : a hívás státusza, lehet: CHANUNAVAIL, CONGESTION, BUSY, NOANSWER, ANSWER, CANCEL.
    • Echo() : hangminőség tesztelésére jó, visszajátsza a fogadott hangot, a hívó #-el kiléphet.
    • Answer() : válaszol a hívásra csörgő csatornán
    • Ringing() : kicsengés kezdeményezése egy csatornán (a csatornától függ a kicsengés módja)
    • Playback(fájlnév, [opciók]) : lejátszik egy adott fájlt, opcióként megadható, hogy csak akkor játssza le, ha már válaszoltak a hívásra
    • Background(fájlnév, [opciók]) : mint a Playback, azzal a különbséggel, hogy ha a hívó fél folyatja a tárcsázást, a lejátszás megáll
    • Hangup() : megszakítja a hívást az adott csatornán
    • Goto(cím) : az adott címre ugrik a dial plan-ben; a cím lehet prioritás az adott exten-en belül, lehet más extenben az adott context-en belül, de lehet más context-ben is
    • GotoIf(feltétel?cím1:cím2) : ha a feltétel teljesül, a prioritás1 következik, egyébként a prioritás2
    • System(cmd) : program végrehajtása (Asterisk-en kívül)
    • Queue(sor neve, [opciók]) : a queues.conf-ban meghatározott sorba állítja a bejövő hívásokat
    • Busy(), Congestion() : foglalt illetve minden vonal foglalt jelzést küld
    • Monitor,MixMonitor (fájlnév, [opciók]) : hívás rögzítését teszi lehetővé, a Monitor a két irányt külön fájlokba, a MixMonitor a két irányt összekeverve egy fájlba rögzít
    • NoOP(akármi) : kiírja az akármit a parancssorra

2.1.4 /etc/asterisk/queues.conf

Ebben a fájlban állíthatjuk be azt, hogy mi történjen, ha épp foglalt minden hívott fél és a hívónak várakoznia kell. Ehhez hívás sorokat csinálunk, melyekbe tagokat veszünk fel (ezek a kliensek), és meghatározzuk, hogy milyen sorrendben csörögjenek ki, vagy éppen azt, hogy egyszerre minden kliensnél csörögjön ki a hívás, stb.

  • itt is van egy [general] rész, melynek beállításai az összes sorra vonatkoznak
  • az egyes sorokat külön szekciókban definiáljuk
  • musiconhold : zene lejátszása várakozás alatt - a részleteit a musiconhold.conf -ban állíthatjuk be
  • announce : jelzés a hívottnak kicsörgés előtt, bonyolultabb esetben, amikor egy kliens több sornak is tagja hasznos lehet, hogy tudja, melyik sorból jön a hívás
  • strategy - milyen stratégia szerint csörögjön ki:
    • ringall : minden tagnál csörögjön ki
    • roundrobin : az első tagtól kezdve próbálgat sorban, amíg szabad tagot nem talál
    • leastrecent : a legrégebben hívott tag kapja a hívást
    • fewestcalls : a legkevesebb hívást kapott tagra kerül a sor
    • radnom : véletlenszerűen választ
    • rrmemory : round-robin memóriával, ott kezdi a próbálgatást, ahol előzőleg abbahagyta
  • timeout : mennyi ideig csörgessen egy klienst, mielőtt visszarakná a hívást a sorba
  • monitor-format : a sor minden hívásra rögzítésre kerül az adott formában (Monitor-t használ, tehát külön fájlokban lesznek a hangsávok)
  • monitor-join : hívás után összemixeli a sávokat egy fájlba
  • member => tag_neve : így vehetünk fel klienseket (ahol végződik a hívás) a sorba
  • wrapuptime : egy hívás befejezte után mennyi ideig ne adjon új hívást a sor tagjának (ms-ban)

2.2 Alternatív konfiguráció: CLI

Ha az asterisk-et nem démonként indítjuk (argumentumok nélkül), hanem mondjuk a "-vvvgc" kapcsolóval, akkor az asterisk beépített parancssoros kezelőfelületéhez jutunk. Rengeteg beállítást itt is el tudunk végezni, ennek előnye, ha valamilyen új funkciót először le akarunk tesztelni, nem kell külön újraindítgatni az asterisket minden kis módosítás után, tehát azonnal láthatjuk az eredményt.

  • add: a konfigurációs fájlok szerkesztése nélkül vehetünk fel extension-öket vagy queue tagokat:
    • add extension ext.szám, prioritas, alkalmazas, parameterek into context
    • add queue member tag_neve to sor_neve
  • használhatjuk az Asterisk-et futtató gépet is telefonálásra (ehhez szükséges a chan_oss.so modul):
    • answer - hívás felvétele
    • dial - hívás
  • tölthetünk be modulokat futás közben: load modulneve.so, illetve újraolvashatjuk a reload-dal, valamint el is távolíthatjuk őket: unload
  • remove: az add-dal ellentétesen eltávolíthatunk extension-öket vagy sorokból tagokat
  • restart: minden csatornát lezár, minden modult újraolvas
    • restart gracefully : nem fogad több hívást, majd ha minden meglévő hívás lezárult, újraindul
    • restart now : azonnal újraindul, megszakítja a hívásokat
    • restart when convenient : fogad hívásokat, csak akkor indul újra, amikor éppen egy hívás sincs
  • show : lekérdezhetünk rengeteg dolgot, pl. show queues, show dialplan, show channels, show modules
  • stop: leállítás, paraméterei mint a restart-nál
  • sip history: sip előzmények be- illetve kikapcsolása
  • sip show: itt is rengeteg lehetőség van, pl. sip show channel, sip show user
  • save dialplan: ha módosítottunk rajta, így lehet elmenteni
  • a legfontosabb: help

3 Sipura VoIP gateway

Ha nem akarunk ISDN kártyával foglalkozni/nincs ilyenünk mert drága, és mégis akarjuk használni a telefonvonalat, akkor vehetünk egy VoIP gateway-t. A következőkben megnézzük, hogyan lehet egy Asterisk-el együtt működésre bírni egy ilyen eszközt.

3.1 A gateway beállítása

  • Router/wan setup -ban: külső ip, elérhessük-e a WAN-on keresztül, stb; ha el szeretnénk érni, akkor az admin jelszót feltétlen állítsuk be a Voice/System -ben, különben könnyen szórakozhatnak velünk az unatkozó gonosz hackerek, és ne csináljanak jó nagy telefonszámlát, ha rákeresnek google-el a következőre: "linksys spa configuration inurl:admin/advanced" (meglepő, hogy milyen sok találatot ad); mégjobb, ha nem elérhető WAN felől a webes felület. Az egyszerűség kedvéért csináljuk úgy, hogy a WAN portján csatlakozik csak hálózathoz, így a WAN ip-t kell majd beállítani az Asterisk-ben is.
  • A többi szükséges beállítást a Voice/PSTN Line alatt érhetjük el:
    • Proxy and Registration:
      • proxy: az Asterisk IP-je
      • Use Outbound Proxy: no
      • Register: no
      • Make Call Without Reg: yes
      • ans Call Without Reg: yes
    • Dial Plans: az egyiket allitsuk be a következőre (mondjuk a 8ast): (S0<: 123@AsteriskIPje:5060>)
    • VoIP-To-PSTN Gateway
      • VoIP-To-PSTN Gateway Enable: yes
      • One Stage Dialing: Yes
      • VoIP Caller Auth Method: None
      • VoIP Caller Default DP: 1 - ne az legyen, amelyikre az Asterisket beírtuk fentebb
    • PSTN-To-VOIP Gateway
      • PSTN-To-VOIP Gateway Enable: yes
      • PSTN Ring Thru Line 1: No
      • PSTN Caller Default DP: 8 - amelyikre beállítottuk az Asterisket
      • Off Hook While Calling VoIP: Yes
      • PSTN Caller Auth Method: none

3.2 Az Asterisk beállítása

3.2.1 sip.conf

  • a neve legyen mondjuk [sipura]
  • egy friend-et kell felvennünk (egyes leírások egy peer + egy user -el ajánlják, de szerintem az felesleges). - type=friend
  • host=192.168.1.10 - vagy amit beállítottunk
  • port=5060 (a default, a lényeg, hogy ellenőrizzük a Sipura beállításainál is a dolgot a Voice/SIP és a Voice/PSTN line alatt)
  • codec beállítások: disallow=all, allow=ulaw, az eszköz csak ezt szereti
  • nat=no
  • insecure=very - ne kelljen autentikálnia
  • qualify=yes - periodikusan ellenőrizze, hogy elérhető-e a gateway
  • canreinvite=no - az Asterisk-en át menjenek az RTP csomagok
  • és mondjuk context=pstn

3.2.2 extensions.conf

Legalább két féle extension-t kell kezelnünk. A kimenő context esetén a dial hívott paramétere legyen SIP/${EXTEN}@sipura, ezzel átadtuk a hívott számot is. Értelem szerűen több kimenő is lehet, bejövő viszont csak egy: az a szám, amit megadtunk az eszköz beállításainál a DialPlans-ben, tehát mondjuk 123.

3.3 Mire figyeljünk oda?

A fent leírtak elégségesek a működéshez, viszont érdemes megfontolni pár dolgot:

  • Kell tudnunk, hogy milyen számról jön a hívás? Ha nem, akkor a VoIP gateway beállításainál kapcsoljuk ki a Voice/PSTN line/PSTN to VoIP -ban a PSTN CID For VoIP CID -t, mert ez egy 2-3mp-es késleltetést ad a kicsörgéshez

3.4 Egy összetett példa

Adott a feladat: csináljunk call centert. Van 2 vonal, ebből az egyiknek vezetékes számokra jók a percdíjai, a másiknak mobil számokra (pl. egy VoIP gateway GSM adapteren lóg, a másik a telefon vonalon), és lehetőleg próbáljunk olcsóért telefonálni. A call centerben van 2 SIP kliens, bejövő hívások csörögjenek ki mindenhol, valamint minden kimenő hívást rögzítsünk. A VoIP gateway-ek beállítása a fentieknek megfelelően történik, az IP címek legyenek 192.168.1.10 illetve 192.168.1.11.

  • sip.conf:
[general]
disallow=all
allow=ulaw
canreinvite=no
nat=no
recordhistory=yes
qualify=yes

[gsm]
type=friend
host=192.168.1.10
insecure=very
context=kintrol

[isdn]
type=friend
host=192.168.1.11
insecure=very
context=kintrol

[callcenter1]
type=friend
secret=titok1
host=dynamic
context=bentrol

[callcenter2]
type=friend
secret=titok2
host=dynamic
context=bentrol
  • extensions.conf:
[general]
static=yes
writeprotect=no

[kintrol]
exten => 123,1,NoOP(${CALLERID})
exten => 123,n,Ringing
exten => 123,n,Queue(kliensek)
exten => 123,n,Answer
exten => 123,n,Hangup

[bentrol]
;emeltdijast ne hivjanak:
exten => _0690XXXXXX,1,Hangup
exten => _0681XXXXXX,1,Hangup

; mobilt:
exten => _06[237]0XXXXXXX,1,MixMonitor(/ahovamentenikell/${CALLERID}-${TIMESTAMP}.wav)
exten => _06[237]0XXXXXXX,2,Ringing
exten => _06[237]0XXXXXXX,3,Dial(SIP/${EXTEN@gsm,60})
exten => _06[237]0XXXXXXX,4,GotoIf($[${DIALSTATUS}=CHANNELUNAVAIL]?:5)
exten => _06[237]0XXXXXXX,5,Dial(SIP/${EXTEN@isdn,60})
exten => _06[237]0XXXXXXX,6,Hangup

;vezetekest:
exten => _06XXXXXXXX,1,MixMonitor(/ahovamentenikell/${CALLERID}-${TIMESTAMP}.wav)
exten => _06XXXXXXXX,2,Ringing
exten => _06XXXXXXXX,3,Dial(SIP/${EXTEN@isdn,60})
exten => _06XXXXXXXX,4,GotoIf($[${DIALSTATUS}=CHANNELUNAVAIL]?:5)
exten => _06XXXXXXXX,5,Dial(SIP/${EXTEN@gms,60})
exten => _06XXXXXXXX,6,Hangup
  • queues.conf:
[kliensek]
timeout=15
retry=3
wrapuptime=1000
strategy=ringall
member => sip/callcenter1
member => sip/callcenter2
  • a teljesség kedvéért: modules.conf:
[modules]
autoload=no

load => chan_sip.so
load => res_features.so
load => res_monitor.so
load => res_musiconhold.so
load => app_queue.so
load => app_mixmonitor.so
load => app_dial.so
load => codec_ulaw.so
load => format_wav.so
load => pbx_config.so
load => pbx_functions.so

4 Ajánlott irodalom

--Makár János Zénó

Személyes eszközök