Asterisk - eine Telefonanlage
Es gibt bereits viele Anleitungen und Beschreibungen zu dieser Telefonanlagensoftware; warum also noch etwas zu diesem Thema schreiben?
- Es gibt zwar Dokumentationen und viele Detaillösungen. Diese sind aber im Internet verstreut, müssen dort gesucht werden und sind nicht immer aktuell.
- Es wird zu wenig auf die Sicherheitsprobleme hingewiesen, die eine schlechte Konfiguration eines Asterisk-Servers im Internet verursacht.
- Einige Fallstricke in der Konfiguration sind zu beachten, die sogar mir, selbst nach intensivem Studium der Anleitungen im Internet, zum Verhängnis wurden.
- Je nach verwendeter Hardware und Distribution gibt es Einschränkungen in der Funktionalität, die nicht entsprechend dokumentiert sind.
Beginnen möchte ich mit meinem Einsatzzweck und -szenario:
Asterisk – Meine Erfahrungen mit der Software
Auswahl des SIP-Providers
Ausgangspunkt ist eine seit vielen Jahren funktionierende ISDN-Telefonanlage im Haus mit Faxgerät und div. Telefonen. Eine betagte Fritzbox war das Bindeglied zwischen der Telefon- und der Datenwelt. Ein Wechsel des DSL-Providers brachte eine radikale Veränderung mit sich. VoIP heißt das Zauberwort, das Telefonieren übers Internet ermöglicht und einen herkömmlichen Telefonanschluss (analog oder digital) überflüssig macht. Wer seinen alten Telefonanschluss kündigt, sollte sich Gedanken machen, was mit seinen alteingeführten Telefonnummern geschehen soll. Wer seine Nummern behalten will, muss beizeiten sich einen VoIP-Anbieter suchen. Viele der neuen DSL-Provider selbst bieten diesen Service an; daneben gibt es auch unabhängige VoIP-Provider1). Da die Portierung von Rufnummern meistens Kosten verursacht, ist eine langfristige Bindung an einen Anbieter sinnvoll.
Vor- und Nachteile der verschiedenen Anbieter lassen sich im Internet gut vergleichen, und die Erfahrungsberichte der Kunden gestatten einen Überblick darüber, wie die Firmen arbeiten. In meinem Anwendungsfall habe ich mich für das Angebot von Sipgate2) als unabhängigem VoIP-Provider entschieden, weil dort das Angebot des Plus-Pakets ein eigenes Faxgerät überflüssig macht. Damit entfallen auch die Probleme, die das VoIP-Protokoll mit der Faxübertragung hat.
Sipgate bietet mit dem Plus-Tarif ein Rufnummernpaket mit 3 Telefonnummern und einer Faxnummer an; bei mir kommen noch 5 Rufnummern dazu, die ich von der Telekom zu Sipgate habe portieren lassen. Somit lassen sich 9 verschiedene Rufnummern nutzen, die bei Sipgate Plus auf 3 sip-ids + fax-id zu verteilen sind. Beim Verteilen muss darauf geachtet werden, dass eine Rufnummer entweder Fax- oder Telefonanschluss ist. Prinzipiell lassen sich alle Telefonnummern auch über eine einzige id betreiben, aber das gehört zu den fortgeschrittenen Einstellungen, die ich später mal einrichten werde. Genutzt werden aktuell die im Telefonbuch verzeichneten Rufnummern für Fax und Telefon, die bei Sipgate auf die ids mit den Endungen -e0 und -e9(Fax) eingestellt sind. Eine weitere Rufnummer ist auf die Endung -e1 geschaltet; alle anderen Nummern jedoch auf -e2. Die Zuordnung kann jederzeit über das Webinterface bei Sipgate geändert werden. Diese Vorkonfiguration bei Sipgate erleichtert erst einmal das Erstellen eines Wählplans der Asterisk-Telefonanlage.
Auswahl der Hardware
Sobald die Frage des VoIP-Anbieters geklärt worden ist, muss noch entschieden werden, auf welchem Computer bzw. welcher Hardware das Asterisk-Programm laufen soll. Der Stromverbrauch und die Verfügbarkeit 24/7 sind Kriterien für folgende Auswahl:
- Asterisk auf einem ständig eingeschalteten PC (Server) im Haus
- Asterisk auf einem Server im Internet (V-Server oder Root-Server)
- Asterisk auf einem (embedded) Low-Power Device (ARM oder MIPS CPU), z.B. Router, Raspberry usw.
Ich habe mich für die Installation auf einem mit OpenWRT betriebenen Router entschieden. Die Ausfallwahrscheinlichkeit ist bei einem Gerät ohne aktive Kühlung und rotierender Festplatte gering und im Vergleich mit der Internet-Lösung sicherheitstechnisch leichter zu konfigurieren.
Zunächst ist für einen Einsteiger in die Asterisk-Software grundsätzlich das Verständnis für die modulare (bausteinartige) Struktur notwendig, d.h. es ist der nötige Funktionsumfang festzulegen und damit einhergehend die notwendigen Plugins bzw. Module. Die fast grenzenlosen Anwedungsszenarien und Konfigurationen machen es nicht leicht, den Überblick zu behalten. Es empfiehlt sich zunächst das Lesen der Dokumentationen und Anleitungen für Anfänger, dann sollte man eine jener Grundinstallationen wählen, die viele Distributionen fertig zusammengestellt anbieten. Ich habe bei meiner OpenWRT-Installation einfach alle verfügbaren Pakete mit asterisk* installiert, was sicherlich nicht notwendig war. Die überflüssigen Pakete werde ich später wieder deinstallieren, und zwar problemlos.
Da ich eine VoIP-Lösung ohne Anbindung konventioneller Telefonleitungen und Telefoniegeräten haben möchte, sind die Einschränkungen, die mit der Wahl von OpenWRT als Basis verbunden sind, nicht entscheidend. Für meinen SOHO-Einsatz ist die Anbindung über Ethernet ausreichend. Die an meinem Router noch vorhandenen USB-Anschlüsse lassen noch Raum für Erweiterungen, die vielleicht bei anderen Szenarien zum Zuge kommen können. Die Auflistungen verfügbarer Module in der Dokumentation Asterisks zeigen, dass nicht alle Module für OpenWRT verfügbar sind, die Grundfunktionen jedoch alle unterstützt werden. Die einzig fehlende Funktion, die ich vorerst nicht brauche, die aber nützlich sein kann, ist die Konferenz MeetMe. Das ist eine Designentscheidung, die der OpenWRT-Paketbauer geschuldet ist, nicht aber der Hardwareausstattung, was der problemlose Betrieb einer Telefonkonferenz auf einem Raspberry-Pi beweist.
Auswahl der Endgeräte
Eine Anmerkung zu den anschließbaren und angeschlossenen Geräten möchte ich noch machen. Meine Entscheidung, nur neue Telefone mit nativer VoIP-Funktionalität anzuschließen, ist nicht zwingend, weil sich über VoIP-Analog-Adapter auch normale Analogtelefone mit der Anlage verbinden lassen. Ebenfalls möglich ist die Anbindung von ISDN-Endgeräten bzw. -Telefonanlagen über eine Fritzbox, die in diesem Fall als SIP-Client an der Asterisk-Telefonanlage konfiguriert wird und somit eine Adapterfunktion einnimmt. Besteht der Bedarf, zusätzlich eine Anbindung an das konventionelle analoge oder digitale Telefonnetz vorzuhalten, so existieren PC Steckkarten, die die Verbindung herstellen können; damit erweitert sich der Einsatzbereich von Asterisk auf Personen und Firmen, die derartiges benötigen, sei es im Normalbetrieb oder als Fallback-Lösung.
Meine Asterisk-Konfiguration soll zunächst jene Funktionen bieten, die auch meine bisherige ISDN-Anlage geboten hat:
- Anschluss für 8 analoge Endgeräte → ok, Asterisk kann fast beliebig viele Endgeräte (nativ nur VoIP)
- verschiedene Rufnummern auf bestimmte Endgeräte → ok, konfigurierbar
- Halten, Rückfragen, Weiterverbinden → ok, konfigurierbar
- Wartemusik abspielen → ok, konfigurierbar
- Rufnummernsperre ausgehend → ok, konfigurierbar
- automatische Amtsholung (keine Ziffer vorwählen) → ok, konfigurierbar
- analoges Faxgerät nutzbar → obsolet, mein SIP-Provider übernimmt diese Funktion (Senden und Empfang)
nicht genutzte Features der ISDN-Anlage:
- Rückruf bei besetzt → ist ein Feature des ISDN-Netzes, nur zwischen ISDN-Teilnehmern möglich (?)
- Rufnummernanzeige (alte analoge Telefone hatten kein Display) → ok, Standard bei VoIP-Telefonen
- Nachtschaltung → ok, konfigurierbar
- Auswahl und Setzen der Absenderrufnummer → ok, konfigurierbar
- Protokoll der Anrufe (ein- und ausgehend) → nicht genutzt, nur begrenzte Anzahl
neue Funktionen und Einstellungen durch Asterisk ermöglicht:
- Anrufbeantworterfunktionen (Voicemailbox) in beliebiger Konfiguration
- Sperren/Abweisen von eingehenden Rufen bestimmter Nummern oder Nummernkreise (datenbankgestützt)
- Least Cost Routing (Anbieterauswahl für abgehende Rufe) für beliebige Rufnummern
- umfangreiche Protokollfunktionen (Anrufe und System)
Installation und Konfiguration von Asterisk auf OpenWRT
Es geht los: Die Asterisk Pakete haben die Version 1.8.7.1-13). Auch ohne Konfiguration sollte sich Asterisk starten lassen. Es werden zwar Fehlermeldungen erscheinen, die darauf hinweisen, dass bestimmte Module nicht konfiguriert sind; für den ersten Test ist das in Ordnung. Wenn man später keine Fehlermeldungen mehr haben will, muss man die entsprechenden .conf Dateien bearbeiten oder Module deaktivieren. Auf die grundsätzliche Funktion haben diese Warnungen keinen Einfluss. Notwendig sind nur die Einstellungen/Anpassungen in folgenden Konfigurationsdateien:
- /etc/asterisk/asterisk.conf
- /etc/asterisk/cdr.conf
- /etc/asterisk/extensions.conf
- /etc/asterisk/features.conf
- /etc/asterisk/indications.conf
- /etc/asterisk/musiconhold.conf
- /etc/asterisk/sip.conf
- /etc/asterisk/voicemail.conf
Die meisten der Dateien müssen nur einmal zu Beginn konfiguriert werden; damit werden landestypische Einstellungen vorgenommen und Speicherorte für Dateien festgelegt. Alle Konfigurationsdateien sind einfache Textdateien, die mit jedem Texteditor bearbeitet werden können: Die OpenWRT Asterisk-Pakete enthalten vorgefertigte .conf Dateien, die als Vorlage dienen bzw. leicht angepasst werden können. Ich bespreche die Änderungen in der Reihenfolge, die mir sinnvoll erscheint.
asterisk.conf ->
Hier werden im Abschnitt
- [directories] die Speicherorte für Dateien festgelegt, die Asterisk benötigt oder im Betrieb anlegt. Wer genügend Speicherplatz in den vorgegebenen Verzeichnissen hat, braucht keine Änderungen vorzunehmen – mein OpenWRT System ist da schon eingeschränkt.
Speicherplatz für
- (sounddir) Sprachbausteine
- (dbdir), Datenbank
- (datadir) Daten
- (spooldir) Voicemail
ist besser auf einem externen Speichermedium (z.B. USB-Stick) aufgehoben, insbesondere weil das /var Verzeichnis bei meinem Router auf /tmp gemounted ist und bei einem Neustart den Inhalt verliert – nicht sinnvoll für Datenbank und Voicemails. Im
- [options] Abschnitt sind nur die Spracheinstellungen zu ändern:
- defaultlanguage = de
- documentation_language = de_DE
indications.conf ->
Im Abschnitt
- [general] den Eintrag
- country=de
vornehmen.
musiconhold.conf ->
Im Abschnitt
- [default]
- directory-Eintrag auf das Verzeichnis mit den Musikdateien
cdr.conf ->
Im Abschnitt
- [csv]
- usegmtime=no eintragen, sonst werden die Logeinträge in GMT-Zeit eingetragen.
Darüberhinaus gibt es bei OpenWRT bei der Einstellung der Zeitzone noch eine Besonderheit, auf die ich später noch eingehen werde.
features.conf ->
Im Abschnitt
- [featuremap] die gewünschten Funktionen freischalten durch Entfernen der Kommentarzeichen (Semikola);
dabei können die Tastenkombinationen fast frei gewählt werden, sie dürfen sich nur nicht mit anderen Kombinationen in den Extensions überschneiden.
voicemail.conf ->
Im Abschnitt
- [general]
- format=alaw einfügen und alle anderen auskommentieren.
Asterisk auf OpenWRT kommt nur mit diesem Format klar. Versuche mit anderen Formaten endeten mit leeren Voicemails. Im Abschnitt
- [default] werden dann die gewünschten Voicemailboxen eingerichtet, und zwar nach dem Schema
- <Name der Mailbox> ⇒ <pin>,<Name des Besitzers>,<E-Mail des Besitzers>,,<Parameter, z.B. tz=european>
sip.conf ->
Hier werden alle Einstellungen zu SIP-Geräten und -Verbindungen vorgenommen, die den Anschluss, die Registrierung und Authentifizierung sowie die Zuordnung zu den Extensions im Dialplan darstellen. Die Sicherheit vor kriminellen Angriffen hängt zum größten Teil von einer vernünftigen Konfiguration ab. Leider sind eine Reihe von Dokumentationen mehr auf Bequemlichkeit als auf Sicherheit gegenüber Angriffen ausgelegt. Es empfiehlt sich, eine Reihe verschiedener Anleitungen zu lesen. Diese Datei muss, wie auch die folgende, bei Änderungen der Konfiguration (neue Geräte, Änderungen der SIP-Provider usw.) stets angepasst werden. In den Vorüberlegungen sollten die Namen der Geräte und deren Erreichbarkeit (Nummern) festgelegt werden. Die Ausgestaltung erfolgt dann im → Dialplan (extensions.conf)
extensions.conf ->
Sie ist das Herzstück der Konfigurationsdateien. Mit ihr werden alle gewünschten Funktionen und Verbindungen hergestellt. Dazu werden die jeweiligen Geräte bzw. Verbindungen einem Kontext (Extension) zugeordnet, der dann wie bei einem Programm abgearbeitet wird. Viele Funktionen und Variablen helfen dabei, jeder Extension genau die Rechte zuzuteilen, die der Bearbeiter des Dialplans vorsieht. Damit lässt sich die Telefonanlage – auch im laufenden Betrieb – ständig den Erfordernissen anpassen und mit Funktionen versehen, die konventionelle Telefonanlagen nur schwer oder gar nicht verwirklichen können.
Beispiele/Auszüge meiner Konfiguration
Zunächst einige Erklärungen:
Damit die Umstellungen gegenüber der bisherigen ISDN-Telefonanlage nicht zu drastisch ausfallen, habe ich die Nebenstellennummern beibehalten, d.h. 21-28 sind den gleichen Räumlichkeiten zugeordnet, zusätzliche zwei- und dreistellige Nummern erschließen neue Funktionen (31-38,88,99, 200, 201, 222 usw. beliebig erweiterbar). Da mein Ortsnetz nicht sehr groß ist, habe ich auf die Unterteilung in Orts- und Ferngespräche verzichtet. Für alle ausgehenden Gespräche muss die Ortsvorwahl mit eingegeben werden. Gleichzeitig habe ich das Anwählen von nichtdeutschen Teilnehmern (00…) unterbunden. Da es keine Regel für diese Rufnummern gibt, werden sie auf die Extension “i (=invalid)” im Kontext geleitet und gelten als ungültig. Es muss auch keine “Amtsvorwahl (z.B. 0 )” vorangestellt werden, denn die Unterscheidung zwischen internen und externen Verbindungen erfolgt durch die Länge der gewählten Nummern.
Auszüge aus meiner sip.conf
[general] allowoverlap=yes context=default ; default context for incoming calls allowguest=no ; disable unauthenticated calls srvlookup=yes ; enabled DNS SRV record lookup on outbound calls udpbindaddr=0.0.0.0 ; listen for UDP requests on all interfaces tcpenable=no ; disable TCP support alwaysauthreject=no mohsuggest=default nat=yes transport=udp language=de canreinvite=yes dtmfmode=rfc2833 disallow=all allow=alaw allow=ulaw allow=gsm qualify = yes register => <sip-id>e0:<password>@sipgate.de/l1 ; sipgate account plus register => <sip-id>e1:<password>@sipgate.de/l2 ; id wird durch Anhang eX register => <sip-id>e2:<password>@sipgate.de/l3 ; erweitert register => <sip-id>:<password>@sip.freevoipdeal.com/l4 ; freevoipdeal account ; Hier folgen die Einträge für VoIP Provider (Anzahl beliebig), sinnvoll min. 1 [vpd-ausgehend] ; dieser Contextname wird für ausgehende Gespräche genutzt insecure=invite type=peer username=<sip-id> secret=<password> host=sip.freevoipdeal.com fromdomain=sip.freevoipdeal.com [l1] ; dieser Contextname ist identisch mit dem letzten Teil im register-Eintrag type=friend ; und wird sowohl für eingehende, als auch ausgehende Gespräche genutzt host=sipgate.de secret=<password> insecure=invite,port ; Most providers won’t authenticate when they send calls to you, ; so you need this line to just accept their calls. localnet=192.168.xxx.0/255.255.255.0 fromdomain=sipgate.de fromuser=<sip-id>e0 username=<sip-id>e0 authuser=<sip-id>e0 context=v-sg ; dieser Contextname ist der Einstiegspunkt in der extensions.conf bei ; eingehenden Rufen … ; hier folgen die Eintragungen für Endgeräte… [office-phone](!) ; create a template for our devices, wird mit (!) gekennzeichnet type=friend ; the channel driver will match on username first, IP second deny=0.0.0.0/0.0.0.0 permit=192.168.zzz.0/255.255.255.0 permit=aaa.bbb.ccc.0/255.255.255.0 context=lokale-geräte ; this is where calls from the device will enter the dialplan host=dynamic ; the device will register with asterisk secret=<password> ; a secure password for this device — DON’T USE THIS PASSWORD! dtmfmode=auto ; accept touch-tones from the devices, negotiated automatically language=de mailbox=1234 ; gemeinsame voicemailbox directmedia=no ; sinnvoll, wenn keine Direktverbindung möglich (NAT) [endgerät-1](office-phone) ; das hinzufügen des Templates vererbt zunächst alle Einstellungen secret=<passwort> ; einzelne Einstellungen werden dann überschrieben, bzw. ergänzt dtmfmode=info ; näheres bei den einzelnen Parametern nachzulesen [endgerät-2](office-phone) secret=<passwort> context=anderer-context …
Auszüge aus meiner extensions.conf
[globals] CALLGRP1=SIP/endgerät-1&SIP/endgerät-2 … CALLGRP2=SIP/endgerät-n& … ; globale Variablen ersparen Schreibarbeit und ;Fehler [default] exten => s,1,Answer() same => s,n,Hangup() [lokale-geräte] ; Endgeräte in diesem Context können nur die Extensions wählen, die hier ; aufgeführt sind, alle übrigen sind ungültig und landen in der i – extension ; falls hier angeführt, sonst in der i – extension des [default] Abschnitts oder ; bleiben ohne Funktion include => mailbox_all exten => 200,1,Answer() same => n,Playback(hello-world) same => n,SayUnixTime(,,HM) same => n,Playback(transfer) same => n,MusicOnHold(,15) same => n,Hangup() exten => 21,1,SetMusicOnHold(default) exten => 21,n,DIAL(SIP/endgerät-1,10,m) exten => 21,n,VoiceMail(1234,bs) ;nach 10 sek. Klingeln geht die Mailbox ran exten => 21,n,Hangup() exten => 22,1,DIAL(SIP/endgerät-2) same => n,Hangup() … exten => _0Z.,1,Set(CALLERID(num)=xxxxxxxx) ; hier wird die Nummer gesetzt, die der Angerufene zu ; sehen bekommt exten => _0Z.,n,DIAL(SIP/${EXTEN}@vpd-ausgehend) same => n,NoOp(Status: ${HANGUPCAUSE}) exten => t,1,Hangup() ; die DIAL Applikation impliziert dieses Ende ; für eine klare Struktur dennoch sinnvoll same => n,NoOp(Status: ${HANGUPCAUSE}) [anderer-context] include => mailbox_all exten => 200,1,Answer() ; die gleiche extension – 200 – führt hier andere Befehle aus! same => n,Playback(hello-world) same => n,Hangup() exten => 21,1,DIAL(SIP/endgerät-1) exten => 22,1,DIAL(SIP/endgerät-2) … exten => _0Z.,1,Set(CALLERID(num)=xxxxxxxxx) ; hier kann z.B. eine andere Nummer eingetragen werden ; als im vorherigen Context exten => _0Z.,n,DIAL(SIP/${EXTEN}@vpd-ausgehend) same => n,NoOp(Status: ${HANGUPCAUSE}) exten => t,1,Hangup() same => n,NoOp(Status: ${HANGUPCAUSE}) [v-sg] ; hier landen alle eingehenden Anrufe von extern exten => l1,1,NoOp(Status: ${CALLERID(num)}) ; und werden entsprechend bearbeitet same => n,DIAL(${CALLGRP1},30) same => n,Goto(r-${DIALSTATUS},1) exten => r-BUSY,1,VoiceMail(WALD,bs) exten => r-BUSY,n,Hangup() exten => r-NOANSWER,1,VoiceMail(WALD,us) exten => r-NOANSWER,n,Hangup() exten => l2,1,NoOp(Status: ${CALLERID(num)}) same => n,DIAL(${CALLGRP2},70) same => n,Goto(r-${DIALSTATUS},1) exten => i,1,Wait(1) exten => i,n,VoiceMail(WALD,us) exten => i,n,Hangup() … [mailbox_all] exten => 4242,1,Answer() same => n,Wait(1) same => n,VoiceMailMain(1234,s) same => n,Hangup() …
Bisher nicht behandelte Applikationen und Funktionen können im Asterisk-Wiki bzw. in den Online-Versionen der Asterisk-Bücher nachgeschlagen werden.
Damit ist zunächst eine Grundkonfiguration erstellt, die es ermöglicht, dass die Endgeräte untereinander telefonieren und mit der Außenwelt kommunizieren können (ein- und ausgehend); auch die Funktion eines Anrufbeantworters ist schon darin enthalten. Weitere Möglichkeiten und Spezialfälle werde ich in künftigen Texten veröffentlichen, die auf diesem Artikel aufbauen werden.
Erstellt am 18. April 2013 von (rw)
Diskussion
Schöne Einführung! Ich hab mich mit Asterisk und Analog-Telefonen mal beschäftigt, um den Einsatz in den eigenen 4-Wänden zu demonstrieren:
http://www.kammerath.net/asterisk-analog-telefon.html
Vg, Jan
Hallo liebe Linux-Freunde! Ich habe hier mal für den Raspberry Pi eine Anleitung für Telefonkonferenzen geschrieben:
http://www.kammerath.net/kostenlose-telefonkonferenz.html
– Vielleicht interessiert es euch ja :-) Viele Grüße nach Hamburg! Jan