Aus Linux-Magazin 01/2008

Workshop: Die eigene Asterisk-Anlage - Teil 1

© eyeofsamara, photocase.com

Der eine braucht sowieso gerade eine neue, den anderen nervt, dass sich der Vermieter seiner Telefonanlage jedes Komfortmerkmal extra bezahlen lässt. Zeit zu wechseln, Zeit eine VoIP-fähige Anlage selbst zu bauen, Zeit für einen Asterisk-Workshop im Linux-Magazin.

Warum soll sich jemand die Mühe machen, eine Telefonanlage selbst zu programmieren? Es gibt doch genügend fertig zu kaufen. Die Antwort liegt in der fehlerhaften Fragestellung. Denn man kann eben nicht alles fertig kaufen. Ist doch etwas Passendes am Markt, dann ist es für kleine Unternehmen oft zu teuer. Mit Asterisk [1] hingegen kann sich jeder Linux-Erfahrene die Funktionalitäten einer 100000-Euro-Anlage selbst konfigurieren und dabei frei an eigene Bedürfnisse anpassen. Als VoIP-Anlage mit entsprechenden Telefonen ausgerüstet spart Asterisk nicht nur Gesprächsgebühren bei ausgehenden Anrufen, es braucht auch keine zweite Telefonverkabelung.

Trend zu Voice over IP

Lag 2006 der Anteil der Unternehmen, die Voice over IP nutzten (vollständig, parallel oder in Testumgebungen), noch bei 9 Prozent, so wird der Nutzungsgrad bis Ende 2007 knapp 16 Prozent erreichen. Das hat die Beratungsfirma Techconsult aus Kassel errechnet. Sie sieht VoIP als treibenden Motor für Umbrüche im Netzwerk-Management. Denn der zusätzliche, zeitkritische Sprachverkehr im LAN will geregelt sein, Stichwort: VPNs. Zudem stellen sich Fragen zur Abhörsicherheit und wie mit Spam über IP-Telefonie (Spit) umzugehen ist.

In Mitteleuropa gibt es drei Standardszenarien für den Einsatz von Asterisk:

  • Asterisk als ISDN-Telefonanlage: Sie ersetzen Ihre alte
    Telefonanlage durch einen PC mit ISDN-Karten und telefonieren
    intern mit VoIP-Telefonen (Abbildung 1).
  • Asterisk als reine VoIP-Telefonanlage: Intern und extern
    telefonieren alle nur noch über VoIP, es existiert kein
    ISDN-Anschluss mehr. Sie brauchen allerdings dazu eine stehende
    Internetverbindung (Abbildung 2).
  • Asterisk als Proxy: Sie schalten Asterisk als Proxy oder
    Gateway zwischen Ihre traditionelle Anlage und das ISDN-Netz
    (Abbildung 3). Dabei routet Asterisk einzelne Gespräche per
    VoIP an andere Standorte transparent. Die Gespräche laufen
    damit verschlüsselt und kostengünstig übers Netz.
    Diese Variante ist auch praktisch für den schrittweisen
    Umstieg auf Asterisk, weil Abteilungen einzeln auf VoIP umsteigen
    können und der Rest der Firma weiterhin mit der alten Anlage
    telefoniert.

Asterisk ist für die VoIP-Gemeinde das Gleiche wie Apache für Webmaster. Es beendet die Zeit, als eine Telefonanlage eine undurchschaubare Black Box war. Jeder Open-Source-Fan darf selbst Hand anlegen und die Anlage nach Gusto optimieren. Und: Asterisk vereint ISDN-, Analog- und VoIP-Telefonie. Die Schattenseite: Der Einstieg in Asterisk ist nicht einfach. Diese Workshop-Serie tritt dem entgegen und erklärt die wichtigen Funktionen Schritt für Schritt und beleuchtet Asterisks Vor- und Nachteile.

Abbildung 1: In diesem Szenario ersetzt ein Asterisk-PC mit ISDN-Karten die alte Telefonanlage. Intern arbeiten VoIP-Telefone.

Abbildung 1: In diesem Szenario ersetzt ein Asterisk-PC mit ISDN-Karten die alte Telefonanlage. Intern arbeiten VoIP-Telefone.

Abbildung 2: Asterisk als reine VoIP-Telefonanlage, in- und extern telefonieren alle nur noch über IP.

Abbildung 2: Asterisk als reine VoIP-Telefonanlage, in- und extern telefonieren alle nur noch über IP.

Abbildung 3: Asterisk arbeitet als Proxy oder Gateway zwischen einer traditionellen Anlage und dem ISDN-Netz draußen. Der neue Server routet externe Gespräche einfach weiter.

Abbildung 3: Asterisk arbeitet als Proxy oder Gateway zwischen einer traditionellen Anlage und dem ISDN-Netz draußen. Der neue Server routet externe Gespräche einfach weiter.

Hallo Welt, hallo Asterisk

Da für die Wählplanlogik die Art der Telefonie (analog, ISDN, VoIP) egal ist, zeigt der Artikel zuerst, wie Sie eine reine VoIP-Anlage realisieren. In Abwandlung des klassischen “Hello World” für Programmiersprachen werden Sie eine Asterisk-Anlage installieren, in Betrieb nehmen und erst ein, dann zwei VoIP-SIP-Telefone (Session Initiation Protocol) anschließen. Sobald ein Telefon die Nummer 1234 anruft, wird Asterisk selbstständig abheben und eine Sounddatei mit dem Inhalt “Hello World” abspielen.

Der zweite Artikel beschreibt intelligente Programmiertechniken im Dialplan und der dritte wird sich mit ISDN (Mehrgeräte-, Anlagen- und Multiplex-Anschluss) beschäftigen, mit analoger Telefonie (in- wie extern) und den Besonderheiten in Deutschland. Die Reihenfolge ist so gewählt, dass Sie ein Gefühl für Asterisk bekommen, ohne unbedingt teure Spezialhardware kaufen zu müssen. Zum Experimentieren reichen sogar ein normaler PC und ein SIP-Telefon.

Installation

