Kapitel 5. Protokolle

1. Einleitung

In diesem Kapitel geht es um die Technik, die einzelnen Sprachpakete von A nach B zu bekommen. Dies wird mit Hilfe von verschiedenen Übertragungsprotokollen geleistet. Diese Protokolle setzen aber wiederum auf verschiedene Netzwerkprotokolle (TCP und UDP) auf. Um manche Probleme zu verstehen, benötigt man ein grundlegendes Verständnis dieser Netzwerkprotokolle. Deshalb werden diese hier näher erklärt. Sie sind nicht wesentlich, um Asterisk erfolgreich einzusetzen, jedoch sehr wertvoll für ein tieferes Verständnis der Vorgänge. Dieses Kapitel ist in erster Linie als Nachschlagewerk für den Fall der Fälle gedacht.

2. Netzwerkprotokolle

Dem Leser sei an dieser Stelle der Wikipedia-Artikel zu diesem Thema wärmstens empfohlen und die nachfolgende Darstellung ist in ihrer Struktur an demselben[76] angelehnt.

Für alle Ungeduldigen, hier eine einfache und knappe Definition: TCP ist ein Protokoll, das sicherstellt, dass die Übertragung der gesamten Information vom Sender geordnet und vollständig beim Empfänger ankommt. Das Ziel der vollständigen und korrekten Datenübertragung wird mit einem relativ großen Overhead im Verhältnis zur Nutzlast erkauft. Im Gegensatz dazu investiert das Schwesterprotokoll UDP sehr viel weniger in die Steuerung der Übertragung und schickt einfach alles raus und stellt nicht sicher, dass jedes einzelne Datenpaket auch wirklich beim Empfänger ankommt. Für VoIP sind beide Protokolltypen von Bedeutung, da bei einem normalen VoIP-Anruf die initiale Verbindung über TCP hergestellt wird, die reinen Sprachdaten aber mit UDP übertragen werden. Speziell für die Übertragung von Audiodaten ist Quantität der Datenpakete wichtiger als Qualität.

Transmission Control Protocol (TCP)

Das Transmission Control Protocol (TCP) ist eine Vereinbarung (Protokoll) darüber, auf welche Art und Weise Daten zwischen Computern ausgetauscht werden sollen. Alle Betriebssysteme moderner Computer beherrschen TCP und nutzen es für den Datenaustausch mit anderen Rechnern. Das Protokoll ist ein zuverlässiges, verbindungsorientiertes Transportprotokoll in Computernetzwerken. Es ist Teil der Internetprotokollfamilie, der Grundlage des Internets. Entwickelt wurde TCP von Robert E. Kahn und Vinton G. Cerf. Ihre Forschungsarbeit, die sie bereits im Jahre 1973 begannen, zog sich über mehrere Jahre hin. Deshalb erfolgte die erste Standardisierung von TCP erst im Jahre 1981 als RFC 793. Danach gab es viele Erweiterungen, die bis heute in neuen RFCs (einer Reihe von technischen und organisatorischen Dokumenten zum Internet) spezifiziert werden und alle zu TCP gehören. Im Unterschied zum verbindungslosen UDP (User Datagram Protocol) stellt TCP einen virtuellen Kanal zwischen zwei Endpunkten einer Netzwerkverbindung (Sockets) her. Auf diesem Kanal können in beide Richtungen Daten übertragen werden. TCP setzt in den meisten Fällen auf das IP (Internet-Protokoll) auf, weshalb häufig (und oft nicht ganz korrekt) auch vom TCP/IP-Protokoll die Rede ist. Es ist in Schicht 4 des OSI-Referenzmodells angesiedelt. Aufgrund seiner vielen angenehmen Eigenschaften (Datenverluste werden erkannt und automatisch behoben, Datenübertragung ist in beiden Richtungen möglich, Netzwerküberlastung wird verhindert usw.) ist TCP ein sehr weit verbreitetes Protokoll zur Datenübertragung. Beispielsweise wird TCP als (fast) ausschließliches Transportmedium für das WWW, E-Mail, Daten in Peer-to-Peer-Netzwerken und für viele andere populäre Netzwerkdienste verwendet.

Allgemeines

TCP ist im Prinzip eine Ende-zu-Ende-Verbindung in Vollduplex, welche die Übertragung der Informationen in beide Richtungen zu gleicher Zeit zulässt. Diese Verbindung kann in zwei Halbduplexverbindungen eingeteilt werden, bei denen Informationen in beide Richtungen (allerdings nicht gleichzeitig) fließen können. Die Daten in Gegenrichtung können dabei zusätzliche Steuerungsinformationen enthalten. Die Verwaltung (management) dieser Verbindung sowie die Datenübertragung werden von der TCP-Software übernommen. Die TCP-Software ist eine Funktionssammlung und (je nach Betriebssystem unterschiedlich) bei Linux auch im Betriebssystemkern, dem Linux-Kernel, angesiedelt. Anwendungen, die diese Software häufig nutzen, sind zum Beispiel Webbrowser und Webserver. Jede TCP-Verbindung wird eindeutig durch zwei Endpunkte identifiziert. Ein Endpunkt stellt ein geordnetes Paar dar, bestehend aus IP-Adresse und Port. Ein solches Paar bildet eine bi-direktionale Software-Schnittstelle und wird auch als Socket bezeichnet. Mit Hilfe der IP-Adressen werden die an der Verbindung beteiligten Rechner identifiziert; mit Hilfe der Ports werden dann auf den beiden beteiligten Rechnern die beiden miteinander kommunizierenden Programme identifiziert. Durch die Verwendung von Portnummern auf beiden Seiten der Verbindung ist es beispielsweise möglich, dass ein Webserver auf einem Port (normalerweise Port 80) gleichzeitig mehrere Verbindungen zu einem anderen Rechner geöffnet hat. Ports sind 16-Bit-Zahlen (Portnummern) und reichen von 0 bis 65535. Ports von 0 bis 1023 sind reserviert und werden von der IANA vergeben, z.B. ist Port 80 für das im WWW verwendete HTTP-Protokoll reserviert. Allerdings ist das Benutzen der vordefinierten Ports nicht bindend. So kann jeder Administrator beispielsweise einen FTP-Server (normalerweise Port 21) auch auf einem beliebigen anderen Port laufen lassen.

Verbindungsaufbau und -abbau

Ein Webserver, der seinen Dienst anbietet, generiert einen Endpunkt mit dem Port und seiner Adresse. Dies wird als passive open oder auch als listen bezeichnet. Will ein Client eine Verbindung aufbauen, generiert er einen eigenen Endpunkt aus seiner Rechneradresse und einer noch freien Portnummer. Mit Hilfe eines ihm bekannten Ports und der Adresse des Servers kann dann eine Verbindung aufgebaut werden. Während der Datenübertragungsphase (active open) sind die Rollen von Client und Server (aus TCP-Sicht) vollkommen symmetrisch. Insbesondere kann jeder der beiden beteiligten Rechner einen Verbindungsabbau einleiten. Während des Abbaus kann die Gegenseite noch Daten übertragen, die Verbindung kann also halb-offen sein.

Der Drei-Wege-Handshake

Der Drei-Wege-Handshake ist die Bezeichnung für ein bestimmtes Verfahren, um eine in Bezug auf Übertragungsverluste sichere Datenübertragung zwischen zwei Instanzen zu ermöglichen. Obwohl überwiegend in der Netzwerktechnik verwendet, ist der Drei-Wege-Handshake nicht auf diese beschränkt.

Verbindungsaufbau

Beim Aufbau einer TCP-Verbindung kommt der sogenannte Drei-Wege-Handshake zum Einsatz. Der Rechner, der die Verbindung aufbauen will, sendet dem anderen ein SYN-Paket (von engl. synchronize) mit einer Sequenznummer x. Die Sequenznummern sind dabei für die Sicherstellung einer vollständigen Übertragung in der richtigen Reihenfolge und ohne Duplikate wichtig. Es handelt sich also um ein Paket, dessen SYN-Bit im Paketkopf gesetzt ist (siehe TCP-Header). Die Start-Sequenznummer ist eine beliebige Zahl, deren Generierung von der jeweiligen TCP-Implementierung abhängig ist. Sie sollte jedoch möglichst zufällig sein, um Sicherheitsrisiken zu vermeiden. Die Gegenstelle (siehe Skizze) empfängt das Paket und sendet in einem eigenen SYN-Paket im Gegenzug ihre Start-Sequenznummer y (die ebenfalls beliebig und unabhängig von der Start-Sequenznummer der Gegenstelle ist). Zugleich bestätigt sie den Erhalt des ersten SYN-Pakets, indem sie die Sequenznummer x um eins erhöht und im ACK-Teil (von engl. acknowledgment = Bestätigung) des Headers zurückschickt. Der Client bestätigt zuletzt den Erhalt des SYN/ACK-Pakets durch das Senden eines eigenen ACK-Pakets mit der Sequenznummer y+1. Dieser Vorgang wird auch als Forward Acknowledgement bezeichnet. Außerdem sendet der Client den Wert x+1 aus Sicherheitsgründen ebenso zurück. Dieses ACK-Segment erhält der Server, das ACK-Segment ist durch das gesetzte ACK-Flag gekennzeichnet. Die Verbindung ist damit aufgebaut.

Verbindungsabbau

Der geregelte Verbindungsabbau erfolgt ähnlich. Statt des SYN-Bits kommt das FIN-Bit (von engl. finish = Ende, Abschluss) zum Einsatz, welches anzeigt, dass keine Daten mehr vom Sender kommen. Der Erhalt des Pakets wird wiederum mittels ACK bestätigt. Der Empfänger des FIN-Pakets sendet zuletzt seinerseits ein FIN-Paket, das ihm ebenfalls bestätigt wird. Obwohl eigentlich vier Wege genutzt werden, handelt es sich beim Verbindungsabbau auch um einen Drei-Wege-Handshake, da die ACK- und FIN-Operationen vom Server zum Client als ein Weg gewertet werden. Zudem ist ein verkürztes Verfahren möglich, bei dem FIN und ACK genau wie beim Verbindungsaufbau im selben Paket untergebracht werden. Die maximum segment lifetime (MSL) ist die maximale Zeit, die ein Segment im Netzwerk verbringen kann, bevor es verworfen wird. Nach dem Senden des letzten ACKs wechselt der Client in einen zwei MSL andauernden Wartezustand (Waitstate), in dem alle verspäteten Segmente verworfen werden. Dadurch wird sichergestellt, dass keine verspäteten Segmente als Teil einer neuen Verbindung fehlinterpretiert werden. Außerdem wird eine korrekte Verbindungsterminierung sichergestellt. Geht ACK y+1 verloren, läuft beim Server der Timer ab, und das LAST_ACK Segment wird erneut übertragen.

