[Gelöst] Asterisk 16.16.1 PJSIP NAT automatische Neuregistrierung nach Erhalt einer neuen externer IP-Adresse

Kuli70

Neuer User
Mitglied seit
26 Jan 2022
Beiträge
54
Punkte für Reaktionen
1
Punkte
8
Ich erlaubbe mir das Thema mal neu zu eröffnen, da die meisten Antworten und Vorschläge dazu schon zeimlich alt sind und sich auf alte Asterisk Versionen beziehen.
Ich bin mir nicht sicher, ob Asterisk mittlerweile weiter entwickelt ist und bessere Lösungen als einen Neustart über einen cron-job bietet.

Das Thema kennt Ihr. Asterisk registriet einer oder mehreren Rufnummern beim Provider. Solange sich IP-Adresse des NAT-Routers nicht ändert, sind ausgehende und eingehende Anrufe möglich (so soll es sein). Bekommt man durch einen Neustart oder eine Zwangstrennung eine neue IP-Adresse, bekommt der Asterisk-Server dies nicht mit. Das at zur Folge, dass man weder ausgehende noch eingehende Anrufe funktionieren, das die alte Registrierung nicht mehr funktioniert => Reject.

Gibt es für diesen Fall mittlerweile eine Lösung, die Asterisk von sich aus mit bringt?

Wenn nein, kann mir jemand helfen ein funktionierendes Script zu implementieren, welches eine Änderung der externen IP bemerkt, einen Neuregistrierung veranlasst und auch mit meiner Astrisk-Version funktioniert?
 
Moinsen


Vielleicht kann Asterisk dazu gebracht werden, dass...
Rich (BBCode):
/etc/asterisk# cat res_stun_monitor.conf
;
; Configuration file for the res_stun_monitor module
;
; The res_stun_monitor module sends STUN requests to a configured STUN server
; periodically.  If the monitor detects a change in the external IP address or port
; provided by the STUN server an event is sent out internally within Asterisk
; to alert all listeners to that event of the change.

; The current default listeners for the network change event include chan_sip
; and chan_iax.  Both of these channel drivers by default react to this event
; by renewing all outbound registrations.  This allows the endpoints Asterisk
; is registering with to become aware of the address change and know the new
; location.
;
[general]
;
; ---- STUN Server configuration ---
;  Setting the 'stunaddr' option to a valid address enables the STUN monitor.
;
stunaddr = stun.1und1.de        ; Address of the STUN server to query.
                                ; Valid form:
                                ;   [(hostname | IP-address) [':' port]]
                                ; The port defaults to the standard STUN port (3478).
                                ; Set to an empty value to disable STUN monitoring.
                                ;   Default is disabled.
stunrefresh = 30                ; Number of seconds between STUN refreshes.
                                ;   Default is 30.
...chan_pjsip auch auf so einen Event (Ereignis) mit Erneuerung der Registration reagieren kann.
Auch wenn ICE/STUN für das Routing nicht genutzt wird sehe ich, bei einer Zwangstrennung mit anschliessender neuer IP beispielsweise, eine Neuregistrierung von SIP und IAX diverser User/Peer.
...welche von res_stun_monitor angestossen (als Ereignis) wurde, aber von chan_pjsip noch getriggert (Ereignis erkennen und reagieren) werden müsste.
Das (chan_pjsip) ist jedoch (noch) nicht meine Baustelle. So dass ich nur darauf hinweisen möchte, wie es auch mit chan_pjsip klappen könnte.
 
Zuletzt bearbeitet:
Ich habe das gerade mal ausprobiert und die beiden Einträge in der "res_stun_monitor.conf" gemacht.
Danach habe ich den Router neu gestartet (neue IP).

Es scheint zu funktionieren und somit auch auf die pjsip zu wirken.
Hätte nicht gedacht, dass es so einfach ist.

Danke
 
Dann kannste mit stun show status in der *-Konsole deine externe IP prüfen/sehen.
...und welchen Port STUN für SIP Registrierungen nutzen würde (Rückadresse, wenn aktiviert).

@Kuli70 - So sieht das Ereignis "Zwangstrennung" in der geschwätzigen Asterisk Konsole ( asterisk -rdddvvv ) aus...
Code:
[Mar 17 03:04:27] NOTICE[19877]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port 46.142.33.216:59385 now seen as 46.142.33.153:59385.
 SIP, got a network change message, renewing all SIP registrations.
 IAX, got a network change message, renewing all IAX registrations.
 