Wie so oft in der Open-Source-Welt können Sie Asterisk eigentlich auf allen Linux-artigen Systemen installieren. Die meisten großen Distributionen bringen sogar fertige Asterisk-Pakete mit. Bleibt das Problem der Aktualität: Da Asterisk-Erfinder Digium (siehe Kasten “Asterisk erobert Rom”) in den letzten zwei Jahren etwa jeden Monat ein Update veröffentlicht hat, ist es für eine normale Distribution unmöglich, ein aktuelles Paket bereitzuhalten. Deshalb kompilieren Sie Asterisk hier aus den Quellen.

Asterisk erobert Rom

Eine Telefonanlage ist zum Telefonieren da. In den letzten 10 oder 15 Jahren haben die Anlagen aber aufgerüstet. So können Telekom-Kunden, die eine Mahnung bekommen, eine auf der Mahnung gedruckte Einmal-Nummer bei einem Telekom-Anwalt anrufen. Die dortige Telefonanlage leitet dann den Anruf entsprechend der Caller-ID dem richtigen Anwalt zu. Die einen mögen darin eine Verschwendung von Rufnummernräumen sehen, für die Telekom ist es eine Einsparung von zwei oder drei Minuten pro Telefonat, die sie sonst für das Erfassen der Kundenidentität benötigen würde.

Zwei Minuten bei Tausenden von Gesprächen im Monat – das spart erheblich Kosten. Das Gleiche gilt für automatische Abfragesysteme wie das der Bahn. Zwar gibt es kaum eine Morgenradiosendung, die nicht schon einmal einen Gag über derartige Spracherkennungssoftware gemacht hat (“Wenn Sie den Weltuntergang melden wollen, dann drücken Sie die Zwei”). Trotzdem oder vielleicht deshalb: Telefonanlagen verbinden heute und in Zukunft nicht nur Gespräche, sondern erfreuen ihre Besitzer mit Komfortfunktionen. Und immer mehr Anlagen werden zu einem Teil der IT-Infrastruktur.

Exotherme Reaktionen

Manche Firmen legen deshalb ihre Telefon- und IT-Abteilungen zusammen. Meist entsteht bei der Vereinigung eine gewisse Reibungswärme, denn die aufeinandertreffenden Welten könnten verschiedener kaum sein. Der Telefoner baut notfalls eine kleine Telefonanlage mit dem Lötkolben und ein paar Drähten selber zusammen. Auf der anderen Seite programmieren Leute Telefonanlagen, die unfähig sind ein Telefon auseinanderzunehmen.

Fast folgerichtig kam dann eine Firma aus Amerika, um mit einer Software, die dazu Open Source ist, die alte Welt zu revolutionieren. Die Firma heißt Digium und die Telefonanlagen-Software Asterisk [1]. Mark Spencer machte vor ein paar Jahren aus der Not – ihm fehlte das Geld für eine neue Telefonanlage – eine Tugend und erfand Asterisk. Damals ging es noch um analoge Telefone und den Wählplan baute er per C hart ins Programm ein.

Spencer rechnete nicht mit sonderlich weiter Verbreitung, für ihn war Asterisk Mittel zum Zweck. Nach und nach entdeckten jedoch andere Anwender und die Hersteller von Analogkarten die Software und verhalfen zusammen mit der in Digium umbenannten Spencer-Firma Asterisk zu Ansehen. Heute finden 120 Mitarbeiter ihr Auskommen bei Digium in Huntsville, Alabama, scherzhaft oft Silicotton Valley genannt.

Dieser Workshop macht das auf einem Debian-4.0-System, erfahrene Linuxer werden keine Probleme haben, die Anleitung auf jede andere moderne Distribution zu übertragen. Los geht\’s: Sie suchen sich eine möglichst zuverlässige Serverhardware, an CPU-Leistung stellt Asterisk keine großen Ansprüche, solange es nur einen Codec bedienen muss. Die Anbindung an LAN und Internet sollte aber gut, zumindest arm an Latenzen sein. Auf den Rechner spielen Sie ein Debian 4.0 (Etch). Eine Minimalinstallation reicht, sie ist sogar zu empfehlen. Alle folgenden Kommandos erfordern Root-Rechte.

apt-get update && apt-get -y upgrade && shutdown -r now

stellt sicher, dass Sie eine aktuelle Paketliste und alle Sicherheitsupdates einspielen sobald Debian mit einem eventuell aufgefrischten Kernel hochfährt. Nach dem Reboot installieren Sie ein paar Pakete nach, die Asterisk beim Kompilieren zur Gesellschaft will:

apt-get -y install build-essential libncurses5-dev

Das Kompilieren erledigen Sie in »/usr/src/«, da einige Zusatzmodule, die Sie vielleicht in Zukunft benötigen, den Sourcecode in diesem Verzeichnis suchen.

wget http://downloads.digium.com/pub/asterisk/asterisk-1.4-current.tar.gz
tar xvzf asterisk-1.4-current.tar.gz

holt und entpackt die aktuelle Asterisk-Version (siehe Kasten “Neues und Altes”). Da der Name mit der jeweils aktuellen Version variiert, sollten Sie sich den Verzeichnisnamen merken – hier ist es »asterisk-1.4.10.1«. Setzen Sie nun ein »cd« in das Verzeichnis.

Asterisk 1.4 ist die erste Version, die das allgemein übliche Configure nutzt. Mit

./configure && make && make install

installieren Sie eine Asterisk-Minimalversion, die für den Anfang vollkommen ausreicht. Später werden Sie zusätzliche Module kompilieren. Um eine funktionstüchtige Basisinstallation zu bekommen, führen Sie noch ein »make samples« aus, was eine Standardkonfiguration in das Verzeichnis »/etc/asterisk« einspielt. Wenn Sie später Asterisk mal updaten, wiederholen Sie die obigen Schritte, lassen aber »make samples« weg.

Neues und Altes

Die Asterisk-Version 1.4 gilt nach langwierigen Kinderkrankheiten heute als stabil und ist die vom Hersteller Digium empfohlene. Die in diesem Artikel benutzten Befehle setzen sie voraus, alte Versionen verwenden teilweise andere Befehle. Allerdings sollten Sie nicht ohne Not von einer laufenden 1.2er Installation auf eine 1.4 upgraden. “Never change a running system!” gilt für Telefonanlagen in noch größerem Maße als für normale IT-Infrastruktur.

