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).
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. |
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.
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.
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 „Channel-Einstellungen“).user
@proxy
Nützliche CLI-Befehle:
sip show peers
sip show users
sip show registry
sip debug
bzw. sip set debug
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 = Contextname
Bestimmt den Context im Dialplan für eingehende Anrufe.
context=default
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[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
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
dtmfmode = Modus
Verfahren, wie DTMF-Töne gesendet werden. Mögliche Werte:
rfc2833
info
inband
auto
rfc2833
wenn möglich, sonst
inband
.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 nicht aktivierten werden ohne diese globale Einstellung.
videosupport=yes
maxcallbitrate = Übertragungsrate
Bestimmt die maximale Übertragungsrate für Video-Telefonate in
Kilobits pro Sekunde. Default: 384
(für 384 kb/s).
maxcallbitrate=384
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 = 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 = [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.
(default) Normale Einstellung. Asterisk versucht, den kürzesten Audio-Pfad zu verwenden.
Nur umleiten, wenn sich die Teilnehmer nicht hinter einem NAT befinden (sofern das für Asterisk erkennbar ist).
Statt INVITE
- UPDATE
-Pakete zum
Umleiten verwenden. Kann mit nonat
als
update,nonat
kombiniert werden.
canreinvite=nonat
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 = [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
Resynchronisations-Rahmen des Jitter-Buffers. Default: 1000.
jbresyncthreshold=500
jbimpl = [fixed|adaptive]
Bestimmt, welcher Jitter-Buffer-Algorithmus verwendet wird. Bisher sind zwei Algorithmen implementiert:
fixed
jbmaxsize
).adaptive
jbimpl=adaptive
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 = [user|peer|friend]
Die Art des Geräts
user
peer
friend
user
und peer
in einem
Abschnitttype=peer
context = Contextname
Der Context im Dialplan für eingehende Anrufe.
context=from-birnenbrei
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 = Benutzername
Unser Benutzername / Account auf dem anderen Rechner.
username=apfelmus
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 ein Host
(host=dynamic
) zu erreichen versucht, der sich noch nicht
mit 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 CallerID, 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[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 = [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, 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
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
[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.
[37] Network Address Translation, wird häufig von Routern verwendet, die zwischen einem privaten Netz und dem öffentlichen Internet vermitteln
[38] Message Waiting Indicator