Simon Szustkowski

Ein Blog über alles, was mir gerade so durch den Kopf geht

Mar 13, 2011

Asterisk als SIP-Voicemail an Fritzbox anbinden

Ich habe in letzter Zeit mit einem T-Speedport W900v rumgespielt, den ich mit Freetz zu einer Fritzbox, äquivalent der 7170 umgeflashed habe. Meine Priorität lag vor allem bei einer Voicemail-Funktion, die mir die aufgenommenen Nachrichten per Mail zuschickt. Leider ist mir beim flashen ein Fehler unterlaufen, oder das freetz-Script ist allgemein gammelig, daher war ich sehr enttäuscht, dass mir die Mail-Funktion des Routers aufgrund eines internen Fehlers verwehrt blieb. Völlig klar, dass ich weder von AVM noch von der Telekom Hilfe zu erwarten brauchte.

Ich hatte aber noch meinen Homeserver in der Hinterhand, und ich dachte, dass es ja wohl nicht so schwer sein könne, auf der Kiste einen Asterisk aufzusetzen, der sich an der Fritzbox als normales SIP-Phone anmeldet, und eingehende Anrufe nach n Sekunden automatisch mit der Voicemail beantwortet. Im erweiterten Modus sollte es auch noch möglich sein, mit einem Telefon den Asterisk anzurufen, um die Voicemail über das Sprachmenü zu konfigurieren.

Falls ihr diese Anleitung jetzt nachmachen wollt: Ich gehe davon aus, dass auf eurer Maschine, auf der ihr den Asterisk laufen lasst, ebenfalls irgendein MTA installiert ist, der auch in der Lage ist, Mails zu versenden. Dies ist bei Heimservern, die meistens über DynDNS angesprochen werden, etwas tricky, Stichwort: SMTP-Relay. Aber ihr kriegt das schon hin. ;)

Nundenn: Der Asterisk ist über das Paketmanagement eurer Wahl installiert, in meinem Fall war es die 1.6-Version, falls ihr noch aus irgendeinem Grund die 1.4 am Start habt, müsst ihr u.U. die Syntax der Configs anpassen.

In der Fritzbox habe ich also dann ein neues Telefoniegerät hinzugefügt, mit dem Anschluss per SIP. Die Fritzbox verrät euch dann eine Client-ID, und ihr könnt ein Passwort spezifizieren. Im letzten Schritt der Einrichtung wartet die Fritzbox auf ein Register-Befehl vom Client. Ihr müsst nun folgendes in eurer sip.conf eintragen:
@[general]
port = 5060
bindaddr = 0.0.0.0
context = default
register => 621:changeme@192.168.1.1621
@

Erklärung zum Register-Befehl: Ihr tragt die Argumente hinter dem Pfeil folgendermaßen ein:
@$sip_user:$sip_password@$ip_der_fritzbox/$ressource@.
Als User und Passwort nehmt ihr dann halt die Daten, die die Fritzbox euch mitgeteilt hat, bzw. das Passwort, was ihr euch ausgedacht habt. Die Ressource kann beliebig heißen, ich habe sie weiterhin 621 genannt, damit ich nicht durcheinander komme. Wenn in weiteren Configs ab jetzt die 621 auftaucht, meine ich immer die Ressource, nie den User.

Ihr geht jetzt ins CLI des Asterisks und gebt den Befehl “sip reload” ein. Danach müsste sich die Fritzbox melden, dass die Registrierung des Telefons abgeschlossen ist. Sollte die Fritzbox zu ungeduldig sein, und schon vorher aufgehört haben zu warten, einfach “Zurück” drücken, und dann nochmal “sip reload” abschicken.

Nachdem der Asterisk nun an der Fritzbox angemeldet ist, müssen wir sein Verhalten konfigurieren. Das Browserfenster der Fritzbox könnt ihr schließen, das braucht ihr nicht mehr.

In die sip.conf tragt ihr jetzt folgendes ein:
@[621]
type=peer
defaultuser=621
fromuser=621
secret=geheim
host=192.168.1.1
insecure=port,invite
canreinvite=no
dtmfmode=rfc2833
qualify=no
nat=no
context=von-fritzbox
@

Mit diesen Befehlen wird die Ressource 621 im Kontext “von-fritzbox” als quasi virtuelles Telefon angelegt. Wenn sich jetzt ein SIP-Phone mit diesen Daten ausgestattet werden würde, könnte es sich damit am Asterisk anmelden.