Es gibt bei der Programmierung eines Dialplans (Wählplan) zwei Methoden: die alte Methode und eine neue, die AEL-Methode. Die klassische erinnert mit ihrer Nummerierung an alte Basic-Programme. AEL gleicht einer modernen Programmiersprache, allerdings mit einigen Einschränkungen. Da in der Version 1.4 Asterisk beim Starten alle AEL-Dialpläne sowieso intern in das alte Format umwandelt, bringt AEL bislang keine Vorteile.

Da die klassische Methode damit der offizielle Programmierweg bleibt, geht ihn dieser Artikel auch. Eine spätere Folge wird sich aber gleichwohl kurz mit AEL befassen.

Hände voller Konfigdateien

Ein Blick in »/etc/asterisk« zeigt von »adsi.conf« bis »zapata.conf« über 60 Konfigurationsdateien. Doch Entwarnung: Selbst Asterisk-Profis arbeiten im Normalfall nur mit einer Handvoll davon. Asterisks Konfigurationsdateien verwenden aber leider ein recht schwammiges, auch als INI bekanntes Format, für das nie jemand eine offizielle Grammatik veröffentlicht hat. Darum ist beispielsweise nicht immer klar, an welchen Stellen Leerzeichen erlaubt sind oder wo Asterisk Anführungszeichen erwartet – oft funktionieren mehrere Schreibweisen. Im Zweifel hilft nur Ausprobieren, wenn in einer Asterisk-Version eine Schreibweise nicht funktioniert.

Der Asterisk-Parser geht auch nicht den üblichen Weg aus lexikalischer Analyse, Tokenizing und syntaktischer Analyse. Aus diesem Grund ist der Asterisk-Ableger OpenPBX [2] auf die von Mac OS X bekannten, aber auch auf anderen Plattformen verfügbaren Property Lists (».plist«) als Format für Konfigurationsdateien umgestiegen.

Die im ersten Schritt wichtigsten Dateien heißen »sip.conf« (die Konfiguration für alle SIP-Devices) und »extensions.conf« (der Dialplan). In beiden Dateien gibt es so viele Beispiele, dass jeder Anfänger zwangsläufig den Überblick und damit jede Chance des Verstehens verliert. Deshalb löschen Sie beide mit:

rm -f /etc/asterisk/sip.conf && rm -f /etc/asterisk/extensions.*

Der zweite Befehl befördert neben »extensions.conf« auch die »extensions.ael« ins Jenseits, die Sie in einem Folgeartikel aber neu anlegen werden.

General-Sektion

Um ein SIP-Telefon an Asterisk anzumelden, müssen Sie es in der »/etc/asterisk/sip.conf« einrichten. Im einfachsten Fall sieht das wie in Listing 1 aus. Die »sip.conf« ist in Sektionen aufgeteilt, deren Köpfe an den eckigen Klammern erkennbar sind. Zu Beginn steht die Sektion »[general]«: Zeile 2 stellt den Default-SIP-Port auf 5060.

Listing 1:
»sip.conf« (1)

01 [general]
02 port = 5060
03 bindaddr = 0.0.0.0
04 context = sonstige
05 
06 [2000]
07 type=friend
08 context=meine-telefone
09 secret=1234
10 host=dynamic
11 
12 [2001]
13 type=friend
14 context=meine-telefone
15 secret=1234
16 host=dynamic

»bindaddr = 0.0.0.0« bedeutet, dass Asterisk auf allen möglichen IP-Adressen hört. Wer will oder muss, spezifiziert hier eine bestimmte IP-Adresse, falls auf dem Rechner mehrere Systeme auf verschiedenen IP-Adressen laufen. Der in Zeile 4 angegebene »context« ist ein Default, eine Art Catch-all für den Fall, dass Sie später bei der Definition der Telefone vielleicht vergessen einen Context zu vergeben. Die Werte dort vererben sich von oben nach unten.

Nach »[general]« kommen die Sektionen mit den SIP-Usern, wie zu erwarten und in Listing 1 zu sehen, steht jeder Username in eckigen Klammern. »type=friend« als jeweils erste Option gestattet es dem User, mit seinem Telefon sowohl Gespräche zu Asterisk zu tätigen als auch welche zu empfangen. Das per »secret=« gesetzte Passwort läuft per se als Klartext und damit Sniffer-freundlich übers Netz, wie Passwörter im SIP-Protokoll überhaupt. »host=dynamic« bedeutet, dass sich das SIP-Telefon mit einer beliebigen IP-Adresse anmelden darf.

Ohne Wählplan geht nichts

Damit Asterisk das Telefon überhaupt für voll nimmt, benötigen Sie eine minimale »/etc/asterisk/extensions.conf«, sprich einen Dialplan:

[sonstige]
[meine-telefone]
exten => 1234,1,Answer()
exten => 1234,2,Playback(hello-world)
exten => 1234,3,Hangup()

Haben Sie beide Dateien gespeichert, starten Sie Asterisk mit dem Kommando »asterisk -vvvc«:

Asterisk 1.4.2, Copyright (C) 1999 - 2005 Digium.
Written by Mark Spencer <markster@digium.com>
============================================
[ Booting...Nov 20 18:59:28 NOTICE[14937]:cdr.c:1185 do_reload: CDR
simple logging enabled.
............................................
.......................................... ]
Asterisk Ready.
*CLI>

Asterisk erzeugt eine beachtliche Anzahl an »WARN«- und »NOTICE«-Meldungen (siehe Kasten “Verbose- und Debug-Level”). Sie brauchen etwas Zeit, um ein Gefühl dafür zu bekommen, welche davon wichtig sind und welche nur das Logfile füllen. Es scheint fast, als wollten die Asterisk-Entwickler die Hürde für den Neuling möglichst hoch legen.

Verbose- und
Debug-Level

Asterisk kennt mehrere Verbose- und Debug-Level an. Debuglevel sind nur für Entwickler gedacht. Der Verboselevel lassen sich entweder beim Starten im CLI-Modus mit der Anzahl von »v«-s oder im CLI mit »core set verbose 3« einstellen. Wer »asterisk -vvvc« eintippt, startet Asterisk auch im Verboselevel 3. In der Praxis eignen sich die Level 3 bis 5 sehr gut zum Debuggen von Dialplänen. Für ein Produktivsystem sollten Sie aber immer mit »core set verbose 0« den Verbosity-Level auf 0 stellen, da sonst mittelfristig das Logfile überläuft.

