Asterisk – eine Einführung

Asterisk – Meine Erfahrungen mit der Software

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:

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-Provider.
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 Sipgate 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.

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.

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)

Es geht los – Installation und Konfiguration von Asterisk auf OpenWRT:
Die Asterisk Pakete haben die Version 1.8.7.1-1. 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 die Sprachbausteine (sounddir), Datenbank (dbdir), Daten (datadir) und Voicemail (spooldir) 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 und documentation_language = de_DE.

indications.conf ->
Im Abschnitt [general] den Eintrag country=de vornehmen.

musiconhold.conf ->
Im Abschnitt [default] den directory-Eintrag auf das richtige Verzeichnis mit den Musikdateien korrigieren

cdr.conf ->
Im Abschnitt [csv] usegmtime=no eintragen, sonst werden die Logeinträge in GMT-Zeit eingetragen. Darüberhinaus gibt es bei OpenWRT mit 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] den Eintrag 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.

Beispielhaft werde ich einige Auszüge aus meiner Konfiguration erläutern und darstellen:

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.

2 thoughts on “Asterisk – eine Einführung

Hinterlasse eine Antwort

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

*

CAPTCHA

*

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