HOWTO: ASTERISK ALS SIP-TELEFONANLAGE MIT SIPGATE UND T-ONLINE


In diesem Beitrag beschreibe ich, wie man unter Debian einen Asterisk-Server für SIP mit einem SIP-Telefon einrichtet.

Meine neue “Telefonanlage” hat folgende Features:
– SIP-Provider: Sipgate und 1und1 (unterschiedliches Routing möglich: eingehende Anrufe über 1und1 und Sipgate (Sipgate plus mit 3 Durchwahlen), ausgehende default über 1und1 wg. Phoneflat), Provider sind beliebig erweiterbar
– ein SIP-Client, beliebig erweiterbar
– Anzeige der SIP-”Quelle” im SIP-Client (Privat, 1und1, Büro, …) über die CallerID
– Voicemail (Anrufbeantworter) mit Blacklist (nicht jeder Anrufer soll den Anrufbeantworter nutzen können) und Mailbenachrichtigung inkl. Nachricht als WAV im Anhang
– DND-Mode (Klingelsperre) mit Whitelist (manche Anrufer sollen auch bei gesetztem DND-Mode anrufen können -> “VIPs”)
– Wartemusik (MP3)
– Interne Nummern:

1: Voicemail
2: Echotest
3: Nummernansage
4: Uhr
5: DND aktivieren/deaktivieren

Die Motivation war, die Features, die ich mit meiner Fritz!Box habe, für ein SIP-WLAN-Telefon (z.B. Siemens Gigaset SL75 WLAN) nachzubilden, da dieses nur einen SIP-Provider unterstützt.

Die Einarbeitung in Asterisk war ein ziemlicher Krampf aber nun funktioniert alles. Diese Sites waren mir u.a. dabei behilflich.

Routing eingehender Anrufe

Unter Debian gestaltet sich die Installation mal wieder äußerst umkompliziert: Die Pakete asterisk asterisk-classic asterisk-config asterisk-prompt-de asterisk-sounds-main asterisk-sounds-extra werden mittels apt-get install installiert.

Die sip.conf sieht aus wie folgt. In dieser Datei werden sowohl die SIP-Provider (register) als auch die Clients (type=friend) definiert.

[general]
srvlookup=yes
port = 5060
bindaddr = 12.34.56.78 ;IP-Adresse des Asterisk eintragen
language=de
register => 1234567e0:geheim@sipgate.de/1234567e0
register => 1234567e1:geheim@sipgate.de/1234567e1
register => 1234567e2:geheim@sipgate.de/1234567e2
register => 4912345678:geheim@sip.1und1.de/4912345678
context=sip-incoming

disallow=all ; First disallow all codecs
allow=ulaw
allow=alaw ; Allow codecs in order of
allow=gsm
;allow=ilbc ; preference
; allow=h261

[101]
type=friend
secret=geheim
qualify=yes ; Qualify peer is not more than 2000 mS away
nat=yes ; This phone is natted
host=dynamic ; This device registers with us
canreinvite=no ; Asterisk by default tries to redirect
context=home

[1234567e0]
type=peer
username=1234567e0
fromuser=1234567e0
secret=geheim
host=sipgate.de
fromdomain=sipgate.de
insecure=very
caninvite=no
canreinvite=no
nat=no

[1234567e1]
type=peer
username=1234567e1
fromuser=1234567e1
secret=geheim
host=sipgate.de
fromdomain=sipgate.de
insecure=very
caninvite=no
canreinvite=no
nat=no

[1234567e2]
type=peer
username=1234567e2
fromuser=1234567e2
secret=geheim
host=sipgate.de
fromdomain=sipgate.de
insecure=very
caninvite=no
canreinvite=no
nat=no

[4912345678]
type=peer
username=4912345678
fromuser=4912345678
secret=geheim
host=1und1.de
fromdomain=1und1.de
insecure=very
caninvite=no
canreinvite=no
nat=no

Der Datei voicemail.conf folgendes hinzufügen (1234 ist die PIN, Name der Name des Inhabers und name@email.de seine Email-Adresse, an die die Benachrichtigung verschickt wird):

; mailboxes
[default]
101 => 1234,Name,name@email.de