Zuletzt bearbeitet:
Hallo,
Ich (Asterisk 18) hab das aus Neugier eben mal nachgebaut und den STUN Server meines Providers wie im Beispiel in der res_stun_monitor.conf eingegeben.

Allerdings hat das bisher keine Auswirkungen. Bei vollem Debug lese ich nichts von irgendwelchen STUN Meldungen. Mir ist auch aufgefallen, dass mir das Kommando "stun show status" gar nicht zur Verfügung steht. Ich hab nur

Bash:
CLI> stun set debug on
STUN Debugging Enabled

Danach ist aber dann sehr still. Hab das grad eine Stunde so stehen lassen, kam keine Meldung.

Hat jemand eine Idee was ich falsch mache? Oder liegts an Asterisk 18? Ich google mal weiter inzwischen.

Danke und lieben Gruß!
 
Kann mich nur entschuldigen für meine Frage. Wie peinlich, es war einfach res_stun_monitor bei mir nicht geladen...
 
Nicht doch. Sowas passiert halt (auch mir ) mal.
Ansonsten hätte ich gefragt: stun show status
Rich (BBCode):
*CLI> module unload res_stun_monitor.so
Unloaded res_stun_monitor.so
 Unloading res_stun_monitor.so
[Mar 23 17:19:20] NOTICE[9522]: res_stun_monitor.c:220 stun_stop_monitor: STUN monitor stopped
*CLI> stun show status
No such command 'stun show status' (type 'core show help stun show' for other possible commands)
*CLI> module load res_stun_monitor.so
Loaded res_stun_monitor.so
[Mar 23 17:19:56] NOTICE[9522]: res_stun_monitor.c:258 stun_start_monitor: STUN monitor started
 Loaded res_stun_monitor.so => (STUN Network Monitor)
...dann wäre das "module show like res_stun_monitor.so" meine nächste Frage gewesen ;)
 
Danke Dir!

Ich hab das inzwischen mal ein wenig beobachtet. Zwei Dinge fallen mir auf

1) Falls noch nicht geschehen, ist spätestens ab dem Einsatz von stun_monitor zu empfehlen, die notices aus dem logger zu entfernen. Ansonsten bläst man sich die Platte auf mit Meldungen wie

Code:
[Mar 23 18:32:44] NOTICE[3222]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port EXTERNE-IP:32223 now seen as EXTERNE-IP:45471.
[Mar 23 18:34:44] NOTICE[3222]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port EXTERNE-IP:45471 now seen as EXTERNE-IP:22197.
[Mar 23 18:36:44] NOTICE[3222]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port EXTERNE-IP:22197 now seen as EXTERNE-IP:54193.
[Mar 23 18:38:44] NOTICE[3222]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port EXTERNE-IP:54193 now seen as EXTERNE-IP:63283.
[Mar 23 18:40:44] NOTICE[3222]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port EXTERNE-IP:63283 now seen as EXTERNE-IP:62273.
[Mar 23 18:42:44] NOTICE[3222]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port EXTERNE-IP:62273 now seen as EXTERNE-IP:21033.
[Mar 23 18:44:44] NOTICE[3222]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port EXTERNE-IP:21033 now seen as EXTERNE-IP:23095.

(Natürlich ist bei einem typischen NAT Router der ausgehende Source Port immer ein anderer)

2) Der stun_monitor beschränkt sich anscheinend wirklich nur auf das Erkennen von Änderungen der externen IP. Die aus meiner Sicht klassischen STUN Funktionen (also dass die IP/Port Werte die ermittelt werden auch in die SIP Pakete eingetragen werden), kriegt man damit nicht abgebildet. Aber ich glaube das wurde eh andernorts hier schon öfter erwähnt.
 