Aufbau des TCP-Headers

Das TCP-Segment besteht immer aus zwei Teilen - dem Header und der Nutzlast (Payload). Die Nutzlast enthält die zu übertragenden Daten, die wiederum Protokollinformationen der Anwendungsschicht wie HTTP oder FTP entsprechen können. Der Header enthält für die Kommunikation erforderliche Daten sowie das Dateiformat beschreibende Information. Die Werte werden in network byte order (big endian) angegeben.

Datenübertragung

TCP- / IP-Paket-Größe

Ein TCP-Segment hat typischerweise eine Größe von 1500 Bytes. Es darf nur so groß sein, dass es in die darunterliegende Übertragungsschicht passt, das Internetprotokoll IP. Das IP-Paket ist theoretisch bis 65535 Bytes (64 Kilobyte) spezifiziert, wird aber selbst meist über Ethernet übertragen, und dort ist die Rahmengröße auf 1500 Bytes festgelegt. TCP und IP Protokoll definieren jeweils einen Header von 20 Bytes Größe. Für die Nutzdaten bleiben in einem TCP/IP-Paket also 1460 Bytes übrig. Da die meisten Internet-Anschlüsse DSL verwenden, gibt es dort noch das Point-to-Point Protocol (PPP) zwischen IP und Ethernet, was nochmal 8 Bytes für den PPP-Rahmen kostet. Dem TCP/IP-Paket verbleiben im Ethernet-Rahmen nur 1492 Bytes MTU, die Nutzdaten reduzieren sich auf insgesamt 1452 Bytes MSS. Dies entspricht einer Auslastung von 96,8 %.

Aufteilen der Anwendungsdaten auf TCP- / IP-Pakete

Empfänger und Sender einigen sich vor dem Datenaustausch über das Options-Feld auf die Größe der MSS. Die Anwendung, die Daten versenden möchte, beispielsweise ein Webserver, legt zum Beispiel einen 10 Kilobyte großen Datenblock im Puffer ab. Um so mit einem 1460 Byte großen Nutzdatenfeld 10 Kilobyte Daten zu versenden, teilt man die Daten auf mehrere Pakete auf, fügt einen TCP-Header hinzu und versendet die TCP-Segmente. Dieser Vorgang wird Segmentierung genannt. Im Puffer ist der Datenblock, dieser wird in fünf Segmente aufgeteilt. Jedes Segment erhält durch die TCP-Software einen TCP-Header. Drei TCP-Segmente wurden aktuell abgeschickt. Diese sind nicht notwendigerweise sortiert, da im Internet jedes TCP-Segment einen anderen Weg nehmen und es dadurch zu Verzögerungen kommen kann. Damit die TCP-Software im Empfänger die Segmente wieder sortieren kann, ist jedes Segment nummeriert (die Segmente werden sozusagen durchgezählt). Bei der Zuordnung der Segmente wird die Sequenznummer herangezogen. Der Empfänger muss diejenigen TCP-Segmente bestätigen, die einwandfrei (Prüfsumme ist in Ordnung) angekommen sind.

Flusssteuerung

Da die Anwendung Daten aus dem Puffer liest, ändert sich der Füllstand des Puffers ständig. Deshalb ist es notwendig, den Datenfluss dem Füllstand entsprechend zu steuern. Dies geschieht mit dem Sliding Window und dessen Größe. Die Größe dieser Windows wird ständig angepasst und der Process der Anpassung ist ein nicht zu unterschätzender Overhead in der Kommunikation von Sender und Empfänger.

Slow-Start

Zu Beginn einer Datenübertragung dient der Slow-Start-Algorithmus zur Bestimmung des congestion window (wörtlich: Überlast-Zeitfenster), um einer möglichen Überlastsituation vorzubeugen. Man möchte Staus vermeiden, und da die momentane Auslastung des Netzes nicht bekannt ist, wird mit zunächst kleinen Datenmengen begonnen. Der Algorithmus startet mit einem kleinen Zeitfenster von zwei MSS, in dem Datenpakete vom Sender zum Empfänger übertragen werden. Der Empfänger sendet nun eine Bestätigung (Acknowledgement, ACK) an den Sender zurück. Anschließend wird die Größe des congestion window um eine Segmentgröße erhöht. Für jede weitere Bestätigung wird dieses wieder um eine Segmentgröße erhöht, das Limit ist das vom Empfänger festgelegte Empfangsfenster. Das Wachstum des Fensters ist in der Regel exponentiell, also erst langsam, dann schnell; insofern kann der historisch bedingte Name Slow-Start fälschlicherweise ein langsames Wachstum suggerieren.

Überlastkontrolle

Gehen bei einer bestimmten Fenstergröße Pakete verloren, kann das festgestellt werden, wenn der Sender innerhalb einer bestimmten Zeit (Timeout) keine Bestätigung (ACK) erhält. Man muss davon ausgehen, dass das Paket aufgrund zu hoher Netzlast von einem Router im Netz verworfen wurde. Das heißt, der Puffer eines Routers ist vollgelaufen; es handelt sich hier sozusagen um einen Stau im Netz. Um diesen aufzulösen, müssen alle beteiligten Sender ihre Netzlast reduzieren. Wird ein Paketverlust festgestellt, so wählt man die Hälfte der noch unbestätigten Daten im Netz als geeignetes Zeitfenster für die Datenübertragung zwischen diesem Sender und diesem Empfänger über den benutzten Kanal. Das verlorene Paket wird erneut übertragen, für jede Bestätigung wird die Sendefenstergröße wieder um eine MSS erhöht wie beim Slow-Start. Fast-Retransmit und Fast-Recovery werden eingesetzt, um nach einem Paketverlust schneller auf die Stau-Situation zu reagieren. Dazu informiert ein Empfänger den Sender, wenn Pakete außer der Reihe ankommen und somit dazwischen ein Paketverlust vorliegt. Hierfür bestätigt der Empfänger das letzte korrekte Paket erneut für jedes weitere ankommende Paket außer der Reihe. Man spricht dabei von Dup-Acks (Duplicate acknowledgements). Der Sender bemerkt die duplizierten Bestätigungen, und nach dem dritten Duplikat sendet er sofort, vor Ablauf des Timers, das verlorene Paket erneut. Weil nicht auf den Ablauf des Timers gewartet werden muss, heißt das Prinzip Fast Retransmit. Die Dup-Acks sind auch Hinweise darauf, dass zwar ein Paketverlust stattfand, aber doch die folgenden Pakete angekommen sind. Deshalb wird das Sendefenster nach dem Fehler nur halbiert und nicht wie beim Timeout wieder mit Slow-Start begonnen. Zusätzlich kann das Sendefenster noch um die Anzahl der Dup-Acks erhöht werden, denn jedes steht für ein weiteres Paket, welches den Empfänger erreicht hat, wenn auch außer der Reihe. Da dadurch nach dem Fehler schneller wieder die volle Sendeleistung erreicht wird, nennt man das Prinzip Fast-Recovery (schnelles Erholen). Bis zum Erkennen des Paketverlustes wurden noch weitere Pakete bis zur Sendefenstergröße übertragen. Der Empfänger konnte diese nicht nutzen, weil ein Paket der Serie verloren ging, aber er kann sie im Puffer halten. Nach der Neuübertragung des verlorenen Pakets durch den Sender bestätigt der Empfänger mittels ACK und einer höheren Sequenznummer die nun vollständige Paketfolge. Das erspart dem Sender, alle nach dem Paketverlust übertragenen Pakete erneut zu übertragen, und er kann sofort mit ganz neuen Paketen fortfahren; man nennt das kumuliertes ACK. Selective ACKs werden genutzt, um noch mehr Kontrollinformationen über den Datenfluss vom Empfänger an den Sender zurückzuschicken. Dabei wird nach einem Paketverlust vom Empfänger im TCP-Optionsfeld ein zusätzlicher Header eingefügt, aus welchem der Sender genau ersehen kann, welche Pakete bereits angekommen sind und welche fehlen (im Gegensatz zu den standardmäßigen kumulativen ACKs von TCP). Als bestätigt gelten die Pakete auch weiterhin erst dann, wenn der Empfänger dem Sender ein ACK für die Pakete übermittelt hat.

Datenintegrität und Zuverlässigkeit

Im Gegensatz zum verbindungslosen UDP implementiert TCP einen bidirektionalen, byte-orientierten, zuverlässigen Datenstrom zwischen zwei Endpunkten. Das darunterliegende Protokoll (IP) ist paketorientiert, wobei Datenpakete verloren gehen können, in verkehrter Reihenfolge ankommen dürfen und sogar doppelt empfangen werden können. TCP wurde entwickelt, um mit der Unsicherheit der darunterliegenden Schichten umzugehen. Es prüft daher die Integrität der Daten mittels der Prüfsumme im Paketkopf und stellt die Reihenfolge durch Sequenznummern sicher. Der Sender wiederholt das Senden von Paketen, falls keine Bestätigung innerhalb einer bestimmten Zeitspanne (Timeout) eintrifft. Die Daten der Pakete werden beim Empfänger in einem Puffer in der richtigen Reihenfolge zu einem Datenstrom zusammengefügt und doppelte Pakete verworfen. Der Datentransfer kann selbstverständlich jederzeit nach dem Aufbau einer Verbindung gestört, verzögert oder ganz unterbrochen werden. Das Übertragungssystem läuft dann in einen Timeout. Der vorab getätigte Verbindungsaufbau stellt also keinerlei Gewähr für eine nachfolgende, dauerhaft gesicherte Übertragung dar.

User Datagram Protocol (UDP)

Das User Datagram Protocol (Abk. UDP) ist ein minimales, verbindungsloses Netzprotokoll, das zur Transportschicht der Internetprotokollfamilie gehört. Aufgabe von UDP ist es, Daten, die über das Internet übertragen werden, der richtigen Anwendung zukommen zu lassen. Die Entwicklung von UDP begann 1977, als man für die Übertragung von Sprache ein einfacheres Protokoll benötigte als das bisherige verbindungsorientierte TCP. Es wurde ein Protokoll benötigt, das nur für die Adressierung zuständig war, ohne die Datenübertragung zu sichern, da dies zu Verzögerungen bei der Sprachübertragung führen würde.

Funktionsweise