Die extensions.conf sieht aus wie folgt. Hiermit wird der in der Grafik veranschaulichte “dialplan” abgebildet.
[globals]
phone1 = SIP/101 ; standard phone
callduration = 30 ; standard calling duration in seconds

[home]
; sip phone
exten => 101,1,Dial(SIP/101)

; ext 1: Voicemail
exten => 1,1,Answer()
exten => 1,n,Wait(2)
exten => 1,n,VoiceMailMain(s${CALLERIDNUM})
exten => 1,n,Hangup

; ext 2: echotest
exten => 2,1,Answer()
exten => 2,n,Wait(2)
exten => 2,n,Playback(demo-echotest) ; Let them know what
exten => 2,n,Echo() ; Do the echo test
exten => 2,n,Playback(demo-echodone) ; Let them know it
exten => 2,n,Hangup()

; ext 3: test number
exten => 3,1,Answer
exten => 3,n,Wait(2)
exten => 3,n,SayDigits(${CALLERIDNUM})
exten => 3,n,MusicOnHold()
exten => 3,n,Hangup

; ext 4: the speaking clock
exten => 4,1,Answer
exten => 4,n,Wait(2)
exten => 4,n,SayUnixTime( | | k)
exten => 4,n,SayUnixTime( | | M)
;exten => 4,n,Playback(vm-and)
;exten => 4,n,SayUnixTime( | | S)
;exten => 4,n,Playback(seconds)
exten => 4,n,Hangup

; ext 5: enable/disable DND mode
exten => 5,1,Answer
exten => 5,n,Wait(2)
exten => 5,n,Macro(DND)
exten => 5,n,Hangup

; ————————————————————————————————
; my dialplan
; standard without area code is routed via sipgate
exten => _X.,1,SetCallerId,1234567e0
exten => _X.,n,Dial(SIP/${EXTEN}@1234567e0)
exten => _X.,n,Hangup

; with area code routed via 1und1
exten => _0X.,1,SetCallerId,4912345678
exten => _0X.,n,Dial(SIP/${EXTEN}@4912345678)
exten => _0X.,n,Hangup

; direct provider selection
; example: select sipgate by dialing 1*THENUMBER
exten => _1*,1,SetCallerId,1234567e0
exten => _1*,n,Dial(SIP/${EXTEN:2}@1234567e0)
exten => _1*,n,playback(invalid)
exten => _1*,n,Hangup
;…
; ————————————————————————————————

[macro-DND]
exten => s,1,GotoIf(${DB_EXISTS(DND/${CALLERID(num)})}?disable-dnd|1)
exten => s,n,Set(DB(DND/${CALLERID(num)})=1) ;There was no entry on AstDB, so We active your DND
exten => s,n,playback(do-not-disturb)
exten => s,n,playback(activated)
exten => s,n,hangup
exten => disable-dnd,1,DBdel(DND/${CALLERID(num)}) ; You are disabling your DND
exten => disable-dnd,n,Wait(2)
exten => disable-dnd,n,playback(do-not-disturb)
exten => disable-dnd,n,playback(de-activated)
exten => disable-dnd,n,hangup
exten => h,1,hangup

; ————————————————————————————————
; default context for incoming SIP calls

[sip-incoming]
; sipgate 0
exten => 1234567e0,1,NoOp(Incoming call on sipgate.de 0)
exten => 1234567e0,n,Ringing
exten => 1234567e0,n,Wait(1)
exten => 1234567e0,n,SetCallerID(„Privat: ${CALLERIDNUM}“ < ${CALLERIDNUM}>)
exten => 1234567e0,n,Goto(dial-sip,1)

; sipgate 1
exten => 1234567e1,1,NoOp(Incoming call on sipgate.de 1)
exten => 1234567e1,n,Ringing
exten => 1234567e1,n,Wait(1)
exten => 1234567e1,n,SetCallerID(„Buero: ${CALLERIDNUM}“ < ${CALLERIDNUM}>)
exten => 1234567e1,n,Goto(dial-sip,1)

; sipgate 2
exten => 1234567e2,1,NoOp(Incoming call on sipgate.de 2)
exten => 1234567e2,n,Ringing
exten => 1234567e2,n,Wait(1)
exten => 1234567e2,n,SetCallerID(„Spam: ${CALLERIDNUM}“ < ${CALLERIDNUM}>)
exten => 1234567e2,n,Goto(dial-sip,1)

