7. Mai 2024
Nach einem Stromausfall bootet mein Raspberry Pi wie gewohnt, wenn der Strom wieder da ist und Asterisk fährt ebenfalls wieder hoch. Allerdings bootet Asterisk nicht korrekt und die Telefonverbindungen funktionieren nicht ordnungsgemäß.
Umgebung: Raspberry Pi 3 B, Raspbian GNU/Linux 10 (buster), Asterisk 16.2.1~dfsg-1+deb10u2
Fehler: Nicht alle Endpunkte melden sich nach dem Booten des Raspberry korrekt an. Der Ton wird nicht übertragen. Die Telefonteilnehmer sehen statt der öffentlichen IP des Asterisk-Servers die lokale IP des Raspberry Pi, auf dem Asterisk läuft. Asterisk befindet sich hinter einem Router mit Portweiterleitung. In der Asterisk-Console erscheinen regelmäßig Fehlermeldungen, dass etwas mit dem “Socket” nicht stimmt. Leider habe ich die genaue Fehlermeldung nicht kopiert. Der Fehler ist nach einem Update oder Upgrade entstanden. Ich weiß es leider nicht mehr.
Abhilfe: Eingabe der Befehlszeile
sudo systemctl restart asterisk
Dadurch wird Asterisk neu gestartet und der Fehler ist verschwunden. Das ist natürlich keine dauerhafte Lösung, wenn der Stromausfall in Abwesenheit geschieht und im schlimmsten Fall mehrere Wochen verreist ist.
Deshalb soll dieser Befehl durch den Cron-Dienst automatisch ausgeführt wird. Ich habe das ungewöhnlicherweise mit der Grafischen Oberfläche gemacht, um Korrekturen besser vornehmen zu können.
Wir gehen dazu in den Ordner /etc/cron.d und legen dort eine Datei namens “startasterisk” an. Diese Datei bekommt alle Root-Rechte. In dieser Datei steht:
# 6.05.24 - Starten von Asterisk nach Stromausfall @reboot /usr/local/bin/startasterisk.sh
Die Reboot-Anweisung verweist also auf die Ausführung der Bash-Datei /usr/local/bin/startasterisk.sh:
#!bin/bash sleep 120 sudo systemctl restart asterisk
Der Umweg über die Bashdatei ist natürlich umständlich. Man hätte das auch in der /etc/cron.d/startasterisk mit einer einzigen Zeile erledigen können:
# 6.05.24 - Erneutes Starten von Asterisk 120 Sekunden zeitverzögert nach Stromausfall @reboot sleep 120 && sudo /bin/systemctl restart /usr/sbin/asterisk
Wichtig sind eventuell die vollständigen Pfadangaben, die man wie folgt herausbekommt:
which asterisk which systemctl
Leider bin ich nicht sicher, ob es so tatsächlich funktioniert.
# # # # # #
Erweiterung für APIBAN: Die Bash-Datei habe ich für die automatische Blacklist APIBAN erweitert. APIBAN ist ein Muss für SIP-Server, um SIP-Scanner und Angriffe auf den SIP-Server zu blocken (siehe https://elektronikbasteln.pl7.de/apiban-schuetzt-sip-telefon-server-automatisch-vor-boesartigen-angriffen-aus-dem-internet ). So sieht die erweiterte startasterisk.sh aus:
#!/bin/bash sleep 120 sudo systemctl restart asterisk sleep 180 sudo /usr/local/bin/startapiban.sh &
Das “&” in der letzten Zeile sorgt dafür, dass die startapiban.sh im Hintergrund ewig läuft.
Die startapiban.sh hat folgenden Inhalt:
#!/bin/bash while true do /usr/local/bin/apiban.sh sleep 3600 done
Dadurch wird die Bash-Datei /usr/local/bin/apiban.sh jede Stunde immer und ewig erneut ausgeführt, um jede Stunde die Blacklist zu aktualisieren Die apiban.sh ist im Artikel über APIBAN beschrieben.
Ob APIBAN gestartet ist und funktioniert, lässt sich mit folgenden Befehlen herausfinden:
###################################################################### # Alle IPs in der Chain APIBAN iptables -L APIBAN --line-numbers -n -v | awk '$2 != "0" {print}' # Anzahl der Regeln in der Chain APIBAN iptables -L APIBAN -n --line-numbers | grep -v "Chain\|num" | wc -l # Anzahl der Regeln in APIBAN, die tatsächlich abgewehrt wurden iptables -L APIBAN -n --line-numbers -v | awk '$2 != "0" && NR > 2 {print}' | wc -l # Fail2Ban zum Vergleich fail2ban-client status asterisk #######################################################################
Ich gebe zu, dass es etwas umständlich ist, die Aufgaben über mehrere Dateien zu verteilen. Dahinter steckt die historische Entwicklung. Da es jetzt endlich funktioniert, belasse ich es so.