SIP-Telefone anschließen

Fehlt noch das erste SIP-Telefon. Praktisch und darum zu empfehlen ist ein echtes Hardware-Telefon (Abbildung 4). Zudem bereiten SIP-Software-Telefone auf demselben Rechner oft Port-Probleme. Falls Ihnen kein SIP-Hardware-Telefon zur Verfügung steht, sollten Sie den SIP-Client zumindest auf einem anderen Rechner im Netzwerk laufen lassen (siehe Kasten “Telefone: Software oder Hardware”).

Abbildung 4: Äußerlich unterscheiden sich VoIP-Telefone kaum von ihren analogen oder ISDN-Geschwistern, hier das Modell 320 der Firma Snom [7].

Abbildung 4: Äußerlich unterscheiden sich VoIP-Telefone kaum von ihren analogen oder ISDN-Geschwistern, hier das Modell 320 der Firma Snom [7].

Abbildung 5: Softphones kosten zwar meist nichts, verlangen aber ein Headset. Im Bild ist der Linux-SIP-Client Linphone bei der Arbeit.

Abbildung 5: Softphones kosten zwar meist nichts, verlangen aber ein Headset. Im Bild ist der Linux-SIP-Client Linphone bei der Arbeit.

Telefone: Software oder
Hardware

Bei VoIP-Telefonen haben Sie die Wahl zwischen Softphones, also Telefoniesoftware, und Hardware-Telefonen, die sich äußerlich kaum von analogen oder ISDN-Geräten unterscheiden [3]. Softphones besitzen den Vorteil, dass es Sie kostenlos im Internet gibt. Zur Benutzung ist ein Headset oder zumindest ein Mikrofon allerdings Pflicht. Twinkle [4], Linphone (Abbildung 5, [5]) oder Ekiga [6] sind Linux-Vertreter der Gattung.

Wenn Sie planen, komplett auf VoIP-Telefonie umzustellen, dürften sich echte Hardware-Telefone mit Ethernet oder WLAN (siehe Abbildung 4 als Beispiel) als die bequemere Lösung erweisen, zumal die Anschaffungskosten in der letzten Zeit gesunken sind – teils unter 80 Euro. Achten Sie allerdings darauf, dass das Gerät den Standard SIP unterstützt. Viele Telefone im Elektrohandel eignen sich nämlich nur für das proprietäre Skype.

Wie die SIP-Telefone selbst zu konfigurieren sind, variiert stark von Hersteller zu Hersteller. Viele Geräte besitzen ein Webinterface, über das Sie die SIP-Zugangsnummer, aber auch den Netzwerkzugang einstellen. Die Netzparameter geben Sie entweder manuell ein oder das Telefon bezieht sie per DHCP. Manche Geräte holen sogar ihre Settings per Bootp – fast ein Muss, wenn Sie hunderte Geräte auszurollen haben. Informieren Sie sich vor dem Kauf, welche Geräte mit Ihrer IT-Infrastruktur klarkommen. (Martin Loschwitz)

Die Konfigurationsparameter für das SIP-Telefon lesen Sie aus der »sip.conf« heraus, hier im Beispiel aus den Zeilen 6 bis 10:

  • User: 2000
  • Passwort: 1234
  • SIP-Registrar: IP-Adresse Ihres Asterisk-Servers
  • SIP-Proxy: IP-Adresse Ihres Asterisk-Servers.

Nach dem Booten des Telefons können Sie im vorhin mit dem Schalter »-vvvc« gestarteten Asterisk-CLI (Command Line Interface) das Anmelden des Telefons bei Asterisk beobachten:

*CLI>  -- Registered SIP '2000' at 87.143.3.144 port 5060
expires 120 -- Unregistered SIP '2000'

Jetzt ist der Zeitpunkt gekommen, mit dem Telefon die Nummer 1234 zu wählen. Asterisk wird abnehmen und den Standard-Voiceprompt »hello-world« abspielen. Den nächsten logischen Schritt widmen Sie einem zweiten Telefon. Dies richten Sie analog zum ersten in der »sip.conf« ein (Zeilen 12 bis 16). Es bekommt den User 2001 und ansonsten die gleichen Werten wie das 2000er.

Im Asterisk-CLI lesen Sie jetzt mit einem »sip reload« die SIP-Konfiguration neu ein (siehe auch Kasten “Reload und Restart”). Danach booten Sie das zweite Telefon und beobachten wieder die Ausgabe im CLI. Sobald sich das Telefon angemeldet hat, können beide die Nummer 1234 anrufen und Sie bekommen Hello World vorgespielt.

Reload und Restart

Mit »module reload« können Sie alle Module erneut laden. Wenn Sie nur die »sip.conf« einlesen wollen, geht dies mit »sip reload«. Einen neuen Dialplan lesen Sie mit »dialplan reload«. Falls ein Reload nicht den gewünschten Effekt hat – nach dem Warum zu fragen ist bei Asterisk eher esoterischer Natur -, sollten Sie die Anlage mit »restart now« neu starten.

Dabei beendet Asterisk aber alle laufenden Gespräche. Wer dies vermeiden will, verhindert mit »restart gracefully« das Annehmen neuer Telefonate. Asterisk wartet dann mit dem Restart so lange, bis alle Gespräche beendet sind. Wer das zu restriktiv findet, erteilt mit »restart when convenient« Asterisk den Auftrag, mit dem Restart so lange zu warten, bis kein Gespräch mehr aktiv ist, aber neue Gespräche zuzulassen. Mit dieser Option kann es natürlich passieren, dass der Restart erst in der Nacht erfolgt.

Im CLI funktioniert übrigens die von der Bash-Shell bekannte Command-Completion auch. Sie können also beispielsweise »sip show« eingeben und dann zweimal auf die [Tab]-Taste drücken, um sich alle Möglichkeiten anzeigen zu lassen.

Dialplan und Asterisk-Extensions

Hello World fehlt es an echter Funktionalität, hier zum Beispiel an der Möglichkeit, dass sich die Telefone 2000 und 2001 gegenseitig anrufen können. Asterisk besitzt nämlich noch keinen geeigneten Dialplan, ein exaktes Regelwerk für alle Abläufe, selbst für die scheinbar nahe liegenden. Was der Dialplan nicht kennt, wird auch nicht funktionieren.