; 1und1
exten => 4912345678,1,NoOp(Incoming call on 1und1)
exten => 4912345678,n,Ringing
exten => 4912345678,n,Wait(1)
exten => 4912345678,n,SetCallerID(„1und1: ${CALLERIDNUM}“ < ${CALLERIDNUM}>)
exten => 4912345678,n,Goto(dial-sip,1)

; ————————————————————————————————
; call diversion (may user use mailbox?)
; following callers must _not_ use mailbox, phone should ring forever

; mobile
exten => dial-sip,1,GotoIf($[„${CALLERIDNUM}“ = „01712345678“]?dial-sip-nomailbox,1)

; anonymous callers
exten => dial-sip,n,GotoIf($[„${CALLERIDNUM}“ = „“]?dial-sip-nomailbox,1)
exten => dial-sip,n,GotoIf($[„${CALLERIDNUM}“ = „Unknown“]?dial-sip-nomailbox,1)
exten => dial-sip,n,GotoIf($[„${CALLERIDNUM}“ = „Anonymous“]?dial-sip-nomailbox,1)

; ————————————————————————————————
; all others _may use_ mailbox
exten => dial-sip,n,GotoIf(${DB_EXISTS(DND/101)}?DND-ON,1)
exten => dial-sip,n,Dial(${PHONE1},${CALLDURATION},t)
exten => dial-sip,n,Goto(s-${DIALSTATUS},1)

; we are busy
exten => s-BUSY,1,Voicemail(b101)
exten => s-BUSY,n,hangup

; other status
exten => _s-.,1,Voicemail(u101)
exten => _s-.,n,hangup

; DND is on
exten => DND-ON,1,Goto(_s-.,1) ; goto voicemail (unavailable message)
exten => h,1,hangup

; ————————————————————————————————
; dial: no mailbox, ring forever; on deny hang up

; whitelist: always ring, even if in DND mode
: mobile
exten => dial-sip-nomailbox,1,GotoIf($[„${CALLERIDNUM}“ = „01712345678“]?dial-sip-nomailbox,100)

; dummy
exten => dial-sip-nomailbox,n,GotoIf($[„${CALLERIDNUM}“ = „12345678“]?dial-sip-nomailbox,100)

; check if DND is on, if yes, goto hang up
exten => dial-sip-nomailbox,n,GotoIf(${DB_EXISTS(DND/101)}?DND-ON-nomailbox,1)

; otherwise: dial phone
exten => dial-sip-nomailbox,n,Dial(${PHONE1})
exten => dial-sip-nomailbox,n,hangup

; special for whitelist: dial phone
exten => dial-sip-nomailbox,100,Dial(${PHONE1})
exten => dial-sip-nomailbox,n,hangup

; DND is on, no mailbox, just hang up -> but some callers are "whitelisted"
exten => DND-ON-nomailbox,1,Hangup
; ------------------------------------------------------------------------------------------------

Für die Wartemusik habe ich mich freier Musk bedient, die es z.B.hier gibt. Diese MP3s kopiert man nach/usr/share/asterisk/mohmp3 und aktiviert den entsprechenden Eintrag in der musiconhold.conf:

[default]
mode=quietmp3
directory=/usr/share/asterisk/mohmp3

Nun noch in der /etc/default/asterisk den Start des Servers aktivieren und Asterisk mit /etc/init.d/asterisk start starten.
Mit asterisk -r kommt man auf die Konsole und kann sich z.b. mitsip show registry anschauen, ob die Registrierung bei allen Providern funktioniert hat.
/etc/init.d/asterisk debug liefert noch mehr Infos.

Nun sollte man sich bei seinem eigenen Asterisk-Server mit einem SIP-Telefon mit den konfigurierten Daten (Benutzername 101, Passwort geheim) registrieren können.

Auch wenn die Konfiguration speziell für meine Bedürfnisse angepasst ist, dient sie meiner Meinung nach gut als Grundlage für Erweiterungen. So ist es z.B. problemlos möglich, weitere SIP-Provider (z.B. für andere Rufnummern) hinzuzufügen und diese einem zweiten oder dritten Telefon zuzuordnen.

Viel Spaß beim Telefonieren :-)