This file should be installed on your router. In my case, I was testing with a VyOS router so I was able to easily extend it with this script. Just paste this into a new file and chmod +x to make it executable. Update the IP information below – most importantly, your LAN information. Then add it to a cron job and have it run once per minute. That’s it!
#!/bin/bash
PATH=$PATH:/bin:/usr/bin:/sbin:/usr/sbin
# LAN IPs of ISP Routers to Use as the Default Gateway
PREFERRED="10.1.10.1"
ALTERNATE="10.1.10.3"
# Public Internet Hosts to Ping
PUBLICHOST1="8.8.8.8"
PUBLICHOST2="8.8.4.4"
# Ping the first public Internet device first. See if it fails.
RETURNED=`/bin/ping -c 5 $PUBLICHOST1 | grep 'transmitted' | cut -d',' -f2 | sed -e 's/^ *//' | cut -d' ' -f1`
# If the first pings fail, check the secondary Internet device.
if [ $RETURNED -eq 0 ]; then # Do a second check just to be sure, and to a different IP. Less pings, since we are already pretty sure of an issue
echo "Failed ping test to $PUBLICHOST1. Trying against $PUBLICHOST2."
RETURNED=`/bin/ping -c 2 $PUBLICHOST2 | grep 'transmitted' | cut -d',' -f2 | sed -e 's/^ *//' | cut -d' ' -f1`
fi
# If it still fails, assume that the Internet is down.
if [ $RETURNED -eq 0 ]; then
echo "Everything is not ok. Looks like the Internet connection is down. Better switch ISPs."
date +%s > /tmp/cutover-start.log
else
echo "Everything is ok. Checking if we are using the preferred connection."
CURRENT=`route -n | grep "^0.0.0.0" | cut -d' ' -f2- | sed -e 's/^ *//' | cut -d' ' -f1`
if [ -f /tmp/cutover-start.log ]; then
LASTSWITCHTIME=`cat /tmp/cutover-start.log | sed -e 's/\n//'`
fi
NOW=`date +%s`
TIMEDIFF=$((NOW - LASTSWITCHTIME))
if [ "$CURRENT" == "$ALTERNATE" ] && [ $TIMEDIFF -gt 300 ]; then
date +%s > /tmp/cutover-start.log
echo "Testing if the primary gateway is back online."
route add -host $PUBLICHOST2 gw $PREFERRED
RETURNED=`/bin/ping -c 5 $PUBLICHOST1 | grep 'transmitted' | cut -d',' -f2 | sed -e 's/^ *//' | cut -d' ' -f1`
if [ $RETURNED -eq 5 ]; then
echo "Switching back now that primary ISP is back online."
route del -net 0.0.0.0/0
route add default gw $PREFERRED
else
echo "The primary host is not back online yet."
fi
route del -host $PUBLICHOST2
fi
exit
fi
# If the script does not exit before it reaches this point, then assume the worst. Time to cutover to the other ISP
CURRENT=`route -n | grep "^0.0.0.0" | cut -d' ' -f2- | sed -e 's/^ *//' | cut -d' ' -f1`
# Delete the existing default gateway
route del -net 0.0.0.0/0
if [ "$CURRENT" == "$PREFERRED" ]; then
echo "Switcing to the alternate ISP $ALTERNATE"
route add default gw $ALTERNATE
else
echo "Switching to the default ISP $PREFERRED"
route add default gw $PREFERRED
fi