Ansonsten bläst man sich die Platte auf mit Meldungen
Bei mir nur zur 1&1 Zwangstrennung ( zwischen 3:00 - 4:00 Morgens, wie in Post #4 ) oder nach "echten" Internetausfall/Syncverlust.
...also ideal für die: Störungserkennung


chan_pjsip.so
IP/Port Werte die ermittelt werden auch in die SIP Pakete eingetragen werden
In der Config für einen type = endpoint mit...
Code:
ice_support=yes ;This is specific to clients that support NAT traversal
;for media via ICE,STUN,TURN. See the wiki at:
;https://wiki.asterisk.org/wiki/x/D4FHAQ
;for a deeper explanation of this topic.
...sollte sich dann so verhalten.
Quelle:
https://asterisk-users.digium.narki...-between-chan-sip-and-pjsip-with-nat-and-stun
 
Zuletzt bearbeitet:
Vielen Dank! werde ich probieren.

Was die häufigen Meldungen über geänderte Source Ports angeht, so habe ich hier rausgefunden dass dies mit dem UDP Aging auf meinem Router zusammenhängt. Das war mit 20 Sekunden doch recht niedrig eingestellt, insbesondere im Vergleich zu meinem Stun-Intervall, den ich auf 60 Sekundne gestellt habe.
Somit ist auf der NAT Tabelle des Routers der Verbindungsaufbau immer raus gealtert bis der nächste kam, was dann natürlich zu einem neuen Source Port geführt hat. Habe das UDP Aging angehoben, nun ist hier Ruhe.
 
Irgendwas fehlt mir trotzdem noch. Ich hab jetzt ebenfalls mal einen IP Wechsel durchgespielt, der Verbose Output sieht so aus:

Code:
[Mar 24 16:21:24] NOTICE[10704]: res_stun_monitor.c:149 stun_monitor_request: Old external address/port 78.x.x.x:47085 now seen as 46.x.x.x:47085.
 IAX, got a network change message, renewing all IAX registrations.

Also IAX macht ein Renew. Aber PJSIP nicht. Muss das noch in Endpoint Einstellungen aktiviert werden?
 
chan_pjsip.so ist leider immer noch nicht meine Baustelle.
...kann also kaum bis gar nichts zum Troubleshooting beitragen.

Aber ich schätze @sonyKatze kennt sich da besser aus als icke.
...der gerade durch die Erwähnung seines Nicknamens eine Info erhalten hat ;)
 
Wieder meine Schuld ;-)
Ich hab mal wieder zu wenig RTFM gemacht. Steht ja eh im configfile und somit sogar in diesem Thread

Code:
; The current default listeners for the network change event include chan_sip
; and chan_iax.

Danke Dir aber für den Schubs in die richtige Richtung. Dann kann ich mir mit PJSIP die STUN Implementierung von Asterisk wohl derzeit eher in die Haare schmieren ;-)
 
Also ich hab mal auf die Schnelle ein Script geschrieben. Es wird lediglich der stunclient Befehl benötigt, dieser ist zum Beispiel Teil des Pakets Stuntman http://www.stunprotocol.org/ .
Das Script fragt einen STUN Server ab und prüft ob sich die externe IP seit dem letzten Lauf geändert hat (dazu wird eine temporäre Datei /tmp/current_external_ip verwendet.
Falls nicht, wird nichts gemacht. Falls ja erfolgt ein asterisk reload.
Das Script könnte man alle paar Minuten per cron ausführen lassen.

Ich habe das natürlich jetzt noch nicht im Dauerbetrieb testen und beobachten können, auch weiß ich derzeit noch nicht ob ein Reload auch wirklich immer ausreicht. Wird sich die nächsten Tage und Wochen raus stellen.

Bash:
#!/bin/sh
FILE=/tmp/current_external_ip
STUNSERVER="stun.12voip.com"


if [ -f "$FILE" ]; then
    echo "$FILE exists. Checking if external IP has changed."
    LAST_IP=`cat $FILE`
    LAST_CHECK=`date -r $FILE "+%d-%m-%Y %H:%M:%S"`
    CURRENT_IP=`stunclient $STUNSERVER 3478 | grep "Mapped" | sed 's/:/\n/g' | tr -d " " | tail -n2 | sed -n 1p`
    if [ "$LAST_IP" = "$CURRENT_IP" ]; then
    echo "External IP ($CURRENT_IP) checked on $LAST_CHECK did not change. Nothing to do."
    else
    echo "External IP changed from $LAST_IP to $CURRENT_IP. Reloading asterisk."
    /usr/sbin/asterisk -r -x "core reload"
    echo "$CURRENT_IP" > $FILE
    fi
else
    echo "$FILE does not exist. Creating."
    /usr/bin/stunclient $STUNSERVER 3478 | grep "Mapped" | sed 's/:/\n/g' | tr -d " " | tail -n2 | sed -n 1p > $FILE
fi
 
Zuletzt bearbeitet:
  • Like
Reaktionen: koyaanisqatsi
Cool, aber nicht mit Spatzen auf Kanonen schiessen :cool:
...damit mein ich: Reicht nicht ein pjsip reload ?
A: Nein - Ich denke du machst das schon richtig...
...wenn ich das so lese, würde ich sogar ein: service asterisk reload
...machen.

PS: asterisk -x 'core reload' ist nicht sooo interactiv ;)
( -r macht ja eigentlich die interactive *-Konsole auf )
 
