Netgate SG-1000 microFirewall

Author Topic: [HowTo] Automatischer PPPOE Reconnect bei Paketverlust  (Read 208 times)

0 Members and 1 Guest are viewing this topic.

Offline s0nic

  • Newbie
  • *
  • Posts: 6
  • Karma: +0/-0
    • View Profile
[HowTo] Automatischer PPPOE Reconnect bei Paketverlust
« on: January 17, 2018, 03:59:47 am »
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.

Code: [Select]
#!/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
« Last Edit: January 22, 2018, 07:09:26 am by JeGr »

Offline JeGr

  • Moderator
  • Hero Member
  • *****
  • Posts: 3238
  • Karma: +211/-8
  • old man standing
    • View Profile
Re: Lösung: Automatischer PPPOE Reconnect bei Paketverlust
« Reply #1 on: January 17, 2018, 06:36:12 am »
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. :)

Don't forget to [applaud] those offering their time and brainpower to help you!

If you're interested, I'm available via PM to discuss details of German-speaking paid support services.

Offline s0nic

  • Newbie
  • *
  • Posts: 6
  • Karma: +0/-0
    • View Profile
Re: Lösung: Automatischer PPPOE Reconnect bei Paketverlust
« Reply #2 on: January 22, 2018, 02:35:49 am »
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  ;)

Code: [Select]
#!/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

« Last Edit: January 22, 2018, 02:43:24 am by s0nic »

Offline JeGr

  • Moderator
  • Hero Member
  • *****
  • Posts: 3238
  • Karma: +211/-8
  • old man standing
    • View Profile
Re: Lösung: Automatischer PPPOE Reconnect bei Paketverlust
« Reply #3 on: January 22, 2018, 07:08:57 am »
Ich pinne das einfach mal oben an, damits nicht verloren geht.
Don't forget to [applaud] those offering their time and brainpower to help you!

If you're interested, I'm available via PM to discuss details of German-speaking paid support services.