Um die Daten, die mit UDP versendet werden, dem richtigen Programm auf dem Zielrechner zukommen zu lassen, werden bei UDP sogenannte Ports verwendet. Dazu wird bei UDP die Portnummer des Dienstes mitgesendet, der die Daten erhalten soll. Diese Erweiterung der Host-zu-Host- auf eine Prozess-zu-Prozess-Übertragung wird als Anwendungsmultiplexen und -demultiplexen bezeichnet.

Eigenschaften

UDP stellt einen verbindungslosen, potentiell unzuverlässigen Übertragungsdienst bereit. Das bedeutet, dass es keine Garantie gibt, dass ein einmal gesendetes Paket auch ankommt oder dass Pakete in der gleichen Reihenfolge ankommen, in der sie gesendet wurden. Eine Anwendung, die UDP nutzt, muss daher gegenüber verloren gegangenen und umsortierten Paketen unempfindlich sein oder selbst entsprechende Korrekturmaßnahmen beinhalten. Da vor Übertragungsbeginn nicht erst eine Verbindung aufgebaut werden muss, können die Hosts schneller mit dem Datenaustausch beginnen. Dies fällt vor allem bei Anwendungen ins Gewicht, bei denen nur kleine Datenmengen ausgetauscht werden müssen. Einfache Frage-Antwort-Protokolle wie das Domain Name System verwenden UDP, um die Netzwerkbelastung gering zu halten und damit den Datendurchsatz zu erhöhen. Ein Drei-Wege-Handshake wie bei TCP für den Aufbau der Verbindung würde unnötigen Overhead erzeugen. Daneben bietet die ungesicherte Übertragung auch den Vorteil von geringen Übertragungsverzögerungsschwankungen: Geht bei einer TCP-Verbindung ein Paket verloren, so wird es automatisch erneut angefordert. Dies braucht Zeit, die Übertragungsdauer kann daher schwanken, was für Multimediaanwendungen schlecht ist. Bei VoIP z.B. würde es zu plötzlichen Aussetzern kommen bzw. die Wiedergabepuffer müssten größer angelegt werden. Bei verbindungslosen Kommunikationsdiensten bringen verloren gegangene Pakete dagegen nicht die gesamte Übertragung ins Stocken, sondern vermindern lediglich die Qualität. UDP übernimmt die Eigenschaften der darunterliegenden Netzwerkschicht. Im Falle des Internet Protocols IP können Datenpakete maximal 65535 Bytes lang sein, wovon der IP-Header und UDP-Header insgesamt mindestens 28 Bytes belegen. UDP-Datagramme haben daher maximal 65507 Nutzdatenbytes. Solche Pakete werden jedoch von IP fragmentiert übertragen, so dass UDP nur bei Datenpaketgrößen bis zu einigen Kilobytes sinnvoll ist. IP löscht Pakete etwa bei Übertragungsfehlern oder bei Überlast. Datagramme können daher fehlen. Das UDP-Protokoll bietet hierfür keine Erkennungs- oder Korrekturmechanismen wie etwa TCP. Im Falle von mehreren möglichen Routen zum Ziel kann IP bei Bedarf neue Wege wählen. Hierdurch ist es in seltenen Fällen sogar möglich, dass später gesendete Daten früher gesendete überholen.

3. Channels

Ein Channel ist die Verbindung zwischen zwei Punkten (in unserem Fall sind das meistens menschliche Gesprächsteilnehmer). Es gibt folgende Channel-Arten:

  • Agent

    Ein ACD Agent-Channel

  • CAPI

    Ein ISDN-Channel

  • Console

    Ein Linux-Konsolen-Client-Treiber für Soundkarten, die mit OSS oder ALSA angesprochen werden können.

  • H.323

    Ein VoIP-Protokoll

  • IAX

    Ein VoIP-Protokoll

    [Anmerkung]Anmerkung

    Prinzipiel gibt es zwei Versionen von IAX (1 und 2). Wer heute von IAX spricht, meint eigentlich immer IAX2 (also die Version 2).

  • Local

    Ein Loopback in einen anderen Context

  • MGCP

    Ein VoIP-Protokoll

  • mISDN

    Ein ISDN-Channel

  • NBS

    Network Broadcast Sound

  • phone

    Linux Telephony Channel

  • SIP

    Ein VoIP-Protokoll

  • Skinny

    Ein VoIP-Protokoll

  • vISDN

    Ein ISDN-Channel

  • VOFR

    Voice over frame relay Adtran style

  • VPB

    Verbindung von normalen Telefonanschlüssen mit Voicetronix-Karten

  • Zap

    Verbindung von normalen Telefonanschlüssen mit Digium-Karten. Wird aber auch häufig für Karten anderer Hersteller benutzt.

In den meisten Beispielen in diesem Buch wird immer von SIP-Verbindungen ausgegangen. Der Grund dafür ist einfach: Zurzeit gibt es sehr viel mehr SIP- als z.B. IAX-fähige VoIP-Telefone. In diesem Kapitel werden diese zwei wichtigen Protokolle im Einzelnen beschrieben. Wer will, kann dieses Kapitel aber überspringen und bei konkreten Fragen zu bestimmten Parametern hier nachschlagen.

4. Peers, Users und Friends

Die Unterscheidung der Begriffe Peer, User und Friend ist in der Asterisk-Dokumentation nicht immer leicht verständlich dargestellt und wird daher auch teilweise falsch auf manchen Webseiten wiedergegeben. Die folgende Tabelle zeigt die jeweiligen Funktionen:

Asterisk<=User
Asterisk=>Peer
Asterisk<=>Friend

Ein Peer kann also nur angerufen werden, ein User nur anrufen und ein Friend kann beides.

[Tipp]Tipp

In der Praxis wird meistens nur Friend benutzt. Entsprechend muss man sich diese Tabelle nicht einprägen, sondern kann sie im Spezialfall nachschlagen.

5. IAX versus SIP

Fast jeder Asterisk-Administrator muss sich irgendwann einmal die Frage stellen, ob er eher auf SIP oder eher auf IAX setzen soll. Die kurze Antwort: Wenn IAX möglich ist (also, wenn die Telefone es unterstützen), dann sollte IAX benutzt werden. Ansonsten immer SIP. Mark Spencer (der Erfinder von Asterisk) hat zu diesem Thema auf einer Asterisk-Mailingliste im Jahr 2004 eine ausführlichere Antwort geschrieben (die im Original englische E-Mail finden Sie im Anhang C, IAX vs. SIP):

Date: Mon, 5 Jul 2004 18:59:52 -0500 (CDT)
From: Mark Spencer <markster@digium.com>

Ich möchte einige Unterschiede zwischen SIP und IAX kurz 
zusammenfassen. Vielleicht hilft Dir das bei der 
Entscheidungsfindung.

1) IAX arbeitet während des Gesprächs unabhängig von der Anzahl 
der Anrufe und des verwendeten Codecs effizienter als RTP. Der 
Vorteil liegt irgendwo zwischen 2400 Kbit/s für einen 
Einzelanruf und der dreifachen Anzahl der Anrufe pro Megabit 
bei G.729, wenn die Messung bei aktiviertem Trunk-Modus auf der 
MAC-Ebene vorgenommen wird.

2) IAX ist nicht ASCII-, sondern datenelementkodiert. Dies macht
Implementierungen wesentlich leichter und zudem robuster 
gegenüber Pufferüberlaufangriffen, da absolut keine Textanalyse 
oder -interpretation erforderlich ist. IAX führt den gesamten 
IP-Stapel, IAX-Stapel, TDM-Schnittstelle, Echokompensation und 
Erzeugung der Anrufer-ID auf 4k Heap und Stack sowie 64k Flash 
aus. Dies veranschaulicht ganz klar die 
Implementierungseffizienz des Entwurfs. Die Größe der 
IAX-Signalpakete ist drastisch geringer als die bei SIP, was 
aber in der Regel nur dann erwähnenswert ist, wenn zahlreiche 
Clients sich häufig registrieren. Allgemein gesprochen ist IAX2 
bei der Kodierung, der Dekodierung und der Überprüfung der Daten 
effizienter. Zudem wäre es für den Autor einer 
IAX-Implementierung extrem schwierig, eine Inkompatibilität mit 
einer anderen Implementierung herzustellen, da für eine 
Interpretation kaum Raum vorhanden ist.

3) IAX weist eine sehr klare Trennung von Schicht 2 und Schicht 
3 auf, d.h. sowohl Signalisierung als auch Tondaten haben 
definierte Zustände, werden robust und in konsistenter Weise 
übertragen, und wenn ein Endpunkt des Anrufs unvermittelt 
verschwindet, dann wird der Anruf auch zeitnah beendet und zwar
auch dann, wenn keine weiteren Signale und/oder Audiodaten 
empfangen werden. Einen solchen Mechanismus weist SIP nicht auf; 
hinzu kommt, dass, was die Signalisierung angeht, die 
Zuverlässigkeit sehr niedrig und schwerfällig ist, weswegen 
zusätzlich zum Kernstandard RF3261 weitere Standards benötigt 
werden.

4) Die einheitlichen Signalisierungs- und Audiopfade von IAX 
gestatten die transparente Navigation von NATs, und der 
Firewall-Administrator muss lediglich einen einzigen Port 
öffnen, um den Einsatz von IAX zu gestatten. Der IAX-Client 
muss für einen korrekten Betrieb überhaupt nichts über das 
Netzwerk wissen, in dem er sich befindet. Anders gesagt: Es kann 
niemals eine durch eine Firewall bedingte Situation auftreten, 
in der IAX einen Anruf aufbauen und dann keine Audiodaten 
übertragen kann (natürlich vorausgesetzt, es ist genügend
Bandbreite vorhanden).

5) Das authentifizierte Übertragungssystem von IAX gestattet 
die Übertragung von Audio- und Rufsteuerdaten über einen 
zwischengeschalteten Server auf eine robuste Weise: Wenn zwei 
Endpunkte einander aus irgendeinem Grund nicht erkennen können, 
wird der Ruf über den Zentralserver gehalten.

6) IAX trennt die Caller-ID vom Authentifizierungsmechanismus 
des Benutzers. SIP verfügt hierzu über keine eindeutige Methode, 
sofern nicht Remote-Party-IDs verwendet werden.

7) SIP ist ein IETF-Standard. Zwar gibt es eine neue 
Dokumentation von Frank Miller, aber IAX ist gegenwärtig noch 
kein veröffentlichter Standard.

8) IAX ermöglicht es einem Endpunkt, die Gültigkeit einer 
Telefonnummer zu überprüfen, damit er weiß, ob die Nummer 
vollständig ist, vollständig sein könnte oder aber zwar 
vollständig ist, aber länger sein könnte. SIP bietet hierfür 
keine vollständige Unterstützung.