Um vom Telefon 2000 aus das Telefon mit der Nummer 2001 und umgekehrt anrufen zu dürfen, benötigen Sie den Dialplan »extensions.conf« aus Listing 2. Danach lesen Sie im CLI mit »dialplan reload« den neuen Plan ein und können fortan sowohl intern telefonieren als auch von beiden Telefonen die 1234 für die Sprachansage anrufen. Solche Regeln heißen im Asterisk-Jargon Extensions. Im obigen Dialplan sind dies die Extensions 1234, 2000 und 2001.

Listing 2:
»extensions.conf« (1)

01 [sonstige]
02 
03 [meine-telefone]
04 exten => 1234,1,Answer()
05 exten => 1234,2,Playback(hello-world)
06 exten => 1234,3,Hangup()
07 
08 exten => 2000,1,Dial(SIP/2000)
09 exten => 2001,1,Dial(SIP/2001)

Extensions bestimmen jeden Anruf in der Telefonanlage. Eine Extension darf dabei aus beliebig vielen Einzelzeilen bestehen. Jede Zeile folgt dem Muster:

exten => Gewählte_Rufnummer,Priorität,Applikation

Die erste Priorität (erster Programmschritt) ist immer die »1«. Andere fügen Sie im Abstand eins hinzu. Deshalb funktionieren die Extensions

exten => 1234,1,Answer()
exten => 1234,3,Playback(hello-world)
exten => 1234,4,Hangup()

nicht. Asterisk würde wegen der fehlenden zweiten Priorität die Leitung zwar mit der Applikation »Answer()« abheben, danach aber aufhören den Dialplan weiter abzuarbeiten und nach einem Timeout auflegen. Wem dies zu umständlich erscheint, der kann mit der Priorität »n« für next arbeiten. Aber auch hier muss die erste Zeile eine »1« enthalten. Die Extension »1234« sähe dann so aus:

exten => 1234,1,Answer()
exten => 1234,n,Playback(hello-world)
exten => 1234,n,Hangup()

Asterisks Applikationen-Liste ist lang und abhängig von den enthaltenen Modulen. Tabelle 1 beschreibt die in diesem Artikel benutzen Applikationen. Das Kommando »core show applications« im CLI produziert eine Liste aller gerade verfügbaren Applikationen. Hilfe zu einer Applikation bekommen Sie dann mit »help Applikation«, also bespielsweise »help answer«:

Usage: console answer
 Answers an incoming call on the consoleU
 (OSS) channel.

Eine ausführliche deutsche Dokumentation zu allen 1.4-Applikationen finden Sie online unter [8].

Tabelle 1: Benutze
Applikationen

 

Applikation

Beschreibung

Answer()

Öffnet einen anrufenden Channel.

Hangup()

Legt einen offenen Channel wieder auf.

Playback(Datei)

Spielt die übergebene Datei ab. Achtung: Deren Name darf
keine Endung, beispielsweise WAV oder GSM, enthalten! Asterisk
fügt diese automatisch hinzu.

Dial(SIP/User,Zeit)

Ruft den SIP-User an und lässt Zeit Sekunden lang
klingeln.

NoOp(String)

Gibt ab dem Verbose-Level 3 (»set core verbose 3«)
String auf dem CLI aus.

VoiceMail(Mailbox,User)

Gibt dem Anrufer die Möglichkeit, eine Sprachnachricht in
der Voicemailbox abzusetzen.

VoiceMailMain(Mailbox)

Gibt dem Accountbesitzer die Möglichkeit,
Sprachnachrichten in der Voicemailbox abzuhören.

Pattern-Wirtschaft

Wem es jetzt bei seiner geplanten großen Anlage vor einem endlos langen Dialplan mit allen möglichen Rufnummern-Kombinationen gruselt, dem sei gesagt: Kein Problem, es gibt im Dialplan auch die Möglichkeit, Regular Expressions einzusetzen. Leider haben die Entwickler auch hier das Rad neu erfunden – Sie können nicht auf bestehende Patterns zurückgreifen. Die Zeilen

exten => 2000,1,Dial(SIP/2000)
exten => 2001,1,Dial(SIP/2001)

lassen sich somit durch folgenden Einzeiler ersetzen:

exten => _200X,1,Dial(SIP/${EXTEN})

Er geht allerdings weiter und verbindet auch zu den Nummern 2002 bis 2009. Ein Pattern leitet immer ein Unterstrich »_« ein. Die Extension

exten => 200X,1,Dial(SIP/${EXTEN})

ist nämlich für Asterisk ebenfalls absolut logisch und korrekt, funktioniert aber unerwartet: Ohne Unterstrich erwartet Asterisk, dass jemand die 200X anruft, was mit SIP-Telefonen ginge. Die Channel-Systemvariable »${EXTEN}« enthält immer die angewählte Extension, nicht das Pattern, sondern die wirklich angerufene Nummer! Das Variablen-Konzept erklärt ein späterer Teil des Workshops. Diese Pattern kommen in Asterisk häufig vor:

  • »[ABC]«: Die Ziffern A, B und C. Das Pattern
    »_3[235]« matcht auf die Rufnummern 32, 33 und 35.
  • »[A-B]«: Die Ziffern von A bis B. Das Pattern
    »_3[2-5]« passt auf die Rufnummern 32, 33, 34 und
    35.
  • »X«: Jede Ziffer. Das Pattern »_3X«
    matcht auf die Rufnummern 30, 31, 32, 33, 34, 35, 36, 37, 38 und
    39.
  • ».«: Eine oder mehrere beliebige Ziffern. Das
    Pattern »_3.« passt auf alle Rufnummern, die mit einer
    3 anfangen, beispielsweise 30, 32, 345 oder 302303.

Das Pattern »_.« zu benutzen ist problematisch, weil Asterisk 1.4 es anders als 1.2 interpretiert und zudem jedes Mal eine Warnung ausgibt. Deshalb sollten Sie es meiden. Ein Catch-all erreichen Sie besser mit dem Pattern »_X.«.

Devices und Caller-ID

