[HowTo] Automatischer PPPOE Reconnect bei Paketverlust
-
Moin,
ich habe aus gegebenen Anlass das Script von @BennTech (https://forum.pfsense.org/index.php?topic=51714.msg276614#msg276614) überarbeitet, damit es folgende Aufgaben durchführt:
-
Automatischer Reset der PPPOE-Verbindung bei Paketverlust
-
Eigener Interface Down und Up Sound (wird nur zwischen 08:00-22:00 Uhr gespielt)
-
Separater E-Mail Hinweis, sobald die Verbindung erfolgreich wiederhergestellt wurde
-
Nutzung des Systemlogs
Hintergrund
Obwohl ich die aktuelle 2.4.2-RELEASE-p1 einsetze, habe ich jeden Tag einige Probleme mit meiner PPPOE-Verbindung zum Provider. Laut Statusübersicht ist die Verbindung während der Störung up & running, aber es gehen keine Datenpakete durch die Leitung. ??? Mit diesem angepassten Skript kann ich diesen Zombiestatus erkennen und die Verbindung automatisch zurücksetzen. 8) Alles kein Hexenwerk, aber es hilft mir die Downtime von mehreren Stunden auf ca. 2 Minuten zu begrenzen. Anscheinend kann die pfSense dieses Problem nicht von alleine erkennen und lösen. Meinen Provider interessiert diese Störung leider nicht.#!/bin/sh #===================================================================== # pingtest.sh, v1.0.2 # Created 2009 by Bennett Lee # Modified by s0nic # Released to public domain # # (1) Attempts to ping several hosts to test connectivity. After # first successful ping, script exits. # (2) If all pings fail, resets interface and retries all pings. # (3) If all pings fail again after reset, then reboots pfSense. (currently deactivated) # # History # 1.0.2 Added interface status sound, mail notification, systemlog and PPPOE reset. Disabled reboot. # 1.0.1 Added delay to ensure interface resets (thx ktims). # 1.0.0 Initial release. #===================================================================== #===================================================================== # USER SETTINGS # # Set multiple ping targets separated by space. Include numeric IPs # (e.g., remote office, ISP gateway, etc.) for DNS issues which # reboot will not correct. ALLDEST="google.com 8.8.8.8" # Interface to reset, usually your WAN BOUNCE=WAN # Log file LOGFILE=/root/pingtest.log ZEIT=$(date +%k%M) #===================================================================== COUNT=1 while [ $COUNT -le 2 ] do for DEST in $ALLDEST do echo "PINGTEST: Pinging $DEST" | logger ping -c1 $DEST >/dev/null 2>/dev/null if [ $? -eq 0 ] then echo "PINGTEST: Ping $DEST OK." | logger exit 0 fi done if [ $COUNT -le 1 ] then echo "PINGTEST: All pings failed. Resetting interface $BOUNCE." | logger # Interface RESET /usr/local/sbin/pfSctl -c 'interface reload wan' >/dev/null 2>&1 # Interface DOWN #/sbin/ifconfig $BOUNCE down | logger # Notification if [ "$ZEIT" -ge 800 ] && [ "$ZEIT" -le 2200 ] then /usr/local/bin/beep -p 1000 25 /usr/local/bin/beep -p 900 25 /usr/local/bin/beep -p 800 25 /usr/local/bin/beep -p 700 25 /usr/local/bin/beep -p 600 25 /usr/local/bin/beep -p 500 25 /usr/local/bin/beep -p 400 25 /usr/local/bin/beep -p 300 25 /usr/local/bin/beep -p 200 50 fi # Give interface time to reset before bringing back up #sleep 10 # Interface UP #/sbin/ifconfig $BOUNCE up | logger # Give WAN time to establish connection sleep 15 # Notifications for DEST in $ALLDEST do ping -c1 $DEST >/dev/null 2>/dev/null done if [ $? -eq 0 ] then MOMENT=`date +%d.%m.%Y@%H:%M:%Sh` printf "PINGTEST: Interface $BOUNCE has been successfully resetted.\n\nReconnect: $MOMENT" | /usr/local/bin/php -q -c"/usr/local/etc/php.ini" /usr/local/bin/mail.php -s"pfSense.name - Reconnect" echo "PINGTEST: Interface $BOUNCE has been successfully resetted." | logger if [ "$ZEIT" -ge 800 ] && [ "$ZEIT" -le 2200 ] then /usr/local/bin/beep -p 200 25 /usr/local/bin/beep -p 300 25 /usr/local/bin/beep -p 400 25 /usr/local/bin/beep -p 500 25 /usr/local/bin/beep -p 600 25 /usr/local/bin/beep -p 700 25 /usr/local/bin/beep -p 800 25 /usr/local/bin/beep -p 900 25 /usr/local/bin/beep -p 1000 50 fi fi else echo "PINGTEST: All pings failed twice." | logger #echo "PINGTEST: All pings failed twice. Rebooting..." | logger #/sbin/shutdown -r now | logger exit 1 fi COUNT=`expr $COUNT + 1` done
-
-
Darf ich ergänzend kommentieren?
Ich würde das Log nach /var/log schreiben, nicht /root. Das ist ggf. ein TMPFS oder Ramdisk Target, /root nie. Deshalb wäre es kontraproduktiv auf Geräten, die ggf. den Schreibzugriff minimieren möchten. :)
-
Na klar :-) Die Variable wurde von mir eh nicht mehr verwendet, da alles ins Systemlog geht. Habe die Chance gleich genutzt und noch weitere "Features" eingebaut…
-
Traceroute: Wenn ICMP Pakete verloren gehen, muss nicht immer die Leitung schuld sein. Manchmal liegt das Problem hinter dem POP/ersten HOP und ein nachgelagerter Router des Providers leitet die Pakete nicht ordnungsgemäß weiter. Um diesen Grund erkennen zu können, habe ich einen Traceroute während der Störung eingebaut.
-
Log Export: In der Statusmail sind jetzt die Zeiten der letzten Down- & Uptimes aus dem Systemlog enthalten, damit man auch längere Downtimes einfacher nachvollziehen und bei Bedarf dem Provider in Rechnung stellen kann.
-
WAN IP: Manchmal hat DDNS einfach zu viel Zeit gebraucht, deshalb ist jetzt die neue WAN IP in der Statusmail enthalten.
Wer möchte kann auch wieder die ursprünglichen Befehle von Bennett Lee zum Interface Reset aktivieren oder z.B. einen Neustart durchführen lassen. Viel Spaß damit ;)
#!/bin/sh #===================================================================== # pingtest.sh, v1.0.3 # Created 2009 by Bennett Lee # Modified by s0nic # Released to public domain # # (1) Attempts to ping several hosts to test connectivity. After # first successful ping, script exits. # (2) If all pings fail, resets interface and retries all pings. # (3) If all pings fail again after reset, then reboots pfSense. (currently deactivated) # # History # 1.0.3 Added traceroute during downtime, WAN IP and log export for the status mail. # 1.0.2 Added interface status sound, mail notification, systemlog and PPPOE reset. Disabled reboot. # 1.0.1 Added delay to ensure interface resets (thx ktims). # 1.0.0 Initial release. #===================================================================== #===================================================================== # USER SETTINGS # # Set multiple ping targets separated by space. Include numeric IPs # (e.g., remote office, ISP gateway, etc.) for DNS issues which # reboot will not correct. ALLDEST="google.com 8.8.8.8" # Interface to reset, usually your WAN BOUNCE=WAN # Log file (disabled) #LOGFILE=/root/pingtest.log #Timestamp ZEIT=$(date +%k%M) #===================================================================== COUNT=1 while [ $COUNT -le 2 ] do for DEST in $ALLDEST do echo "PINGTEST: Pinging $DEST" | logger ping -c1 $DEST >/dev/null 2>/dev/null if [ $? -eq 0 ] then echo "PINGTEST: Ping $DEST OK." | logger exit 0 fi done if [ $COUNT -le 1 ] then echo "PINGTEST: All pings failed. Resetting interface $BOUNCE." | logger # Checking downtime reason TRACE=`traceroute -w 3 -q 1 -m 10 8.8.8.8` # Interface RESET /usr/local/sbin/pfSctl -c 'interface reload wan' >/dev/null 2>&1 # Interface DOWN #/sbin/ifconfig $BOUNCE down | logger # Notification if [ "$ZEIT" -ge 800 ] && [ "$ZEIT" -le 2200 ] then /usr/local/bin/beep -p 1000 25 /usr/local/bin/beep -p 900 25 /usr/local/bin/beep -p 800 25 /usr/local/bin/beep -p 700 25 /usr/local/bin/beep -p 600 25 /usr/local/bin/beep -p 500 25 /usr/local/bin/beep -p 400 25 /usr/local/bin/beep -p 300 25 /usr/local/bin/beep -p 200 50 fi # Give interface time to reset before bringing back up #sleep 10 # Interface UP #/sbin/ifconfig $BOUNCE up | logger # Give WAN time to establish connection sleep 15 # Notifications for DEST in $ALLDEST do ping -c1 $DEST >/dev/null 2>/dev/null done if [ $? -eq 0 ] then #MOMENT=`date +%d.%m.%Y@%H:%M:%Sh` WANIP=`curl -s http://whatismyip.akamai.com/` echo "PINGTEST: Interface $BOUNCE has been successfully resetted." | logger SYSLOG=`clog /var/log/system.log | grep -e "PINGTEST: All" -e "PINGTEST: Interface"` printf "PINGTEST: Interface $BOUNCE has been successfully resetted.\n\nThe new WAN address is: $WANIP\n\nSyslog:\n$SYSLOG\n\nDowntime traceroute:\n$TRACE" | /usr/local/bin/php -q -c"/usr/local/etc/php.ini" /usr/local/bin/mail.php -s"pfSense.name - Reconnect" if [ "$ZEIT" -ge 800 ] && [ "$ZEIT" -le 2200 ] then /usr/local/bin/beep -p 200 25 /usr/local/bin/beep -p 300 25 /usr/local/bin/beep -p 400 25 /usr/local/bin/beep -p 500 25 /usr/local/bin/beep -p 600 25 /usr/local/bin/beep -p 700 25 /usr/local/bin/beep -p 800 25 /usr/local/bin/beep -p 900 25 /usr/local/bin/beep -p 1000 50 fi fi else echo "PINGTEST: All pings failed twice." | logger #echo "PINGTEST: All pings failed twice. Rebooting..." | logger #/sbin/shutdown -r now | logger exit 1 fi COUNT=`expr $COUNT + 1` done
-
-
Ich pinne das einfach mal oben an, damits nicht verloren geht.
-
@s0nic Hallo, eine Frage, wenn ich versuche das Script auszuführen bekomme ich:
/usr/local/bin/pingtest.sh: Command not found.
muss man da noch berücksichtigen? Danke und schöne Grüsse -
-
-
-