9) IAX sendet DTMF stets außerbandig, d.h. es kann keine 
Verwirrung bezüglich der Frage entstehen, welche Methode verwendet 
wird.

10) IAX unterstützt die Übertragung von Sprache und Context, was 
in einer Asterisk-Umgebung durchaus sinnvoll ist. Mehr fällt mir 
jetzt im Moment nicht ein.

Mark

PS: Ich nehme mal an, dass SIP trotzdem ein paar Vorteile 
aufweisen muss (andernfalls wären seine Entwickler ja Dummköpfe).

Es bleibt also zu fragen, wie IAX die folgenden Aspekte verwaltet:
1) Bandbreitenanzeige
2) Neue Codecs
3) Erweiterbarkeit
4) Parken von Verbindungen und andere komplexe Szenarien
5) Videotelephonie

Ich habe den Eindruck, dass dies alles in SIP besser geregelt ist.

Nachtrag zu dieser E-Mail: IAX ist mittlerweile ein offenes und gut dokumentiertes Protokoll.

6. SIP

SIP hat sich de facto zum Standardprotokoll im VoIP-Umfeld etabliert. Warum?[77]

Wahrscheinlich liegt es an folgenden Punkten:

  • Es ist ein offenes Protokoll.

  • Die Spezifikation war von Anfang an als RFC 3261 für jeden Entwickler kostenlos einsehbar.

Vom rein technischen Standpunkt ist das IAX-Protokoll dem SIP-Protokoll in einzelnen Aspekten (siehe E-Mail von Mark Spencer) mindestens leicht überlegen. Bei vielen Installationen würde man mit IAX sogar sehr viel weniger Probleme haben, als mit SIP. Ein Grund hierfür ist das NAT-Problem bei SIP, das bei IAX in dieser Form nicht auftritt und das bei der Verwendung von SIP und einer Firewall dazu führt, dass bei der Firewall sehr viele UDP-Ports freigeschaltet werden müssen. Weiterhin können über einen IAX-Channel mehrere Gespräche gleichzeitig geführt werden. Bei SIP muss für jedes Gespräch ein eigener Channel aufgebaut werden (großer Verwaltungsoverhead).

[Anmerkung]Anmerkung

Das IP-Protokoll unterscheidet zwei wesentliche Transportmöglichkeiten: TCP und UDP. TCP unterstützt eine sichere Übertragung von Daten, da nach der Übertragung durch Checksummen überprüft wird, ob evtl. ein Paket fehlt. Dieses kann dann noch mal angefordert werden. TCP wird zum Beispiel beim Abruf von Webseiten benutzt. Bei den meisten Übertragungen von Ton- und Bildinformation benötigt man diesen Overhead allerdings nicht. Falls bei einer Videoübertragung ein Bild ausfällt, dann kann man dieses Bild nicht ein paar Sekunden später einfügen. Es wird also einfach weggelassen - Vergleichbares passiert bei Audiostreams. Für die Übertragung von Multimediadaten wird in der Regel UDP verwendet. Es garantiert zwar keine lückenlose Übertragung der Daten, besitzt dafür aber einen geringeren Verwaltungsoverhead und ist in dieser Hinsicht schneller" als TCP.

Das SIP-NAT-Problem

Die wenigsten Büro- und Privat-PCs haben eine eigene feste IP-Adresse aus dem öffentlichen Adressbereich des Internets. Diese wäre mit dem jetzigen IPv4-Standard wahrscheinlich auch nicht für jedes TCP/IP-taugliche Gerät verfügbar, da der IPv4-Adressraum zu klein ist für alle bereits vorhandenen Geräte.

[Anmerkung]Anmerkung

Der IPv4-Adressraum verfügt über insgesamt 2 hoch 32 einzelne Adressen und man kann wahrscheinlich nicht herausfinden, ob es wirklich noch möglich wäre, jedem IP-fähigen, aktuell vorhandenen Gerät eine feste IP-Adresse aus dem öffentlichen Adressraum zu geben. Das Problem ist auch, dass die Adressen nicht wahllos vergeben werden können, sondern nur innerhalb sinnvoller Broadcastdomains und bereits ganze Class-A-Bereiche (ca. 17 Mio Adressen) in den Anfängen des Internets großzügig auch einzelnen Firmen zugeteilt wurden.

Eine Lösung dieses Problems ist es Rechner, bzw. gesamte Rechnernetze, über ein so genanntes NAT-Gateway mit dem Internet zu verbinden. NAT ist das Akronym für "Network Address Translation". Mithilfe von NAT teilt ein einzelner Rechner (NAT-Gateway) seine feste offizielle IP-Adresse mit allen verbundenen Rechnern, die in der Regel über eine IP-Adresse aus dem privaten, im Internet nicht gerouteten Bereich[78], verfügen. Ein NAT-Gateway nimmt alle Anfragen von Rechnern aus dem privaten Netz (meist Intranet genannt) an und leitet diese dann mit der eigenen offiziellen IP-Adresse ins Internet weiter. Kommen die angeforderten Daten aus dem Internet zurück, leitet das NAT-Gateway die Daten entsprechend ins Intranet[79]. TCP/IP-Datenpakete bestehen in der Regel aus einem Envelope (Umschlag) und dem Content/Payload (Inhalt/Nutzlast). Im Envelope stehen Informationen über Ursprung und Ziel des Contents, also auch die IP-Adresse des Rechners, von dem die Kommunikation gestartet wurde. Diese Daten werden vom NAT-Gateway umgeschrieben. Es merkt sich die ursprüngliche IP-Adresse (für die Rückantwort) und schreibt für den öffentlichen Bereich des Internets seine eigene offizielle IP-Adresse in den Envelope. Kommen die angeforderten Daten zurück, schreibt das NAT-Gateway wieder die ursprüngliche IP-Adresse in den Envelope und leitet die Daten entsprechend an den Rechner zurück, der eigentlich die Kommunikaton gestartet hatte. Dies klappt bei den meisten Protokollen sehr gut. Allerdings benutzt SIP nicht den Umschlag, sondern schreibt die für das Protokoll benötigte IP-Adresse in den Inhalt des Paketes. Normale NAT-Gateways können nur mit IP-Adressen im Envelope umgehen, nicht aber im Content. Der gängige Fehler ist nun folgender: Der Zielrechner verfügt über eine offizielle IP-Adresse und der Quellrechner über eine private Adresse. Der anfordernde Rechner adressiert die Pakete mit der offiziellen IP-Adresse und schreibt seine Absenderadresse direkt in den Content und nicht in den Envelope. Die Pakete werden korrekt geroutet und landen beim Zielrechner. Da die Quell-IP nicht im Envelope gesetzt war, konnte das NAT-Gateway die private nicht in eine offizielle IP-Adresse umschreiben. Daher versucht der Zielrechner, die Daten an die in den Paketen angegebene IP-Adresse zu senden. IP-Adressen aus dem privaten Adressbereich werden jedoch nicht geroutet und der Quellrechner erhält keine Daten vom Zielrechner. In der Regel besitzen die Rechner im Intranet eines Unternehmens IP-Adressen aus dem privaten Adressbereich und müssen für die Kommunikation mit Rechnern im Internet auf die Dienste eines NAT-Gateways zurückgreifen.[80] Für Telefone im Intranet ist diese Adressproblematik ohne Belang, da ja im Intranet alle IP-Adressen geroutet und IP-Pakete korrekt verteilt werden. Verbindungen ins Internet sind jedoch mit SIP standardmäßig über ein NAT-Gateway nicht möglich. Eine genaue Beschreibung des NAT-Problems, das auch für einige andere Anwendungen relevant ist, findet man in der Wikipedia unter http://de.wikipedia.org/wiki/Network_Address_Translation.

[Anmerkung]Anmerkung

Auf welchen Ports Asterisk nach eingehenden RTP-Verbindungen lauscht, kann in der rtp.conf eingestellt werden.

SIP-Geräte in der extensions.conf

In der extensions.conf werden Kanäle zu SIP-Geräten in der Form SIP/Gerätename angegeben. Um einen beliebigen SIP-User über das Internet zu erreichen, verwendet man SIP/user@domain, für einen User auf einem Proxy gibt man SIP/proxy/user oder SIP/user@proxy an, wobei der Proxy als Abschnitt definiert sein muss (siehe „Channel-Einstellungen“).

Nützliche CLI-Befehle:

sip show peers
Listet alle SIP peers auf (auch friends)
sip show users
Listet alle SIP users auf (auch friends)
sip show registry
Zeigt den Status der Hosts, bei denen wir uns anmelden
sip debug bzw. sip set debug
Zeigt SIP-Debug-Meldungen.

Globale Einstellungen

Diese Einstellungen werden in der sip.conf im Abschnitt [general] vorgenommen. Hier sollen aber nur die wichtigsten und gebräuchlichsten Parameter beschrieben werden, weitere Erklärungen zu exotischen Parameter finden sich in der sip.conf.

I.d.R. ist es möglich, diese Einstellungen auch für einzelne User/Peers vorzunehmen.

context

context = Contextname

Bestimmt den Context im Dialplan für eingehende Anrufe.

context=default

allowguest

allowguest = [yes|no]

Anrufe von Gästen erlauben. Default: yes

allowguest=no

allowtransfer

allowtransfer = [yes|no]

Transfer von Verbindungen erlauben. Default: yes

allowtransfer=yes

realm

realm = Hostname

Der Systemname des Asterisk-Servers zur Authentifizierung. Default: asterisk oder ein ggf. in asterisk.conf eingestellter Systemname. Verwenden Sie hier den Host- oder Domain-Namen Ihres Servers.

realm=ast1.beispiel.de

bindport

bindport = Portnummer

Der UDP-Port, auf dem SIP-Verbindungen entgegengenommen werden sollen. Default: 5060.

bindport=5060

bindaddr

bindaddr = IP-Adresse

Die IP-Adresse, auf der SIP-Verbindungen entgegengenommen werden sollen. Default: 0.0.0.0 für alle Adressen des Rechners.

bindaddr=0.0.0.0

TOS-Flags (tos_sip, tos_audio, tos_video)

Für SIP können 3 TOS[81]-Parameter angegeben werden, um SIP-Paketen im Netzwerk eine andere Priorität als z.B. Datenübertragungen zu geben. Eine genauere Beschreibung steht unter tos. I.d.R. solle man diese Werte angeben (per Default nicht gesetzt):

tos_sip=cs3      ; für SIP-Pakete (Kommunikationsaufbau)
tos_audio=ef     ; für RTP-Audio-Pakete
tos_video=af41   ; für RTP-Video-Pakete

