Howto: Asterisk als SIP-Telefonanlage mit Sipgate und 1und1

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
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. mit sip 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 :-)

10 Gedanken zu „Howto: Asterisk als SIP-Telefonanlage mit Sipgate und 1und1“

  1. Mir kam gerade spontan die Idee, dass es praktisch wäre, wenn ich meinen Asterisk-Server auch “aus der Ferne” auf neue Mailbox-Nachrichten überprüfen könnte. Geht natürlich ganz einfach (wenn man die Konfigurations-Struktur einmal verstanden hat)
    Einfac

  2. Hallo,
    Music-on-hold als mp3 würde ich nicht empfehlen.
    Das system muss die MP3 umwandeln, dass kostet Prozessorleistung. Da Speicherplatz kostengünstig ist, würde ich die Musik im WAV oder gsm Format abspeichern und abspielen.

  3. spiele mich schon lange mit asterixnow herum und komme einfach nichts nach außen oder von außen herrein (sipgate.at)

    hoffe dass die genaue studie der anleitung helfen wird

  4. Sehr gute Anleitung!

    Leider fehlt mir hier die Verwendung von “Contexten” in der sip.conf. Ich habe auch einen Sipgate-Plus Account und versuche alle 3 Logins via der sip.conf ans fliegen zu bekommen. Funktioniert auch soweit, bis auf dass die eingehenden Anrufe nicht vernünftig einem Context (in der extensions.conf) zugewiesen werden.

    Problem ist:
    - Im [general] Teil der sip.conf werden mit “register” die Zugangsdaten des SIP-Accounts definiert
    - Weiter unten habe ich nun [e0_sipgate] bis [e3_sipgate] als Contexts defniert. Problem ist nun, woher weiss Asterisk auf welchem SIP-Account kommt der Anruf und welchem Context weise ich ihm diesen zu? Bei nur einem Sigate Account ist das kein Problem. Asterisk erkennt wahrscheinlich an der “host=” Definition welcher SIP-Account gemeint ist. Aber nicht so bei mehreren… Scheinbar ein Problem was viele Leute haben, aber bisher noch nicht ordentlich gelöst werden konnte.

    Thanks und cya
    Sascha

    1. Dazu kann ich dir leider nichts sagen aber ich hatte bzw. habe genau dasselbe Problem und keine Lösung dafür.
      An der Ecke fand ich Asterisk auch ein bisschen undurchsichtig :-)

  5. Hi!

    ; standard without area code is routed via sipgate

    ; with area code routed via 1und1

    Warum eigentlich sorum? Sollte es nicht genau andersrum sein, wenn 1und1 die Flatrate fürs Festnetz liefert. Weiß jemand, wie man sinnvoll “Gespräche nach DE über 1und1, alles andere über Sipgate” routen würde?

    Danke!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">