In der »sip.conf« konfigurieren Sie alle ein- und ausgehenden SIP-Devices, hier im Beispiel zwei SIP-Telefone. Es darf genauso gut ein externer SIP-Provider sein, der Gespräche ins Festnetz leitet und umgekehrt. Im Asterisk-CLI, das Sie mit dem Softwareschalter »-c« gestartet haben, lassen Sie sich mit »sip show users« alle konfigurierten SIP-User anzeigen. Wollen Sie alle Konfigurationen etwa des Users 2000 sehen, dann können Sie im CLI »sip show user 2000« eingeben und bekommen eine Ausgabe wie in Listing 3 zu Gesicht.

Listing 3: »*CLI> sip
show user 2000«

01 * Name       : 2000
02 Secret       : <Set>
03 MD5Secret    : <Not set>
04 Context      : meine-telefone
05 Language     :
06 AMA flags    : Unknown
07 Transfer mode: open
08 MaxCallBR    : 384 kbps
09 CallingPres  : Presentation Allowed, Not Screened
10 Call limit   : 0
11 Callgroup    :
12 Pickupgroup  :
13 Callerid     : "" <>
14 ACL          : No
15 Codec Order  : (none)
16 Auto-Framing:  No

Nennen Sie ihn doch Peter

Da das Beispiel nur die absolut notwendigen Parameter für die jeweiligen Accounts definiert, ist hier nicht viel zu sehen. Wichtig sind der Name des Users, »2000«, und dessen Context, also »meine-telefone«. Der Username muss nicht unbedingt eine Zahl sein. Sie könnten ihn auch »Peter« nennen und mit folgendem Dialplan die Rufnummer 2000 zum SIP-Peter verbinden:

[sonstige]
[meine-telefone]
exten => 2000,1,Dial(SIP/Peter)

Der SIP-User wiederum hat ebenfalls nichts mit der vom Telefon übertragenen Caller-ID zu tun. Diese konfigurieren Sie in der »sip.conf« getrennt mit dem Parameter »callerid«. Listing 4 zeigt ein Beispiel. Nach dem nächsten »sip reload« wird das Display auf jedem SIP-Telefon, das Caller-IDs unterstützt, genau die des Anrufers anzeigen.

Listing 4:
»sip.conf« (2)

01 [general]
02 port = 5060
03 bindaddr = 0.0.0.0
04 context = sonstige
05 
06 [2000]
07 type=friend
08 context=meine-telefone
09 secret=1234
10 host=dynamic
11 callerid=Hans Meier <2000>
12 
13 [2001]
14 type=friend
15 context=meine-telefone
16 secret=1234
17 host=dynamic
18 callerid=Uwe Klein <2001>

Vielleicht will ein Teilnehmer gelegentlich einen anderen anonym anrufen, also ohne Übertragung der im System eingetragenen Caller-ID. Das ist durch eine Erweiterung des Dialplans möglich. Sie dürfen nämlich die Caller-ID nicht nur in der »sip.conf«, sondern auch mit der Funktion »CALLERID(all)« im Dialplan einstellen.

Listing 5 zeigt einen Dialplan, der immer, wenn jemand die 88 vor einer Nummer wählt, den Anruf anonymisiert. Die Caller-ID »Anonymous <anonymous>« definiert die RFC 2543 genau für diesen Zweck, alle SIP-Provider sollten sie korrekt umsetzen. Die »:4« in Zeile 10 lässt Asterisk die ersten vier Stellen der Variablen »${EXTEN}« abschneiden.

Listing 5:
»extensions.conf« (2)

01 [sonstige]
02 
03 [meine-telefone]
04 exten => 1234,1,Answer()
05 exten => 1234,2,Playback(hello-world)
06 exten => 1234,3,Hangup()
07 
08 exten => _200[1-2],1,Dial(SIP/${EXTEN})
09 exten => _88200[1-2],1,Set(CALLERID(all)=Anonymous <anonymous>)
10 exten => _88200[1-2],n,Dial(SIP/${EXTEN:4})

Alles im Context sehen

Das Context-Konzept ist für die meisten Asterisk-Anfänger die größte Hürde. Der Dialplan, also die »extensions.conf«, teilt sich in Sektionen auf, die Asterisk Contexte nennt. Ein solcher beginnt stets mit eckigen Klammern. In den Listings 2 und 5 fanden sich zwei Contexte: »[sonstige]« und »[meine-telefone]«. Die »sip.conf« spiegelt sie wider, sie definiert für jedes Telefon einen Context, in den Listings 1 und 4 »[meine-telefone]«.

Contexte spinnen den roten Faden im Workflow. Wenn Sie mit dem Telefon 2000 eine Nummer wählen, schaut Asterisk zuerst in der »sip.conf« nach, welcher Context für den User 2000 zuständig ist. Dann sucht Asterisk in der »extensions.conf« nach dem Context. Fehlt er oder ist durch einen Tippfehler falsch, passiert nichts! Ist der Context dagegen vorhanden, sucht Asterisk nach der passenden Extension, also dem Programmablauf, der zur gewählten Nummer gehört, und führt sie aus. Funktioniert eine Asterisk-Anlage nicht wie sie sollte, liegt es in 90 Prozent der Fälle an einem Fehler in diesem Ablauf. Überprüfen Sie dann die Schreibweise der Contexte.

In großen Dialplänen passiert es schnell, dass mehrere Regular Expressions und damit verschiedene Extensions auf die gewählte Zielnummer passen. Dann wird Asterisk immer den besten oder den genauesten Treffer nehmen. Um das zu zeigen, eignet sich die Applikation »NoOp()« sehr gut. Sie schreibt den Inhalt der Klammer ins CLI, wenn es sich mindestens im Verbose-Level 3 (aktiviert per »core set verbose 3«) befindet.

Geben Sie in der »extensions.conf« den Dialplan aus Listing 6 ein. Rufen Sie jetzt mit dem Telefon 2000 die Nummer 23 an, so wird im CLI »23 ohne Pattern« erscheinen, da die 23 ohne Pattern Matching genauer matcht als das Pattern »_2X«. Glücklicherweise bietet Asterisk mit dem Befehl »dialplan show« die Möglichkeit an, Rufnummern im Dialplan zu testen. Listing 7 macht das in Zeile 1 für »23@meine-telefone«, indem es abruft, in welcher Priorität die Extensions matchen. Bei der Zielrufnummer 24 passt natürlich nur eine Extension, wie die Ausgabe ab Zeile 10 beweist.

