SIP hat sich de facto als Standardprotokoll im VoIP-Umfeld etabliert. Warum?[35]
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 die 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 (was einen großen Verwaltungsoverhead bedeutet).
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 eventuell ein Paket fehlt. Dieses kann dann noch einmal 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. |
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 für alle bereits vorhandenen Geräte ist.
Anmerkung | |
---|---|
Der IPv4-Adressraum verfügt „nur“ über 232 einzelne Adressen. 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 Millionen Adressen) in den Anfangstagen des Internets großzügig auch einzelnen Firmen zugeteilt wurden. |
Eine Lösung dieses Problems besteht darin, Rechner bzw. gesamte Rechnernetze über ein sogenanntes 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[36] verfügen. Ein NAT-Gateway nimmt alle Anfragen von Rechnern aus dem privaten Netz (meist Intranet genannt) entgegen 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.[37] 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 funktioniert 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 Pakets. 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 Adresse 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.[38] 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, finden Sie 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 |
In der extensions.conf
werden Kanäle zu
SIP-Geräten in der Form
SIP/
angegeben. Um einen
beliebigen SIP-User über das Internet zu erreichen, verwendet man
Gerätename
SIP/
,
für einen User auf einem Proxy gibt man
user
@domain
SIP/
oder
proxy
/user
SIP/
an, wobei der Proxy als Abschnitt definiert sein muss (siehe „Geräte-Einstellungen“).user
@proxy
Nützliche CLI-Befehle:
sip show peers
- Listet alle SIP-Peers auf (auch Friends).
sip show users
- Listet alle SIP-User 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.
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 Parametern finden Sie in der
sip.conf
.
In der Regel ist es möglich, diese Einstellungen auch für einzelne User/Peers vorzunehmen.
allowtransfer = [yes|no]
Transfer von Verbindungen erlauben. Default: yes
allowtransfer=yes
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 = Portnummer
Der UDP-Port, auf dem SIP-Verbindungen entgegengenommen werden sollen. Default: 5060.
bindport=5060
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
Für SIP können 3 TOS[39]-Parameter angegeben werden, um SIP-Paketen im Netzwerk
eine andere Priorität als z. B. Datenübertragungen zu geben. Eine
genauere Beschreibung finden Sie unter „tos
“. In der Regel sollte man diese Werte
angeben (per Default sind sie 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
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 außer ilbc erlauben: allow=all disallow=ilbc ; Beispiel: nur die Codecs gsm und ulaw erlauben: disallow=all allow=gsm allow=ulaw
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, sonstinband
.
dtmfmode=rfc2833
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 ohne diese globale Einstellung nicht aktiviert werden.
videosupport=yes
maxcallbitrate = Übertragungsrate
Bestimmt die maximale Übertragungsrate für Video-Telefonate in
Kilobit pro Sekunde. Default: 384
(für 384 Kbit/s).
maxcallbitrate=384
g726nonstandard = [yes|no]
Mit dieser Option stellen Sie 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 = Intervall
Sendet im in Sekunden angegebenen Intervall Keep-Alive-Pakete im RTP-Stream, um NAT[40]-Routen offen zu halten.
rtpkeepalive=5 ; alle 5 Sekunden Keep-Alive-Pakete senden
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 =>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 = 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 = 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 = 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 = [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
- sollenUPDATE
-Pakete zum Umleiten verwendet werden. Kann mitnonat
alsupdate,nonat
kombiniert werden.
canreinvite=nonat
jbenable = [yes|no]
Schaltet den „Jitter-Buffer“ für eingehendes Audio
ein, wenn das nötig ist. Dadurch können unterschiedliche Latenzen von
IP-Paketen ausgeglichen werden (siehe Jitter). Default: no
jbenable=yes
jbforce = [yes|no]
Schaltet den Jitter-Buffer immer ein. (Natürlich muss auch
jbenable
aktiviert sein.) Default: no
jbforce=no
jbmaxsize = Länge
Maximale Größe des Jitter-Buffers in Millisekunden. Default: 200.
jbmaxsize=200
jbresyncthreshold = Länge
Resynchronisationsrahmen des Jitter-Buffers. Default: 1000.
jbresyncthreshold=500
jbimpl = [fixed|adaptive]
Bestimmt, welcher Jitter-Buffer-Algorithmus verwendet wird. Bisher sind zwei Algorithmen implementiert:
fixed
- (default) Der klassische 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
Nach den allgemeinen Einstellungen können Verbindungen zu anderen Geräten in Abschnitten definiert werden. Das sind entweder User, Peers oder Friends (Friend ist die Kombination aus User und Peer).
In der Regel 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 Caller-ID 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 = [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
undpeer
in einem Abschnitt.
type=peer
secret = Passwort
Unser Passwort, mit dem wir uns authentifizieren, bzw. das Passwort des anderen Geräts, um sich bei uns zu authentifizieren.
secret=geheim
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 = IP-Adresse
Unter der angegebenen Adresse wird versucht, einen Host
(host=dynamic
) zu erreichen, der sich noch nicht bei uns
registriert hat.
defaultip=192.168.0.33
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 =Vorname
Nachname
<Nummer
>
Überschreibt die Caller-ID, die vom Gerät gesendet wird (und damit oft nicht vertrauenswürdig ist).
callerid=Hans Meier <1234>
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 =Nummer
[@Context
][,Nummer
[@Context
][,...
]]
Ordnet dem User eine Mailbox im angegebenen Voicemail-Context
(oder default
) zu. Dadurch werden die entsprechenden
MWI[41]-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 = [yes|no]
Schickt MWI-Nachrichten (siehe „mailbox
“) nur dann, wenn das Gerät danach
fragt.
subscribemwi=yes
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
Mit allow
und disallow
können bestimmte
Sprachcodecs erlaubt oder nicht erlaubt werden (siehe „Sprach-Codecs (allow
, disallow
)“).
regexten = Extension
Erzeugt dynamisch eine Extension, wenn sich das Gerät anmeldet.
regexten=1234
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 = 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 = Gruppen
Bestimmt die Pickup-Groups für das Gerät, gibt also an, für welche
der durch callgroup
angegebenen Gruppen Pickup (das
Heranholen von Gesprächen) erlaubt ist.
pickupgroup=2,4-6 ; Pickup für die Gruppen 2,4,5,6 erlauben
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 =Variablenname
=Wert
Setzt eine Channel-Variable für alle Anrufe von diesem Gerät.
setvar=KUNDENNR=1234
[35] Das fragen sich viele! ;-)
[36] IP-Adressen aus dem privaten Bereich beginnen beispielsweise mit 10. oder mit 192.168., lauten also zum Beispiel 10.128.1.16 oder 192.168.1.3.
[37] Es gibt mittlerweile viele unterschiedliche Formen von NAT-Gateways, mit zum Teil sehr spezieller Funktionsweise. Hier werden lediglich das grundlegende Funktionsprinzip eines NAT-Gateways und die damit verbundenen Auswirkungen beschrieben.
[38] In seltenen Fällen nutzen Firmen trotz der Verwendung von offiziellen IP-Adressen auch für interne Rechner ein NAT-Gateway. Oft tun sie das, weil sie zum Beispiel die Größe des Netzes nach außen maskieren möchten und sich generell gewisse Sicherheitsvorteile davon erhoffen.
[40] Network Address Translation, wird häufig von Routern verwendet, die zwischen einem privaten Netz und dem öffentlichen Internet vermitteln.
[41] Message Waiting Indicator
AMOOCON 2010
Noch kein Ticket? Dann wird es Zeit. Nur noch wenige Tage.
- Infos unter www.amoocon.de.
- twitter.com/AMOOCON