SIP

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

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]

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]

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[33], 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[34]. 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.[35] 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]

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[36]-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[37]-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 zulasse
n

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[38]-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


[32] Das fragen sich viele! ;-)

[33] 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.

[34] 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.

[35] 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.

[36] Type of Service, siehe ToS und DSCP

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

[38] Message Waiting Indicator