Sprach-Codecs (allow, disallow)

Mit allow und disallow können bestimmte Sprachcodecs erlaubt oder nicht erlaubt werden. Außer den bekannten Codecs gibt es all für alle. Dabei ist die Reihenfolge wichtig.

; Beispiel: alle Codecs ausser ilbc erlauben:
allow=all
disallow=ilbc

; Beispiel: nur die Codecs gsm und ulaw erlauben:
disallow=all
allow=gsm
allow=ulaw

language

language = Sprachkürzel

Stellt die Default-Sprache ein.

language=de

dtmfmode

dtmfmode = Modus

Verfahren, wie DTMF-Töne gesendet werden. Mögliche Werte:

rfc2833
(default) Informationsnachrichten nach RFC 2833 senden.
info
Als SIP INFO Nachrichten senden.
inband
DTMF-Töne „inband“ als Audio senden.
auto
Verwendet rfc2833 wenn möglich, sonst inband.
dtmfmode=rfc2833

videosupport

videosupport = [yes|no]

Schaltet die generelle Unterstützung von Video-Übertragungen ein (nicht getestet). Video-Unterstützung kann in den einzelnen Kanälen ausgeschaltet werden, kann aber dort nicht aktivierten werden ohne diese globale Einstellung.

videosupport=yes

maxcallbitrate

maxcallbitrate = Übertragungsrate

Bestimmt die maximale Übertragungsrate für Video-Telefonate in Kilobits pro Sekunde. Default: 384 (für 384 kb/s).

maxcallbitrate=384

g726nonstandard

g726nonstandard = [yes|no]

Stellt ein, dass, wenn ein Peer G726-32 Audio aushandelt, AAL2 packing statt RFC3551 packing verwendet wird (siehe doc/rtp-packetization.txt, ab Asterisk 1.4). Dies sollte nur eingestellt werden, wenn Sie Probleme mit z.B. Grandstream- oder Sipura-Telefonen haben, die fälschlicherweise G726-32 aushandeln, obwohl sie AAL2-G726-32 meinen.

g726nonstandard=no

rtpkeepalive

rtpkeepalive = Intervall

Sendet im in Sekunden angegebenen Intervall Keep-Alive-Pakete im RTP-Stream, um NAT[82]-Routen offenzuhalten.

rtpkeepalive=5   ; alle 5 Sekunden Keep-Alive-Pakete senden

t38pt_udptl

t38pt_udptl = [yes|no]

Erlaubt das Durchschleifen von T.38-Fax-Übertragungen von SIP- zu SIP-Kanälen. Default: no. Kann pro Kanal deaktiviert, aber nicht ohne diese Einstellung aktiviert werden.

t38pt_udptl=yes

register

register => user[:passwort[:authuser]]@host[:port][/extension]

Damit kann sich Asterisk als SIP-User bei einem anderen SIP-Proxy (z.B. einem externen Provider) registrieren.

Der Host ist entweder ein normaler Hostname, der per DNS aufgelöst werden kann, oder der Name eines Abschnitts, der weiter unten definiert ist.

Die Extension muss in der extensions.conf definiert sein, damit Anrufe von diesem Proxy empfangen werden können. Ohne Angabe der Extension gilt s.

; eingehende Anrufe von sip-provider.de an die Extension 999 leiten:
register => 123456:passwort@sip-provider.de/999

; eingehende Anrufe von sip-provider an die Extension 999 leiten:
register => 123456:passwort@sip-provider/999
[sip-provider]
...

externip

externip = IP-Adresse

Diese Einstellungen kann wichtig sein, wenn sich Asterisk hinter einem NAT-Router befindet. Die angegebene IP-Adresse wird in ausgehenden SIP-Nachrichten verwendet, damit die Empfänger unsere korrekte öffentliche Adresse wissen (statt unserer Adresse aus dem privaten Netz).

externip=123.45.67.89

externhost

externhost = Hostname

Wie externip, nur dass stattdessen der eigene öffentliche Hostname angegeben wird (der natürlich per DNS auflösbar sein muss).

externhost=hanspeter.dyndns.net

localnet

localnet = Adressraum

Gibt die lokalen, privaten Netzwerke an. Meist kann man folgendes verwenden (nach RFC 1918 und Zeroconf):

localnet=192.168.0.0/255.255.0.0
localnet=10.0.0.0/255.0.0.0
localnet=172.16.0.0/12
localnet=169.254.0.0/255.255.0.0

canreinvite

canreinvite = [yes|nonat|update|update,nonat]

Normalerweise versucht Asterisk den optimalsten „audio path“ zu wählen, d.h. bei 2 hergestellten Channels die beiden Gesprächsteilnehmer direkt zu verbinden ohne Asterisk als Mittelsmann. Das funktioniert aber nicht, wenn sich ein User in einem NAT befindet.

yes

(default) Normale Einstellung. Asterisk versucht, den kürzesten Audio-Pfad zu verwenden.

nonat

Nur umleiten, wenn sich die Teilnehmer nicht hinter einem NAT befinden (sofern das für Asterisk erkennbar ist).

update

Statt INVITE- UPDATE-Pakete zum Umleiten verwenden. Kann mit nonat als update,nonat kombiniert werden.

canreinvite=nonat

jbenable

jbenable = [yes|no]

Schaltet den „Jitter-Buffer“ für eingehendes Audio ein wenn nötig. Dadurch können unterschiedliche Latenzen von IP-Paketen ausgeglichen werden (siehe Jitter). Default: no

jbenable=yes

jbforce

jbforce = [yes|no]

Schaltet den Jitter-Buffer immer ein. (Natürlich muss auch jbenable aktiviert sein.) Default: no

jbforce=no

jbmaxsize

jbmaxsize = Länge

Maximale Größe des Jitter-Buffers in Millisekunden. Default: 200.

jbmaxsize=200

jbresyncthreshold

jbresyncthreshold = Länge

Resynchronisations-Rahmen des Jitter-Buffers. Default: 1000.

jbresyncthreshold=500

jbimpl

jbimpl = [fixed|adaptive]

Bestimmt, welcher Jitter-Buffer-Algorithmus verwendet wird. Bisher sind zwei Algorithmen implementiert:

fixed
(default) Der klassiche Jitter-Buffer mit fester Größe (immer jbmaxsize).
adaptive
Der neue Algorithmus mit variabler Größe (das ist auch der Jitter-Buffer von IAX2).
jbimpl=adaptive

Channel-Einstellungen

Nach den allgemeinen Einstellungen können Kanäle zu anderen Geräten in Abschnitten definiert werden. Das sind entweder users, peers oder friends (friend ist die Kombination aus user und peer).

I.d.R. können hier auch die in „Globale Einstellungen“ beschriebenen Parameter verwendet und so für einzelne Kanäle abgeändert werden.

Ein Abschnitt könnte z.B. so aussehen:

[sip-provider-in]
; für Anrufe, die über unseren SIP-Provider eingehen
; Wir kennen die CallerID der eingehenden Anrufe noch nicht, daher
; wird type=peer und der Abgleich per Hostname verwendet
type=peer
host=sip.provider.de
context=from-provider

oder so:

[sip-provider-out]
type=peer                ; da nur ausgehende Anrufe
secret=geheim
username=apfelmus       ; unser User
fromuser=apfelmus       ; brauchen viele SIP-Provider
host=sip.provider.de    ; Host des Providers
port=5060               ; Port auf dem Host des Providers
call-limit=5            ; max. 5 gleichzeitige ausgehende Anrufe zulassen

Bitte beachten Sie auch, dass je nach type des Kanals (user | peer) nicht alle Parameter sinnvoll sind. In der sip.conf finden sich Beispiele zu exotischen Parametern.

type

type = [user|peer|friend]

Die Art des Geräts

user
Ein Gerät, das sich zum Anrufen mit uns verbindet (z.B. ein lokales Telefon)
peer
Ein Gerät, mit dem wir uns verbinden, oder ein Gerät, das sich mit uns verbindet, und das wir anhand des Host-Namens zuordnen
friend
user und peer in einem Abschnitt
type=peer

context

context = Contextname

Der Context im Dialplan für eingehende Anrufe.

context=from-birnenbrei

secret

secret = Passwort

Unser Passwort, mit dem wir uns authentifizieren, bzw. das Passwort des anderen Geräts, um sich bei uns zu authentifizieren.

secret=geheim

username

username = Benutzername

Unser Benutzername / Account auf dem anderen Rechner.

username=apfelmus

fromuser

fromuser = Benutzername

Wird von einigen SIP-Providern benötigt.

fromuser=apfelmus

host

host = [Hostname|dynamic]

Hostname (oder Adresse) des anderen Rechners. dynamic wird angegeben, wenn der Hostname des Geräts nicht bekannt ist, da er dynamisch vergeben wird (oft zusammen mit defaultip gebraucht).

host=siphost.provider.de

defaultip

defaultip = IP-Adresse

Unter der angegebenen Adresse wird ein Host (host=dynamic) zu erreichen versucht, der sich noch nicht mit uns registriert hat.

defaultip=192.168.0.33

port

port = Portnummer

Port auf dem anderen Rechner, mit dem wir uns verbinden.

port=5060

call-limit

call-limit = Anzahl

Limitiert die Anzahl der gleichzeitigen Telefonate mit diesem Gerät. (Nicht für Realtime-Peers!) Bei type=friend wäre call-limit=1 ein Anruf für den peer und einer für den user.

call-limit=1

callerid

callerid = Vorname Nachname <Nummer>

Überschreibt die CallerID, die vom Gerät gesendet wird (und damit oft nicht vertrauenswürdig ist).

callerid=Hans Meier <1234>

nat

nat = [yes|no]

Gibt Asterisk einen Hinweis, ob sich zwischen Server und dem Gerät ein NAT-Router befindet.

host=192.168.0.42
nat=no

mailbox

mailbox = Nummer[@Context][,Nummer[@Context][,...]]

Ordnet dem User eine Mailbox im angegebenen Voicemail-Context (oder default) zu. Dadurch werden die entsprechenden MWI[83]-Nachrichten an das Gerät geschickt - z.B. für ein Blinklicht bei neuen Nachrichten. Es können auch mehrere Mailboxen angegeben werden.

mailbox=1234@default

subscribemwi

subscribemwi = [yes|no]

Schickt MWI-Nachrichten (siehe mailbox) nur dann, wenn das Gerät danach fragt.

subscribemwi=yes

vmexten

vmexten = Extension

