Dual WAN with failover
From DD-WRT Wiki
Revision as of 00:45, 2 April 2008 (edit) Eddie303 (Talk | contribs) (Dual WAN with failover) ← Previous diff |
Revision as of 00:50, 2 April 2008 (edit) (undo) Eddie303 (Talk | contribs) (→What will do this setup) Next diff → |
||
Line 3: | Line 3: | ||
===What will do this setup=== | ===What will do this setup=== | ||
- | Create a second WAN port, so you can hook up another provider for backup, and will change the active provider to the secondary, if ping fails to the provider's gateway. It will ping in a predefined interval | + | Create a second WAN port, so you can hook up another provider for backup, and will change the active provider to the secondary, if ping fails to the provider's gateway. It will ping in a predefined interval. |
+ | If this is not what you need, then you might try: | ||
+ | [[Dual-WAN_for_simple_round-robin_load_equalization]] - explains how you can load balance between two WAN connections | ||
+ | [[Dual_WAN]] - Explains how to set up a secondary WAN connection for backup. | ||
You'll need to create a new VLAN, called vlan2. | You'll need to create a new VLAN, called vlan2. |
Revision as of 00:50, 2 April 2008
Dual WAN with failover
This was tested on WRT54GL 1.1 with DD-WRT 2.4 mini
What will do this setup
Create a second WAN port, so you can hook up another provider for backup, and will change the active provider to the secondary, if ping fails to the provider's gateway. It will ping in a predefined interval. If this is not what you need, then you might try: Dual-WAN_for_simple_round-robin_load_equalization - explains how you can load balance between two WAN connections Dual_WAN - Explains how to set up a secondary WAN connection for backup.
You'll need to create a new VLAN, called vlan2.
Enter in the web interface, Settings/VLANs. Set Port 4 to a new VLAN.
Enter in the console, and do the following commands
commands to set VLANs
nvram set vlan0ports="1 2 3 5*" nvram set vlan2ports="0 5" nvram set vlan2hwname=et0 nvram commit
On a WRT54GL this will be port 4, if you want port 1 for vlan2 then set vlan2ports to "3 5". Now we'll have some scripts, which will go in /jffs/etc/config:
wan2up.startup Now this is for static IP, but you can change this situation by modifying the script for udhcpc
#!/bin/sh WAN2_IFNAME=vlan2 WAN2_IPADDR=192.168.2.2 WAN2_GATEWAY=192.168.2.1 WAN2_NETMASK=255.255.255.0 if [ "$(nvram get wan2_ipaddr)" != "$WAN2_IPADDR" ]; then nvram set wan2_ifname=$WAN2_IFNAME nvram set wan2_ipaddr=$WAN2_IPADDR nvram set wan2_gateway=$WAN2_GATEWAY nvram set wan2_netmask=$WAN2_NETMASK nvram commit fi ifconfig $(nvram get wan2_ifname) up $(nvram get wan2_ipaddr) netmask $(nvram get wan2_netmask) # We will want to set masquerade on WAN2, otherwise after changing active WAN, we'll remain up in the air. iptables -t nat -A POSTROUTING -o vlan2 -j MASQUERADE
wan1.up This file makes the changes necessary to activate WAN1. Change the nameservers to your provider's DNS servers or OpenDNS's.
#!/bin/sh # WAN1 DEV=vlan1 GATEWAY=`nvram get wan_gateway` DNS1=193.226.43.33 DNS2=193.230.175.1 nvram set wan_dns="$DNS1 $DNS2" ip route delete default # ip route delete default ip route add default via $GATEWAY dev $DEV echo "nameserver $DNS1" >/tmp/resolv.dnsmasq echo "nameserver $DNS2" >>/tmp/resolv.dnsmasq pr="$(ps|awk '/dnsmasq/ {print $1}')" kill -9 $pr dnsmasq --conf-file=/tmp/dnsmasq.conf
wan2.up As you probably already figured out, this will make the changes necessary to activate WAN2 :)
#!/bin/sh # WAN2 DEV=vlan2 GATEWAY=`nvram get wan2_gateway` DNS1=193.226.43.33 DNS2=193.230.175.1 nvram set wan_dns="$DNS1 $DNS2" ip route delete default # ip route delete default ip route add default via $GATEWAY dev $DEV echo "nameserver $DNS1" >/tmp/resolv.dnsmasq echo "nameserver $DNS2" >>/tmp/resolv.dnsmasq pr="$(ps|awk '/dnsmasq/ {print $1}')" kill -9 $pr dnsmasq --conf-file=/tmp/dnsmasq.conf
failover.startup Now, this is the core of our goal, this script will monitor the active connection, and if connection fails, it will call one of wan1.up or wan2.up to change the active connection.
#!/bin/sh INTERVAL=10 PACKETS=1 USINGWAN=0 WAN1=vlan1 WAN2=vlan2 WAN1GW=`nvram get wan_gateway` WAN2GW=`nvram get wan2_gateway` # We'll run this in the intervals given above while sleep $INTERVAL do # Try to figure out the current route TARGET=`ip route | awk '/default via/ {print $3}'` # Set the variable, so let the script now which connection is it dealing with if [ "$WAN1GW" = "$TARGET" ]; then USINGWAN=1; else if [ "$WAN2GW" = "$TARGET" ]; then USINGWAN=2; fi; fi # We'll ping as many times the $PACKETS variable tells, and test if we have connection: RET=`ping -c $PACKETS $TARGET 2>/dev/null | awk '/packets received/ {print $4}'` # If we don't have connection, change the active WAN port (If there is any loss with multiple packets, it should change either) if [ "$RET" -ne "$PACKETS" ]; then if [ "$USINGWAN" = "1" ]; then /jffs/etc/config/wan2.up USINGWAN=2 echo "Changed active WAN port to 2!" else /jffs/etc/config/wan1.up USINGWAN=1 echo "Changed active WAN port to 2!" fi fi done;
Optionally, if you want to be able to switch the active WAN port with the Easy Setup button, you can add:
chwan.sesbutton
#!/bin/sh USINGWAN=0 WAN1=vlan1 WAN2=vlan2 WAN1GW=`nvram get wan_gateway` WAN2GW=`nvram get wan2_gateway` TARGET=`ip route | awk '/default via/ {print $3}'` if [ "$WAN1GW" = "$TARGET" ]; then USINGWAN=1; else if [ "$WAN2GW" = "$TARGET" ]; then USINGWAN=2; fi; fi ip route delete default if [ "$USINGWAN" = "1" ]; then /jffs/etc/config/wan2.up USINGWAN=2 echo "Changed active WAN port to 2!" else /jffs/etc/config/wan1.up USINGWAN=1 echo "Changed active WAN port to 1!" fi
Create above files in /jffs/etc/config and then do a
chmod +x /jffs/etc/config/*
If you made everything as written above right, you should reboot the router and enjoy!