Danke für Deinen Input!
Erfahrungsgemäß denke ich, dass ein core-reload hier das Mittel der Wahl ist. Ich werds aber wie gesagt die nächste Zeit mal beobachten und berichten.
 
Hallo. Ich seit einiger Zeit habe ich wieder das Problem, dass die hier gefundene Lösung nicht mehr funktioniert.
Asterisk registriert sich sich nicht neu, obwohl über den STUN-Server eine neue IP-Adresse identifiziert wurde.
Alle Rufnummern lassen sich nicht erreichen und beutzen.
pjsip list registrations = alle 3 Rufnummern Status Rejected
Nach Asterisk Neustart erfolgt eine Neuregistrierung und alles funktioniert wieder. Aber dass kann ich ja nicht jeden Tag manuell machen.

Gibt es dazu ähnliche Erfahrungen/Beobachtungen und einfache Lösungsansätze?
 
Danke. Respekt vor dieser Erklärung, aber ich fürchte die bekomme ich ohne Schritt für Schritt Anleitung nicht hin.
Ich werde es bei Zeiten aber mal versuchen und hoffe dabei, dass es bei meiner Version 16 genau so funktioniert.

Gibt es nicht einfache Lösung für Menschen die nicht so fit mit Linux und Astrisk sind?
Bei mir läuft Asterisk 16 auf einem raspberry. Kann man den ganzen paspberry zu einer bestimmten Uhrzeit runter fahren und morgens (dann habe ich eine neue IP-Adresse) mit Asterisk komplett neu starten? Oder wenn das nicht funktioniert, dass Asterisk zu einer bestimmten Zeit runter fährt und morgens neu startet?
Das würde mir reichen, da ich meinen Router Nachts eh abgeschaltet habe.
 
NAT ist ein Krücke und per se nicht einfach (wenn es wenigstens halbwegs funktionieren soll) und in Folge dessen muss man wissen, was man tut. Da führt kein Weg dran vorbei. Doch, einer: kein NAT nutzen :).

Dreh und Angelpunkt ist der DNS-Manager (Link funktioniert derzeit nicht - hoffe, dass er irgendwann wieder funktioniert). Er sorgt dafür, dass Asterisk die externe IP-Adresse kennt (die braucht er nämlich). Dazu musst Du ihm einen Hostnamen geben, der via DNS-Lookup die eigene globale IP ausspuckt. DynDNS-Server (dynamic DNS als Stichwort zum Suchen - vielleicht bietet ja avm seinen Kunden da eine eigene Lösung dafür an. Hier steht zumindest was.) können dies. Die Fritzbox muss dann im Rahmen des Adresswechsels dem DynDNS-Server mitteilen, wie die neue IP-Adresse ist.
Danach kann sie Asterisk verwenden.

Die Patch-Nummer brauchst Du wahrscheinlich nicht. Alles andere ist konkret genug beschrieben, dass man es nachbauen kann und auf die eigenen Gegebenheiten anpassen kann (die außer Dir keiner kennt).

Die viel einfachere und richtige und bessere Lösung ist aber, einen Provider zu nutzen, der nicht ständig Zwangstrennungen durchführt. Gehe zur Telekom und Du hast fast Ruhe (nur alle 180 Tage).

Ich weiß ja nicht, bei welchem VoIP Du bist - manche bieten ja auch VoIP auf IPv6 - da bräuchtest Du kein NAT (falls Dein Internetprovider IPv6 unterstützt und Dir eine globale IPv6 gibt. Die Telekom macht letzteres ...).
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.