Grundlagen:
Man nehme eine Asterisk TK-Anlage hinter einer FritzBox. Alle 90 Sekunden registriert sich in der Regel die Anlage beim Provider (z.B. Easybell).
Ist dies dem Anbieter zu häufig, antwortet er auf die Registrierung mit einem
Contact: <sip:nummer@IP:5060>;expires=600
expires=600 ist eine Aufforderung an den Client, zukünftig nur alle 600 Sekunden eine neue Registrierung anzustoßen.
Das tritt auch auf, wenn man z.B. mehrere Rufnummern in Askozia einzeln beim Provider registriert. Das führt dann zu zu häufigen Registrierungen.
Die Probleme:
Damit der Anbieter eingehende Anrufe an die Asterisk signalisieren kann, besteht eine mehr oder weniger dauerhafte Verbindung zwischen Asterisk und dem Provider. Firewalls vor der Asterisk benötigen regelmäßigen Verkehr, damit die Verbindung auch in der Firewall dauerhaft aufrecht erhalten bleibt.
Wie sieht das konkret aus:
12:16:03.692450 IP askoziapbx.local.5060 > 195.185.37.60.5060: SIP: REGISTER sip:sip.easybell.de SIP/2.0
12:16:03.727299 IP 195.185.37.60.5060 > askoziapbx.local.5060: SIP: SIP/2.0 401 Unauthorized
12:16:03.728225 IP askoziapbx.local.5060 > 195.185.37.60.5060: SIP: REGISTER sip:sip.easybell.de SIP/2.0
12:16:03.771253 IP 195.185.37.60.5060 > askoziapbx.local.5060: SIP: SIP/2.0 200 OK
Nach diesen 4 Paketen ist die Nummer registriert und es besteht eine zeitlich beschränkte Verbindung zwischen Asterisk und Anbieter.
Bug/Problem 1:
Das Easybell-Providertemplate von Askozia (ist Asterisk) nutzt Port 5064 als Port zu Registrierung. Dieser Port wird jedoch im ausgehenden REGISTER ignoriert. Dies scheint ein bekannter Asterisk-Bug zu sein. In obigem TCPDUMP wird 5060 statt 5064 verwendet.
Dies alleine wäre noch nicht so fatal – die Nummer ist ja registriert.
Da jedoch Firewalls nicht jede Verbindung dauerhaft offen halten (FritzBox¹ z.B. max 5 Minuten für UDP-Verbindungen), muss innerhalb von 5 Minuten mindestens einmal Verkehr zum Provider stattfinden, damit die Verbindung dauerhaft besteht und eingehende Anrufe signalisiert werden können.
Entweder man registriert die Rufnummer in einem kurzen Intervall (< 5 Minuten) ständig neu, oder man nutzt Keep-Alive (Ping-Pong) Pakete zwischen Provider und Asterisk.
Diese Pakete sehen wie folgt aus:
12:15:44.082202 IP askoziapbx.local.5060 > 195.185.37.60.5064: SIP: OPTIONS sip:sip.easybell.de SIP/2.0
12:15:44.112037 IP 195.185.37.60.5064 > askoziapbx.local.5060: SIP: SIP/2.0 200 Alive
Problem 2:
Diese Pakete sind jedoch wertlos für die eigentliche Anrufsignalisierung des Providers, da hier die Ports anders sind. Hier verwendet Asterisk den korrekten Port 5064.
Durch obige Keep-Alive-Pakete hat die Firewall in ihrer NAT-Tabelle einen Eintrag in der Form:
askoziapbx.local.5060 > 195.185.37.60.5064
Antworten (genau andersrum) von
195.185.37.60.5064 > askoziapbx.local.5060
werden automatisch weitergeleitet und können einer Verbindung zugeordnet werden.
Eingehende Anrufe werden jedoch vom Anbieter in folgender Form signalisiert:
11:57:14.713468 IP 195.185.37.60.5060 > askoziapbx.local.5060: SIP: INVITE sip:zielnummer@öffentliche-IP:5060 SIP/2.0
Man beachte die Ports. Diese passen nicht zur obigen erwarteten Verbindung Provider:5060 an eigene-IP:5060 und werden deshalb verworfen.
Lösung(en)?
Bug in Asterisk fixen (lassen). Ticket bei Askozia ist offen seit Juni 2017. Alterantiv den Standardport 5060 im Providertemplate nutzen, damit OPTIONS- und REGISTER-Ports zusammen passen.
UDP-Timeout in Firewall erhöhen auf > Registrierdauer bei Provider
Mit Netcat ständig Verbindung zwischen Anlage & Provider aufrecht erhalten
Verkehr generieren, der die UDP-Verbindung in FW aufrecht erhält.
Grausiger Workaround – Dummy-Sip-Nummer in FritzBox registrieren – das hat dazu geführt, dass der Port 5060 irgendwie offen bleibt für Geräte dahinter. Jedoch nur bis zu einer bestimmten Anzahl von SIP-Nummern. Eigentlich keine Lösung.
¹ https://avm.de/service/fritzbox/fritzbox-7360-sl/wissensdatenbank/publication/show/907_Anwendung-z-B-SSH-verliert-gelegentlich-die-Verbindung-zu-Gegenstellen-im-Internet/