Übergibt die Dialplan-Extension, unter der die Mailbox zu erreichen ist. Default: asterisk (so auch in einigen Endgeräten, z.B. snom, voreingestellt).

vmexten=asterisk

Sprach-Codecs (allow, disallow)

Mit allow und disallow können bestimmte Sprachcodecs erlaubt oder nicht erlaubt werden. Siehe „Sprach-Codecs (allow, disallow)“.

regexten

regexten = Extension

Erzeugt dynamisch eine Extension, wenn sich das Gerät anmeldet.

regexten=1234

qualify

qualify = [yes|no|Wartezeit]

Schickt dem anderen Gerät regelmäßig Pings; wenn das Gerät innerhalb der angegebenen Wartezeit (oder der Default-Zeit bei yes) nicht mit einem Pong antwortet, gilt es als nicht erreichbar.

qualify=5000

callgroup

callgroup = Gruppen

Setzt für das Gerät die angegebene Call-Group. Es können auch mehrere Gruppen durch Komma getrennt oder eine Reihe von Gruppen mit - (Bindestrich) angegeben werden. Gruppennummern gehen von 0 bis 63.

callgroup=2,4-7   ; setzt die Gruppen 2,4,5,6,7

pickupgroup

pickupgroup = Gruppen

Bestimmt die Pickup-Groups für das Gerät, also für welche der durch callgroup angegebene Gruppen Pickup (Heranholen von Gesprächen) erlaubt ist.

pickupgroup=2,4-6   ; Pickup für die Gruppen 2,4,5,6 erlauben

IP-Adressen-Beschränkung (deny, permit)

Mit permit und deny können IP-Adressräume, aus denen sich das Gerät bei uns registrieren kann, erlaubt oder verboten werden (nicht zu verwechseln mit allow / disallow!). Dabei ist die Reihenfolge wichtig.

; Verbinden nur von 192.168.0.* erlauben geht so:
deny=0.0.0.0/0.0.0.0                ; alle verbieten
permit=192.168.0.0/255.255.255.0   ; 192.168.0.* erlauben

setvar

setvar = Variablenname=Wert

Setzt eine Channel-Variable für alle Anrufe von diesem Gerät.

setvar=KUNDENNR=1234

rfc2833compensate

rfc2833compensate = [yes|no]

(ab Asterisk 1.4) Ermöglicht Rückwärtskompatibilität zum Erkennen von DTMF-Tönen, die von einem verbundenen Asterisk-Gerät vor Version 1.4 gesendet werden.

rfc2833compensate=yes

7. IAX

IAX[84] ist das Inter-Asterisk-eXchange-Protokoll, also das Asterisk-eigene VoIP-Protokoll, das bevorzugt verwendet werden soll.

Warum IAX?

Braucht die Welt eigentlich noch ein VoIP-Protokoll, wo es doch schon SIP, H.323 etc. und eine Reihe proprietärer Protokolle gibt? Darüber lässt sich natürlich streiten. IAX hat aber einige Vorteile, hier die wichtigsten, neben weiteren technischen Details:

  • Geringer Overhead. Im Vergleich zu beispielsweise SIP (und dem darin verwendeten RTP) hat IAX als reines UDP-Protokoll ein deutlich besseres Nutzdaten:Overhead-Verhältnis.
  • NAT-/Firewall-tauglich. Trotz solcher Hürden kann IAX problemlos Anrufe initiieren und entgegennehmen etc. Es muss nur ein einziger Firewall-Port freigegeben werden (bei SIP mindestens 3).
  • Einfaches Protokoll. Es müssen keinerlei Strings geparst werden, was IAX kaum anfällig für Speicherüberläufe macht.
  • Gesprächs-Transfers. Gespräche können sowohl über einen zentralen Server laufen als auch direkt zwischen zwei Teilnehmern.
  • Trunking. Dadurch kann über die gleiche Datenleitung eine viel höhere Anzahl von simultanen Gesprächen geführt werden (siehe Abschnitt 6, „Bandbreite und Trunking“).

Beispiel für eine IAX-Konfiguration

Am Anfang der iax.conf steht immer der Eintrag [general]. Ähnlich wie bei der sip.conf werden im [general]-Abschnitt allgemeine Parameter übergeben. Darunter kommt dann die Definition der einzelnen Channels.

Als Beispiel für die Möglichkeiten des IAX-Protokolls verbinden wir zwei voneinander unabhängige Telefonanlagen mit dem IAX-Protokoll. So können Gespräche von der einen zur anderen Anlage geführt werden und müssen nicht über das Festnetz geroutet werden.

Aufgabenstellung

Es gibt zwei Anlagen mit jeweils zwei Telefonen (1000 und 1001). Die Anlagen heißen ast1 und ast2. Jede Anlage soll in der Lage sein, Gespräche an die andere Anlage mit dem IAX-Protokoll zu übermitteln. Dazu wird eine Vorwahl benutzt. Die Vorwahl 0901 verbindet zur Anlage ast1 und 0902 zur Anlage ast2. Die Anlage ast1 besitzt in diesem Beispiel die IP-Adresse 192.168.0.101 und die Anlage ast2 die IP-Adresse 192.168.0.102.

Konfiguration ast1

Die iax.conf enthält folgende Konfiguration:

[ast2]
type = friend
host = 192.168.0.102
secret = 1234
context = test-telefone
permit = 0.0.0.0/0.0.0.0

Die extensions.conf enthält folgende Konfiguration:

[via-asterisk2]
exten => 09021000,1,Dial(IAX2/ast2/1000)
exten => 09021001,1,Dial(IAX2/ast2/1001)
;          ^   ^               ^     ^
;          |   |               |     |
; virt.Vorwahl ext      Verbindung  ext

Konfiguration ast2

Die iax.conf enthält folgende Konfiguration:

[ast1]
type = friend
host = 192.168.0.101
secret = 1234
context = test-telefone
permit = 0.0.0.0/0.0.0.0

Die extensions.conf enthält folgende Konfiguration:

[via-asterisk1]
exten => 09011000,1,Dial(IAX2/ast1/1000)
exten => 09011001,1,Dial(IAX2/ast1/1001)

Globale Einstellungen

Die folgenden Parameter können nur im [general]-Teil definiert werden, sind also gültig für alle Channels. Sie können hier außerdem auch einige der in „Channel-Einstellungen“ beschriebenen Einstellungen verwenden.

bandwidth

bandwidth = [low|medium|high]

Dient als Gruppierung verschiedener Soundcodecs. Auf diese Weise kann man einfacher bestimmte Situationen definieren. Das ist eine komfortable Alternative zu allow und disallow (allow).

high
Erlaubt alle Codecs: G.723.1, GSM, ulaw (G.711), alaw, G.726, ADPCM, slinear, LPC10, G.729, Speex, iLBC. Sollte nur bei Verbindungen ab 10 Mb/s verwendet werden.
medium
Verbietet die Codecs slinear, ulaw und alaw.
low
Verbietet zusätzlich die Codecs G.726 und ADPCM.

Beispiel:

bandwidth = low
disallow = lpc10   ; hat schlechte Qualität

allow

allow = [all|Name des Codecs]

Bestimmte Soundcodecs können gezielt erlaubt (allow) oder verboten (disallow) werden. Default ist allow=all. Die möglichen Codecs sind: g723.1, gsm, ulaw, alaw, g726, slinear, plc10, adpcm, g729, speex, ilbc, h261, h263 und der Platzhalter all. Siehe auch bandwidth (bandwidth) für eine komfortable Einstellung. allow und disallow können mehrmals verwendet werden und sind damit eine Ausnahme.

Beispiel:

disallow = all
allow = ulaw
allow = gsm

disallow

disallow = [all|Name des Codecs]

Siehe allow (allow).

codecpriority

codecpriority = [caller|host|disabled|reqonly]

Definiert, welcher Teilnehmer einer eingehenden Verbindung die höhere Priorität bei der Verhandlung des Soundcodecs hat. Default: host.

caller
Der Anrufer hat Vorrang vor dem Host.
host
Der Host hat Vorrang vor dem Anrufer.
disabled
Codec-Präferenzen werden nicht berücksichtigt.
reqonly
Codec-Präferenzen werden ignoriert und der Anruf nur dann akzeptiert, wenn der angeforderte Codec verfügbar ist.

Beispiel:

codecpriority = caller

authdebug

authdebug = [yes|no]

Standardmäßig ist ein minimales Debugging bei der Autorisierung von IAX-Verbindungen eingestellt. Dies kann mit authdebug=no deaktiviert werden.

Beispiel:

authdebug = no

autokill

autokill = [yes|Timeout in Millisekunden]

Falls autokill nicht gesetzt ist, versucht Asterisk einen nicht erreichbaren Host sehr lange zu erreichen. Dies kann bei vielen gleichzeitigen Versuchen (auf mehreren Channels) zu Performanceproblemen führen. Mit autokill=yes wird die Verbindung nach 2000 Millisekunden abgebrochen. Alternativ kann man auch die Anzahl der Millisekunden angeben.

Beispiel:

autokill = 3500

amaflags

amaflags = [default|omit|billing|documentation]

AMA ist die Abkürzung für „Automatic Message Accounting“ und spezifiziert u.a. Standardmechanismen zur Erzeugung und Übermittlung von Anrufprotokollen (Call Data Records / Call Detail Records / CDRs, auf Deutsch auch Kommunikationsdatensatz / KDS).

Mit omit werden keine Aufzeichnungen gemacht.

Beispiel:

amaflags = billing

bindaddr

bindaddr = [IP-Adresse]

Definiert die IP-Adresse, auf der Verbindungsanfragen beantwortet werden. Default: 0.0.0.0 für alle Adressen.

Beispiel:

bindaddr = 0.0.0.0

bindport

bindport = [Port-Nummer]

Definiert den Netzwerkport, auf dem Verbindungsanfragen beantwortet werden. Der Default-Port für IAX (IAX2!) ist 4569 (IAX Version 1: 5036).

[Wichtig]Wichtig

Diese Einstellung muss immer vor dem bindaddr-Eintrag erfolgen!

Beispiel:

bindport = 4569

delayreject

delayreject = [yes|no]

Diese Einstellung kann auf yes gesetzt werden, um evtl. Brute-Force-Attacken (zum Passwortknacken) abzuschwächen. Dann wird nach jedem falschen Einlogversuch 1000 Millisekunden (also 1 Sekunde) gewartet, bis der nächste Versuch akzeptiert wird. Default: no

Beispiel:

delayreject = yes

language

language = [en|de|...]