Listing 6:
»extensions.conf« (3)

01 [sonstige]
02 
03 [meine-telefone]
04 exten => 1234,1,Answer()
05 exten => 1234,2,Playback(hello-world)
06 exten => 1234,3,Hangup()
07 
08 exten => _200[1-2],1,Dial(SIP/${EXTEN})
09 
10 exten => 23,1,NoOp(23 ohne Pattern)
11 exten => _2X,1,NoOp(${EXTEN} mit Pattern)

Listing 7: »dialplan
show«-Experimente

01 big-island*CLI> dialplan show 23@meine-telefone
02 [ Context 'meine-telefone' created by 'pbx_config' ]
03   '23' =>    1. NoOp(23 ohne Pattern)         [pbx_config]
04   '_2X' =>   1. NoOp(${EXTEN} mit Pattern)    [pbx_config]
05 
06 -= 2 extensions (2 priorities) in 1 context. =-
07 
08 
09 big-island*CLI> dialplan show 24@meine-telefone
10 [ Context 'meine-telefone' created by 'pbx_config' ]
11   '_2X' =>   1. NoOp(${EXTEN} mit Pattern)     [pbx_config]
12 
13 -= 1 extension (1 priority) in 1 context. =-

Telefonate ins Festnetz laufen über einen Provider

Die moderne und konsequente Anbindung ans Festnetz läuft für eine VoIP-Telefonanlage natürlich über einen SIP-Provider. Die Anbindung über ISDN wird ein späterer Artikel behandeln. Am Anfang steht die Auswahl eines geeigneten SIP-Providers. Die Qualität der großen Player im deutschsprachigen Markt unterlag 2006 und 2007 einigen Schwankungen – in den einschlägigen Internetforen gibt es über jeden Beschwerden.

Glücklicherweise hat sich die Situation in den letzten Monaten konstant verbessert. Trotzdem kann man immer noch nicht zweifelsfrei sagen, dass der Provider X besser ist als Provider Y. Schauen Sie sich die Preis- und Serviceangebote der verschiedenen SIP-Provider an [9] und probieren im Zweifelsfall mehrere aus. Das folgende Beispiel exerziert die nötigen Einstellungen anhand des SIP-Providers Axxesso [10] vor.

Bis jetzt hat Asterisk immer als Server gearbeitet. SIP-Telefone haben sich dabei an ihm registriert und ihn dazu benutzt, Gespräche zu anderen SIP-Telefonen aufzubauen. Für Gespräche über einen SIP-Provider muss Asterisk selbst als SIP-Client agieren und sich bei dem externen SIP-Provider registrieren. Das Listing 8 zeigt eine entsprechende »sip.conf«.

Dass die »register«-Anweisung im »[general]«-Teil und nicht bei der Konfiguration des entsprechenden SIP-Teilnehmers stehen soll, ist eine der kleinen Asterisk-Fallen. Wer das »register« nicht dort, sondern in der Datei weiter unten einträgt, kann keine Anfrufe vom SIP-Provider annehmen, weil Asterisk »register« schlicht nicht ausführt. Die meisten Provider bieten übrigens auf ihren Webseiten fertige »sip.conf«-Einträge an.

Listing 8:
»sip.conf« (3)

01 [general]
02 port = 5060
03 bindaddr = 0.0.0.0
04 context = sonstige
05 
06 ; SIP-Account des VoIP-Providers
07 register => 0223XXXXXXX:Passwort@TXL93.axxeso.com/0223XXXXXXX
08 
09 [axxeso_out]
10 type=friend
11 host=TXL93.axxeso.com
12 fromuser=0223XXXXXXX
13 username=0223XXXXXXX
14 secret=Passwort
15 fromdomain=TXL93.axxeso.com
16 context=from-sip-provider
17 canreinvite=yes
18 qualify=yes
19 insecure=very
20 nat=no
21 dtmfmode=info
22 
23 [2000]
24 type=friend
25 context=meine-telefone
26 secret=1234
27 host=dynamic
28 
29 [2001]
30 type=friend
31 context=meine-telefone
32 secret=1234
33 host=dynamic

Listing 9:
»extensions.conf« (4)

01 [sonstige]
02 
03 [meine-telefone]
04 exten => 1234,1,Answer()
05 exten => 1234,2,Playback(hello-world)
06 exten => 1234,3,Hangup()
07 
08 exten => _200[1-2],1,Dial(SIP/${EXTEN})
09 
10 [from-sip-provider]
11 exten => _X.,1,Dial(SIP/2000)

Rein- und Raus-Context

Wichtig ist an dieser Stelle, die externe Leitung in den Dialplan einzuarbeiten. Sie müssen zwischen zwei verschiedenen Contexten unterscheiden: den internen »[meine-telefone]« und den von extern reinkommenden »[from-sip-provider]«. Sollen Gespräche vom SIP-Provider immer auf dem Telefon 2000 landen, tragen Sie in »extensions.conf« die Zeilen aus Listing 9 ein.

Wenn Sie jetzt Asterisk mit »restart now« neu starten, sehen Sie bei entsprechendem Verbose-Level, wie sich Asterisk als SIP-User bei Ihrem SIP-Provider registriert. Der CLI-Befehl »sip show registry« informiert über Details. Mit »sip show users« bekommen Sie hingegen eine Liste aller SIP-User.

Den Dialplan analysieren ist nun nicht mehr schwer. Der interne Teil gleicht dem von Listing 6 und alle Anrufe vom SIP-Provider landen in dem Context »[from-sip-provider]«. Die Extension »_X.« dort trifft auf alles zu, das mindestens zwei Zeichen lang ist. Haben Sie bei einem Provider mehrere Rufnummern und wollen sie an mehrere Telefone binden, können Sie dies mit je einer Extension realisieren. Ist die eine Rufnummer 11111111 für das Telefon 2000 und die andere 22222222 für das Telefon 2001, sieht der untere Teil des Dialplans so aus:

...
[from-sip-provider]
exten => 11111111,1,Dial(SIP/2000)
exten => 22222222,1,Dial(SIP/2001)