Nun haben wir ein virtuelles Telefon, was aber noch mit Voicemail-Funktion ausgestattet werden muss. Dafür muss die Voicemail überhaupt erstmal konfiguriert werden. Deswegen kommen diese Einträge in die voicemail.conf:
@[general]
format = wav
serveremail=asterisk@simonszu.de
attach=yes
emailsubject = New Voicemail from ${VM_CALLERID}
pbxskip = no
emailbody = There is a new voicemail from ${VM_CIDNUM}, recordet at ${VM_DATE} with a length of ${VM_DUR}.
maxmessage = 120
maxsilence = 5
newzonename=Europe/Berlin|R

[default]
621 => 2342,Simon Szustkowski,mail@simonszu.de

@

Im general-Context werden einige grundlegende Einstellungen für die Voicemail getätigt. Was die Parameter genau bedeuten, könnt ihr in der Asterisk-Doku nachlesen. Wichtig ist für uns der default-Abschnitt. Hier wird für das 621-Telefon eine Voicemail spezifiziert, mit der PIN 2342. Die fertigen Voicemails werden dann an mich, an diese Mailadresse geschickt.

So, und nun kommt das wichtigste: Die Wahlregel, dass der Asterisk das Gespräch nach n Sekunden annehmen soll, und automatisch an die Voicemail leiten soll. Hierzu schauen wir uns die extensions.conf an:
@[von-fritzbox]
exten=>621,1,Ringing
exten=>621,n,Wait(20)
exten=>621,n,VoiceMail(621,u)
exten=>621,n,HangUp
@
Diese Wahlregel im Kontext, der vorher in der sip.conf festgelegt wurde, macht in 4 Schritten folgendes: Zunächst klingelt das virtuelle Telefon 621. Dies hört man aber natürlich nicht. Mit Wait(20) “klingelt” es genau 20 Sekunden lang. Im dritten Schritt, der nach Ablauf der 20 Sekunden ausgeführt wird, wird der Anruf auf die Voicemail 621, die wir vorher definiert haben, weitergeleitet. Das u steht für “unavailable” und spezifiziert die Ansage, die die Voicemail abspielt. Zu guter letzt legt der Asterisk dann auf. Und ihr solltet eine Mail vom Asterisk bekommen, mit einer Wav-Datei der Message als Anhang.

Soweit sogut. Allerdings ging es mir mächtig auf die Eier, dass da immer nur die Standardansage kam. Ich wollte da gerne eigene Ansagen drauf speichern, dafür musste ich aber doch irgendwie ein Telefon am Asterisk anmelden. Da meine SIP-Telefone aber beide schon an der Fritzbox registriert waren, hatte ich Glück, dass die Fritzbox auch SIP-Client spielen konnte. Ich habe zunächst beim Asterisk in der sip.conf einen neuen Client-Eintrag angelegt:
@[2999]
defaultuser=2999
context=sip-clients
type=friend
secret=changeme
host=dynamic
nat=no
qualify=no
@
Nun konnte ich die Fritzbox “einem Internet-Telefonie-Anbieter hinzufügen”, als Register-Server habe ich die IP des Asterisk genommen, User und Passwort aus der sip.conf übernommen. Proxy und STUN werden nicht benötigt. Nun habe ich an der Fritzbox eine Wahlregel erstellt, dass Anrufe mit der Nummer 5000, egal woher, in Richtung des Asterisk geroutet werden, und nicht mehr über mein Festnetz. Wieso 5000? Komm ich später zu.

Nun habe ich dem Asterisk aber noch mitteilen müssen, dass Anrufe mit der Nummer 2999 auf das Einstellungsmenü der 621-Voicemail geroutet werden. (Dieses Einstellungsmenü nennt der Asterisk “VoicemailMain”). Also folgende Einträge in der extensions.conf:
@[sip-clients]
exten=>5000,1,VoiceMailMain(621,s)
exten=>5000,n,HangUp
@

Jetzt sieht man auch, wieso die Wahlregel in der Fritzbox für die Nummer 5000 galt. Aus irgendeinem Grund kann man dem Asterisk keine Extensions zu Nummern zuweisen, wenn die Nummern bereits als SIP-Client definiert wurden, weil er sonst im wahrsten Sinne des Wortes einen Ressourcenkonflikt hat.

Wenn man jetzt mit einem internen Telefon die 5000 anruft, routet einen die Fritzbox und der Asterisk auf die VoicemailMain der zuvor konfigurierten Voicemail um. Nun kann man die Unavailable-Begrüßung nach eigenem Ermessen besprechen, denn diese Begrüßung ist es, die die Anrufer zu hören bekommen, wenn ihr Anruf von der Voicemail angenommen wird.

Wie immer: Falls ihr Verbesserungsvorschläge habt, immer rein damit in die Kommentare. ;)