Konfiguriert die Sprache für den entsprechenden Channel. Gobale Standardsprache ist Englisch. Die Sprache, die gesetzt ist, wird vom Kanal als Informationselement gesendet. Diese Einstellung wird auch von Anwendungen wie SayNumber() gelesen, die für verschiedene Sprachen unterschiedliche Sprachbausteine verwenden.

Beispiel:

language = de

mailboxdetail

mailboxdetail = [yes|no]

Wenn mailboxdetail auf yes gesetzt ist, wird dem Apparat des Mailboxbenutzers die Anzahl der neuen (und die der alten) Nachrichten übermittelt (zur Anzeige auf dem Display o.ä.). Ansonsten wird nur signalisiert, dass es neue Nachrichten gibt, ohne die Anzahl zu nennen.

Diese Einstellung ist bei neueren Asterisk-Versionen nicht mehr verfügbar. Mittlerweile verhält sich Asterisk immer (standardkonform) wie mailboxdetail=yes.

Beispiel:

mailboxdetail = yes

tos

tos = [...]

ToS steht für „Type of Service“; das sind Flags im IP-Header, die von manchen Routern ausgelesen und befolgt werden. Damit kann das Routingverhalten optimiert werden. Die Empfehlung dieser Einstellung für IAX ist tos=ef. EF steht für Expedited Forwarding, also etwa Express-Übertragung, was nach geringer Latenz, geringer Verlustrate und wenig Jitter verlangt. Default ist none (wegen Rückwärtskompatibilität).

Die Vielzahl der möglichen Werte soll hier nicht weiter beschrieben werden, Interessierte seien auf die Spezifizierung von Differentiated Services in RFC 2474 und die IANA-DSCP[85] verwiesen. Hier nur ein ins Deutsche übersetzter Auszug aus der Asterisk beiliegenden Datei doc/README.tos (1.2) / doc/ip-tos.txt (1.4):

 

Die zulässigen Werte für die tos*-Einstellungen sind:

be (best effort, die normale, geringste Priorität), cs1, af11, af12, af13, cs2, af21, af22, af23, cs3, af31, af32, af33, cs4, af41, af42, af42, ef (expedited forwarding), lowdelay (geringe Latenz), throughput (Durchsatz), reliability (Zuverlässigkeit), mincost (geringste monetäre Kosten), none (wie be)

Außerdem kann man auch deren numerische Pendants angeben (z.B. tos=0x18).

Die Werte lowdelay, throughput, reliability, mincost und none sind veraltet und sollen nicht mehr verwendet werden, da sie das ToS-Byte nach dem alten „IP precedence“-Modell aus RFC 791 und 1349 setzen.

===========================================
Konfig.-         Parameter     Empfohlene
Datei                          Einstellung
-------------------------------------------
sip.conf         tos_sip       cs3
sip.conf         tos_audio     ef
sip.conf         tos_video     af41
-------------------------------------------
iax.conf         tos           ef
-------------------------------------------
iaxprov.conf     tos           ef
===========================================

Für den größtmöglichen Nutzen müssen Sie sicherstellen, dass Ihre Netzwerk-Hardware ToS unterstützt (ggf. aktivieren). Für Cisco-Geräte siehe „Enterprise QoS Solution Reference Network Design Guide[86] , für Linux-Systeme siehe „Linux Advanced Routing & Traffic Control HowTo[87].

 
 --doc/ip-tos.txt

Beispiel:

tos = ef

adsi

adsi = [yes|no]

ADSI (Analog Display Services Interface)[88] sind verschiedene Datendienste für analoge Telefone mit einem Display, z.B. blinkende LED/Anzeige im Display bei wartenden Nachrichten etc.

Falls Sie kompatible Telefone haben, können Sie diesen Dienst aktivieren.

Beispiel:

adsi = yes

register

register => username[:password]@remote-host

Ist unser Asterisk-Server nur über eine dynamische IP-Adresse erreichbar (also kein DNS, sondern nur eine IP-Adresse), so muss er sich bei jedem IP-Adresswechsel bei seiner Gegenstelle neu registrieren, sonst weiß die Gegenstelle nicht, an welche IP-Adresse sie Gespräche durchstellen soll. Dazu wird register => verwendet.

Beachten Sie, dass register-Angaben nur benutzt werden, wenn das entfernte Ende Sie als Peer und host=dynamic eingestellt hat.

Das grundlegende Format einer Registerangabe sieht wie folgt aus:

register => username[:password]@remote-host

Alternativ können Sie durch die Einbettung des Namens eines geeigneten RSA-Schlüssels[89] in eckige Klammern ([]) einen RSA-Schlüssel spezifizieren:[90]

register => username:[rsa-key-name]@remote-host

Standardmäßig werden Registeranfragen über Port 4569 gesendet. Sie können aber durch Anhängen von :Portnummer (also z.B. :4444) an den Hostnamen explizit einen anderen angeben.

Channel-Einstellungen

Die folgenden Parameter können für die einzelnen Channel definiert werden. Einige können aber auch im Abschnitt [general] verwendet werden.

type

type = [user|peer|friend]

Legt fest, ob es sich um eine Verbindung zu einem user (z.B. Benutzer-Endgerät, verbindet sich mit uns) oder peer (z.B. Gateway in ein anderes Asterisk-Netzwerk, zu dem wir die Verbindung herstellen) handelt. friend ist eine Kurzschreibweise, um einen user und einen peer mit den gleichen Angaben zu definieren.

Beispiel:

type = peer

[Warnung]Warnung

Wenn Sie nicht für alle User-Einträge (type=user) IP-basierte Zugangsbeschränkungen (siehe permit) definiert haben, müssen Sie in der iax.conf einen Eintrag [guest] haben, bei dem Sie weder auth noch secret angeben. Andernfalls können sich beliebige User verbinden, indem sie ein Passwort erraten.

Beispiel:

[guest]
type=user
callerid="IAX-Gast-Benutzer"

accountcode

accountcode = [Abrechnungsnummer]

Der angegebene String wird als Dateiname für die Abrechnungsdateien im Verzeichnis /var/log/asterisk/cdr-csv/ benutzt. Verwenden Sie daher nur Kleinbuchstaben, Ziffern, Bindestrich, Unterstrich.

Beispiel:

accountcode = iax-hausmeister

bandwidth

bandwidth = [low|medium|high]

bandwidth dient als Gruppierung verschiedener Soundcodecs. Auf diese Weise kann man einfacher bestimmte Situationen definieren (siehe bandwidth).

Beispiel:

bandwidth = low

allow

allow = [all|Name des Codecs]

Bestimmte Soundcodecs können gezielt erlaubt (allow) oder verboten (disallow) werden (siehe allow). Dabei ist zu beachten, das evtl. im [general]-Bereich erlaubte Codecs erst durch ein disallow=all wieder verboten werden müssen.

Diese Parameter sind nicht zu verwechseln mit permit und deny (siehe permit).

Beispiel:

disallow = all
allow = ulaw
allow = gsm

disallow

disallow = [all|Name des Codecs]

Siehe allow (allow).

codecpriority

codecpriority = [caller|host|disabled|reqonly]

Definiert, welcher Teilnehmer der Verbindung die höhere Priorität bei der Verhandlung des Soundcodecs hat (siehe codecpriority).

Beispiel:

codecpriority = caller

amaflags

amaflags = [default|omit|billing|documentation]

AMA ist die Abkürzung für „Automatic Message Accounting“ und spezifiziert u.a. Standardmechanismen zur Erzeugung und Übermittlung von Anrufprotokollen (CDRs) (siehe amaflags).

Beispiel:

amaflags = documentation

callerid

callerid = [Name[ <Nummer>]]

Mit callerid können Sie die angezeigte Caller-ID für einen Nutzer oder ein Peer setzen. Wenn Sie ein Caller-ID-Feld für einen Benutzer definieren, werden alle Anrufe, die auf diesem Kanal eingehen, mit dieser Caller-ID verknüpft, unabhängig davon, was Ihnen das andere Ende sendet. Das ist aus Sicherheitsgründen zu empfehlen (außer, Sie vertrauen dem anderen Ende), da es sehr leicht möglich ist, seine Caller-ID zu fälschen.

Beispiel:

callerid = "Mark Spencer" <(256) 428 6000>

host

host=[Host|dynamic]

Als host wird entweder der Hostname oder die IP-Adresse des anderen Rechners angegeben. Bei Hosts mit dynamisch vergebenen (also wechselnden) IP-Adressen verwenden Sie den Sonderfall host=dynamic, vorzugsweise in Kombination mit der Einstellung defaultip (defaultip).

Beispiele:

host = 192.168.0.201

host = dynamic

defaultip

defaultip = [IP-Adresse]

Die defaultip-Einstellung ergänzt host=dynamic (siehe host). Ist ein Host noch nicht bei Ihrem Server angemeldet, versucht Asterisk, Nachrichten an die hier definierte Standard-IP-Adresse zu schicken.

Beispiel:

defaultip = 192.168.0.201

permit

permit = IP-Adresse[/Netzmaske]

permit und deny erlauben und beschränken die IP-Adressen, von denen Verbindungen zum entsprechenden Eintrag möglich sind. Üblicherweise wird zuerst ein deny=0.0.0.0/0.0.0.0 (alle verbieten) vorangestellt und dann mit permit die erlaubte IP-Adresse oder ein Bereich von Adressen freigegeben. Die Reihenfolge von deny und permit ist entscheidend, und beide können für mehrere Hosts/Bereiche auch mehrfach auftreten. Wenn genau ein Host gemeint ist, können Sie die Netzmaske (wäre 255.255.255.255) weglassen.

Dieses Beispiel erlaubt nur Verbindungen aus dem Bereich 192.168.0.* (Netzmaske 24 Bits, Klasse C-Netzwerk):

deny = 0.0.0.0/0.0.0.0                ; alle verbieten
permit = 192.168.0.102/255.255.255.0  ; 192.168.0.* erlauben
permit = 192.168.5.5                  ; 192.168.5.5 erlauben

Alle erlauben bis auf 192.168.*.*:

permit = 0.0.0.0/0.0.0.0              ; alle erlauben
deny = 192.168.0.0/255.255.0.0        ; 192.168.*.* verbieten

Das nächste Beispiel ist nicht sinnvoll, da zuerst 192.168.0.0 - 192.168.0.127 verboten, dann aber wieder alle erlaubt werden, was die erste Regel überschreibt. So wird also nichts verboten:

deny = 192.168.0.0/255.255.255.127
permit = 0.0.0.0/0.0.0.0              ; alle erlauben

deny

deny = [IP-Adresse]/[Netzmaske]

Siehe permit (permit).

Beispiel:

deny = 0.0.0.0/0.0.0.0