Wer über den SIP-Provider Anrufe annehmen kann, will auch ins Festnetz telefonieren. Als Unterscheidung zwischen internen und externen Gesprächen ist eine führende Null üblich. Den passenden Dialplan zeigt Listing 10. Wenn Sie jetzt eine 0 vorwählen, schneidet Asterisk diese wegen »:1« in Zeile 9 weg und verbindet den Apparat mit der übrigen Nummer mit dem SIP-Provider.

Listing 10:
»extensions.conf« (5)

01 [sonstige]
02 
03 [meine-telefone]
04 exten => 1234,1,Answer()
05 exten => 1234,2,Playback(hello-world)
06 exten => 1234,3,Hangup()
07 
08 exten => _200[1-2],1,Dial(SIP/${EXTEN})
09 exten => _0X.,1,Dial(SIP/${EXTEN:1}@axxeso_out)
10 
11 [from-sip-provider]
12 exten => 11111111,1,Dial(SIP/2000)
13 exten => 22222222,1,Dial(SIP/2001)

Anrufbeantworter

Asterisk bringt ein sehr starkes und einfach zu benutzendes Voicemail-System mit. Die Konfiguration der Accounts erfolgt in der Datei »voicemail.conf«. Löschen Sie die vorhandene Beispieldatei wieder mit einem beherzten »rm /etc/asterisk/voicemail.conf« und schreiben mit Ihrem Lieblingseditor eine neue anhand des Beispiels in Listing 11.

Listing 11:
»voicemail.conf«

011 [general]
02 format=wav
03 
04 [default]
05 ;Voicemailbox => Passwort,Name,E-Mail
06 2000 => 1234,Hans Meier,hans.meier@beispielfirma.de
07 2001 => 1234,Uwe Klein,uwe.klein@beispielfirma.de

Um eine Voicemail-Box für alle ankommenden Gespräche zu aktivieren, erweitern Sie Ihren Dialplan wie in Listing 12. Bekommt ein »Dial()«-Befehl wie in Listing 10, Zeile 8, nur das Zielgerät überreichen, dann klingelt das Zielgerät bis zum Sankt-Nimmerleins-Tag. Wenn Sie aber »Dial()« wie in Listing 12 als zweiten Parameter eine Zahl übergeben, dann lässt Asterisk es nur diese Anzahl von Sekunden lang läuten, hier 30.

Listing 12:
»extensions.conf« (6)

01 [sonstige]
02 
03 [meine-telefone]
04 exten => 1234,1,Answer()
05 exten => 1234,2,Playback(hello-world)
06 exten => 1234,3,Hangup()
07 
08 exten => _200[1-2],1,Dial(SIP/${EXTEN},30)
09 exten => _200[1-2],2,VoiceMail(${EXTEN},u)
10 
11 exten => 3000,1,VoiceMailMain(${CALLERID(num)})
12 exten => _0X.,1,Dial(SIP/${EXTEN:1}@axxeso_out)
13 
14 [from-sip-provider]
15 exten => _X.,1,Dial(SIP/2000,30)
16 exten => _X.,2,VoiceMail(2000,u)

Messen Sie die Sekunden aber nicht mit einer Atomuhr nach, Asterisk geht hier nämlich etwas großzügig vor – es sind nur zirka 30 Sekunden. Wenn bis dahin die Gegenstelle nicht abhebt, wechselt Asterisk zur Extension der nächsten Priorität, hier »2«. Die befindet sich in Zeile 9 beziehungsweise Zeile 16 für externe Anrufer. Die Extension zweiter Priorität startet dann die Applikation »VoiceMail()«, die als Anrufbeantworter für die in der Klammer als erster Parameter angegebene Voicemail-Nummer fungiert. Diese muss in der »voicemail.conf« definiert sein (Listing 11, Zeile 6).

Abhören erwünscht

Vermutlich wollen Sie die aufgenommenen Nachrichten auch abhören können. Dafür hat der Dialplan die Extension »3000« angelegt. Wenn Sie mit einem internen Telefon, also einem aus dem Context »[meine-telefone]«, die Nummer 3000 anrufen, fragt Sie das System nach dem Passwort; im Beispiel ist das »1234«. Das geben Sie ein und warten einen Moment. Jetzt meldet sich das Voicemail-System und Sie können es abfragen und sich alle Nachrichten vorspielen lassen. Zudem wird Ihnen Asterisk bei dieser »voicemail.conf« eine Kopie der Nachrichten als WAV-Datei an die angegebenen E-Mail Adressen schicken.

In Listing 12 fällt bei der Extension »3000« der Parameter »${CALLERID(num)}« in Zeile 11 auf. Dies ist eine Asterisk-Funktion, die die Nummer des Anrufers ausgibt, also die Quelle. Sie ist nicht zu verwechseln mit der Variablen »${EXTEN}« in einigen anderen Zeilen, die die Zielrufnummer enthält (technisch: die Nummer der aktuellen Extension). Über Funktionen, Variablen und allgemeine Dialplan-Programmierung inklusive eines interaktiven Sprachmenüs (IVR) erfahren Sie in der nächsten Folge dieser Artikelserie mehr. (jk)

Infos

[1] Asterisk-Projekt: [http://www.asterisk.org]

[2] OpenPBX: [http://wiki.openpbx.org]

[3] Aufstellung von Hard- und Softphones: [http://www.voip-info.org/wiki-VOIP+Phones]

[4] Twinkle [http://www.twinklephone.com]

[5] Linphone: [http://www.linphone.org]

[6] Ekiga: [http://www.ekiga.org]

[7] VoIP-Telefon der Firma Snom: [http://www.snom.com/de/products.html]

[8] Deutsches Asterisk-Buch: [http://www.das-asterisk-buch.de], kommende Version: [http://www.das-asterisk-buch.de/unstable/]

[9] VoIP-Provider: [http://www.voip-information.de/voip-anbieter/]

[10] Axxeso: [http://www.axxeso.de]

Der Autor

Stefan Wintermeyer ist Autor des Asterisk-Buches von Addisson Wesley und erster deutscher DCAP (Digium Certified Asterisk Professional). Bei der Amooma GmbH [http://www.amooma.de] hilft er Kunden bei der Einrichtung von Asterisk-Telefonanlagen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 10 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben