[Berlin-wireless] SIP Rant
Sven-Ola Tuecke
sven-ola
Mo Jun 3 11:15:37 CEST 2013
Hey,
muss mal eine Runde stänkern. SIP und STUN sind *DER ALLERGRÖBSTE
HANDWERKLICHE MIST*. Welche Trottel waren das...?
Hintergund: auf dem VPN03-Server sind ja mittlerweile $Leute drauf. Die
wollen natürlich auch mal telefonieren. Wenn man kein Skype mag: dann
möchte man SIP. Aber SIP hat von Haus aus ein Problem mit NAT
(phänotypisch: eingehendes Audio funktioniert nicht). Gab es damals wohl
noch nicht. Immer dasselbe. Was? Nun, weil die meisten Gateways auf
Linux basieren und Linux nun mal Symmetric-NAT macht. Da werden die
Quell-Port-Nummern bei jeder neuen Verbindung am NAT-Gateway neu
ausgewürfelt. War schon immer so, wird auch so bleiben, geht nicht weg
(jedenfalls in den letzten 20 Jahren nicht).
Nun war der Trottel, das das mit dem SIP verbrochen hat , der Meinung es
müssten unbedingt IP-Adressen und vor allen Dingen Port-Nummern im
SIP-Protokoll möglichst tief versteckt mit übertragen werden. Das geht
natürlich schief wenn da irgendwas an IP-Adressen und Portnummern
herumschraubt. NAT tut das. Dann hat irgend ein anderer $Schlauberger
sich das STUN-Protokoll ausgedacht. Damit ermittelt ein Telefon, welche
externe IP-Adresse es hat. Allerdings auch (schlimmer) welche
Quell-Port-Nummer es für den Audio-Stream verwenden soll. Das Telefon
fragt also irgendeinen STUN-Server, bekommt eine valide externe
IP-Adresse und *IRGENDEINE* Portnummer. Mit der Info soll jetzt
telefoniert werden. RTP wird aufgebaut $Ermittelte-Portnummer zu
$SIP-Provider-Portnummer. Und was passiert? Der SIP-Provider sendet an
$Ermittelte-Portnummer. Und das funktioniert dann nicht, weil die
RTP-Session ein ganz anderer Server als der STUN-Server ist und weil
sowieso die Quell-Portnummer am Linux-NAT für *jede neue* UDP-Verbindung
neu ausgewürfelt wird. Kurz: die hereinkommenden RTP-Pakete purzeln nach
/dev/null weil das Gateway einfach nicht weiss, wo die hin sollen.
Kommt ein weiterer Schlauberger. Und implementiert ein
NAT-Helper-Kernel-Modul für Linux. Nennt sich SIP-ALG. Noch etwas, was
an Ports und IP-Adressen herumschraubselt. Toll: auf dem VPN03-Gateway
gibt es nun mal 64 IP-Adressen und nicht eine. Das blöde Modul bekommt
das aber nicht mit, haut also die falsche IP-Adresse in die SIP-Pakete.
Folge: nix geht. Irgendwelche Kernelmodule-Ladeparameter? Ja - aber nix
mit IPs. Das kann ja heiter werden.
Jetzt kommt der nächste Schlauberger. Der denkt sich: na gut, wenn das
Telefon sich mit einer privaten IP (192.168.x.x oder 10.x.x.x) meldet
schalte ich den ganzen Krams aus und mach' es richtig. Geht so bei
SipGate, aber sicher nicht bei allen SIP-Providern. Immerhin: das
funktioniert. Wenn das Telefon keine 104er hat. Die 104er haben wir und
geklaut und die sind von SipGate aus nicht als Private-IP zu erkennen.
Grmbl. Gilt auch auch für andere "geklaute" IP-Bereiche, z.B. für die
IPs von US-Miltär / US-Grokos / USblabla.
Auftritt des allerletzten (hoffentlich) Schlaubergers. ICE soll es jetzt
richten. Eines Tages guck ich mir das bestimmt mal an. Hoffentlich nicht
wieder so ein Mist.
Gruß an Wireshark für die wirklich hilfreichen Telefonie-Tools
(speziell: Telefonie->VoIP). Nur das mit den Würfelquellports, da fehlt
was - da muss man erst in SIP/Invite bzw. SIP/OK in den Message-Body,
darin das SDP, dann das Media-Description aufklappen um erst dann die
Portnummer angucken zu können. Da geht noch was.
Kurzfassung: STUN ausschalten und 192.168er für Telefon verwenden.
Achso. Die diversen Proxydinger hab' ich jetzt noch nicht durch. Ich
nehme an die funktionieren auch nicht.
// Sven-Ola
Mehr Informationen über die Mailingliste Berlin