auth

auth = [plaintext|md5|rsa]

Zum Identifizieren des anderen Peers/Users stehen 3 Methoden zur Auswahl: plaintext, md5 und rsa.

plaintext
Sehr unsicher, da das Passwort im Klartext übertragen wird. Sollte daher nicht verwendet werden. Das Passwort wird mit secret (secret) angegeben.
md5
In diesem Challenge/Response-Verfahren wird eine MD5-Prüfsumme übertragen. Das Passwort wird mit secret (secret) angegeben.
rsa
Das sicherste Verfahren durch öffentliche und private Schlüssel. Diese Schlüssel werden bei inkeys (inkeys) und outkeys (outkey) angegeben.

Mit auth legen Sie eine durch Komma getrennte Liste von erlaubten Authentifizierungsmethoden fest.

Beispiel:

auth = rsa,md5

Wenn Sie weder auth noch secret angeben, bedeutet das, dass keine Authentifizierung notwendig ist.

secret

secret = [Passwort]

Legt das Passwort für die Authentifizierungsmethoden plaintext oder md5 fest (siehe auth).

Beispiel:

secret = meinpasswort

inkeys

inkeys = [rsa-key:rsa-key:...]

Legt für die Authentifizierungsmethode rsa (siehe auth) den öffentlichen RSA-Schlüssel des zu authentifizierenden Systems fest. Um mehr als einen RSA-Schlüssel mit einer Benutzer-Kanaldefinition zu verknüpfen, trennen Sie die Schlüsselnamen mit einem Doppelpunkt (:). Jeder dieser Schlüssel wird dann eine Verbindung für gültig erklären können.

Diese Schlüssel müssen als Dateien so benannt sein: /var/lib/asterisk/keys/schluesselname.pub

Beispiel:

inkeys = server-koblenz:server-bonn

outkey

outkey = [rsa-key]

Sie können die outkey-Option verwenden, um sich bei einem Peer mit Hilfe eines RSA-Schlüssels zu authentifizieren. Für ausgehende Authentifizierung kann nur ein RSA-Schlüssel verwendet werden. Der outkey wird nicht verteilt, er ist Ihr privater Schlüssel und sollte 3DES-verschlüsselt sein.

Diese Schlüssel müssen als Dateien so benannt sein: /var/lib/asterisk/keys/schluesselname.key

Beispiel:

outkey = privater-schluessel

mailbox

mailbox = [Mailboxname[@Mailbox-Context]]

Wenn Sie in einer Kanaldefinition einen Peer mit einer Mailbox verknüpfen, wird Voicemail eine MWI (Message Waiting Indication)-Nachricht an die Knoten am Ende dieses Kanals schicken. Befindet sich die Mailboxnummer in einem anderen Voicemail-Context als default, können Sie sie als mailbox@context angeben. Um mehrere Mailboxen mit einem einzigen Peer zu verknüpfen, müssen Sie den mailbox-Befehl mehrmals verwenden.

Beispiel:

mailbox = 1000

language

language = [en|de|...]

Konfiguriert die Sprache für den entsprechenden Channel. Die Standardsprache ist Englisch. Diese Einstellung wird von verschiedenen Anwendungen wie z.B. der Voicemailbox oder auch der Applikation SayNumber() verwendet, um unterschiedliche Sprachbausteine zu benutzen.

Beispiel:

language = de

context

context = [Context]

Der Context dem Benutzer dieser Verbindung zugeordnet werden.

Beispiel:

context = default

regcontext

regcontext = [Context]

Sie können einen Context definieren, der automatisch beim ersten Registrieren eines Peers ausgeführt wird. Ist mit regexten keine Extension angegeben, so wird als auszuführende Extension der Name des Peers benutzt. Dabei ist zu beachten, dass Asterisk als Erstes automatisch ein NoOp mit der Priorität 1 ausführt. Als erste Priorität danach ist also die 2 zu benutzen. Mehrere Contexte können nacheinander aufgeführt werden; als Trennungszeichen wird ein & verwendet.

Beispiel:

regcontext = from-iax

regexten

regexten = [Nummer]

Wird in Verbindung mit regcontext verwendet, um die Extension zu spezifizieren, die in dem konfigurierten Context ausgeführt werden soll. Falls regexten nicht explizit konfiguriert ist, wird der Name des Peers als Extension verwendet.

Beispiel:

regexten = 3000

jitterbuffer

jitterbuffer = [yes|no]

Schaltet den Jitter-Buffer an oder aus (dies gilt bei Verbindungen, bei denen Asterisk als Endgerät fungiert). Der Jitter-Buffer gleicht unterschiedliche Laufzeiten der IP-Pakete aus.

Der Jitter-Buffer hat evtl. Probleme bei eingeschaltetem trunk (siehe trunk).

Beispiel:

jitterbuffer = yes

forcejitterbuffer

forcejitterbuffer = [yes|no]

Normalerweise ist es Aufgabe der Endgeräte einen Jitter-Buffer [91] zu realisieren. Sollte dies aus irgendeinem Grund nicht oder nur schlecht funktionieren (manche Geräte haben einen schlechten Jitter-Buffer), kann man diesen Buffer auch auf Asterisk als VoIP-Brücke aktivieren.

Beispiel:

forcejitterbuffer = yes

maxjitterbuffer

maxjitterbuffer = [Laenge in Millisekunden]

Mit diesem Parameter wird die maximale Größe des Jitter-Buffers eingestellt. Sie sollten diesen Wert i.d.R. nicht höher als 500 einstellen, sonst kann es zu Tonaussetzern kommen.

Beispiel:

maxjitterbuffer = 400

resyncthreshold

resyncthreshold=[Wert in Millisekunden]

Der Resynchronisierungs-Grenzwert wird benutzt, um den Jitter-Buffer, im Falle der Erkennung einer signifikanten Änderung über wenige Frames, neu zu takten/neu abzustimmen unter der Annahme, dass der Veränderung eine Verwechslung von Zeitstempeln zugrunde liegt. Der Resynchronisierungs-Grenzwert ist definiert als die gemessene Schwankung plus dem Wert von resyncthreshold, der in Millisekunden angegeben wird.

Beispiel:

resyncthreshold = 800

trunk

trunk = [yes|no]

Asterisk kann bei IAX-Verbindungen zu einer bestimmten IP-Adresse (z.B. beim Verbinden von zwei Asterisk-Servern) alle Channels über einen Trunk versehen. Dadurch wird der Overhead von mehreren Verbindungen zu einer Adresse reduziert. Der Trunk-Modus funktioniert nur mit geeigneter Hardware (Digium Zaptel) oder entsprechender Emulationssoftware für timing-Zwecke.[92].

Bei der Version 1.2.x arbeitet der Jitter-Buffer (siehe jitterbuffer) nicht gut bei eingeschaltetem Trunk-Modus.

Beispiel:

trunk = yes

trunkfreq

trunkfreq = [Wiederholrate in Millisekunden]

Mit trunkfreq wird in Millisekunden angegeben, wie oft Trunk-Nachrichten gesendet werden. Gilt nur, wenn trunk=yes gesetzt wurde.

Beispiel:

trunkfreq = 20

qualify

qualify = [yes|no|Zeit in Millisekunden]

Mit qualify=yes werden in festen Zeitabständen Ping-Nachrichten an die entfernten Peers gesendet, um herauszufinden, ob sie verfügbar sind und welche Latenz zwischen den Antworten liegt. Die Peers antworten mit Pong-Nachrichten. Ein Peer wird als nicht erreichbar angesehen, wenn innerhalb von 2000 ms noch keine Antwort vorliegt (um diese Voreinstellung zu ändern, setzen Sie qualify auf die entsprechende Anzahl an Millisekunden, die auf eine Anwort gewartet werden soll). Einige Endgeräte (/Software) kommen nicht mit diesen Nachrichten zurecht.

Beispiel:

qualify = yes

qualifysmoothing

qualifysmoothing = [yes|no]

Stellt ein, ob für die Verfügbarkeitsprüfung durch qualify immer der Mittelwert der letzten beiden Pong-Nachrichten verwendet werden soll. Hosts mit schlechter Verbindung könnten sonst fälschlicherweise als nicht verfügbar eingestuft werden.

Beispiel:

qualifysmoothing = yes



[77] Das fragen sich viele! ;-)

[78] IP-Adressen aus dem privaten Bereich beginnen beispielsweise mit 10. oder mit 192.168., also zum Beispiel 10.128.1.16 oder 192.168.1.3.

[79] Es gibt mittlerweile viele unterschiedliche Formen von NAT-Gateways, mit zum Teil sehr spezieller Funktionsweise. Hier wird lediglich das grundlegende Funktionsprinzip eines NAT-Gateways und die damit verbundenen Auswirkungen beschrieben.

[80] In seltenen Fällen nutzen Firmen trotz der Verwendung von offiziellen IP-Adressen auch für interne Rechner ein NAT-Gateway. Oft, weil sie zum Beispiel die Größe des Netzes nach außen maskieren möchten und sich generell gewisse Sicherheitsvorteile davon erhoffen.

[81] Type of Service, siehe ToS und DSCP

[82] Network Address Translation, wird häufig von Routern verwendet, die zwischen einem privaten Netz und dem öffentlichen Internet vermitteln

[83] Message Waiting Indicator

[84] Hier ist immer IAX2, also IAX Version 2 gemeint.

[88] Wird per FSK (Frequency Shift Keying, dt.: Frequenzumtastung) übertragen.

[89] Asterisk-RSA-Schlüssel finden sich normalerweise in /var/lib/asterisk/keys/. Sie können mittels des astkey-Skripts eigene Schlüssel generieren.

[90] Die eckigen Klammern sind hier Pflicht und nicht wie im Rest des Buches als Optionsangabe zu lesen.

[91] Jitter bezieht sich auf die variierende Latenz zwischen den Datenpaketen. Bei zu großen Schwankungen kann es zu Tonausfällen kommen.

[92] Zum Beispiel das bei Asterisk enthaltene Kernel-Modul ztdummy oder zaprtc von Junghanns (http://www.junghanns.net/downloads/).


Version 1.2, November 2002

Neue Version verfügbar

Sie betrachten gerade die alte Version des Buches (Version 1.0). Wir empfehlen Ihnen für Asterisk 1.4 und 1.6 die neue Version des Buches.

Asterisk-Tag 2008

Lernen Sie Mark Spencer (den Erfinder von Asterisk) kennen! Viele Vorträge, Case-Studies und Workshops rund um das Thema VoIP. Asterisk-Tag.org

Das gedruckte Buch

Werbung