MiniGoogle.tk

Saturday, October 23, 2010

Get back your Dead or not responding Router

Seize The Moment With TFTP




You can use the TFTP (Trivial File Transfer Protocol (define)) command-line utility to upload fresh firmware to the router in its brief moment of wakefulness. Windows, OS X and Linux all include TFTP clients.



First, you need a .bin file containing the known good firmware. You can visit the Linksys site as described above and download the .zip version of the firmware, which includes the .bin file. You can even use a .bin file for an open source firmware, so long as you choose one that's stable and tested and is the correct version for your router (or else you start this whole process all over again).



Windows users need some dexterity here. First, remove power from your router. Open two command prompt windows. In one, you will set up your TFTP command.



Type (but do not yet press enter):



tftp –i 192.168.1.1 PUT firmwarefile.bin



In the second command prompt, enter:



ping –t 192.168.1.1



Run the ping command, which will begin probing and failing to reach the router. Now change window focus to your TFTP command.



Apply power to the router. Watch the ping window for a response, then hit enter in the TFTP window!



Miss by a beat and you’re too late – the pings will fail and your moment has passed. Cut power to the router and repeat the process. You need to start the TFTP the moment you see a successful ping.



For OS X and Linux users, the principle is the same, but the process is easier. First, remove power from your router. Open a terminal window and enter the commands:



tftp 192.168.1.1

binary

rexmt 1

timeout 60

trace

tftp> put firmwarefile.bin



Now apply power to your router. The tftp client will continuously retry uploading the firmware until the router responds. Hopefully, the router will briefly awaken, allowing the firmware upgrade to be sent. About two minutes later, the router will reset and become operational with the new firmware.



If your router simply refuses ever to respond to a ping at 192.168.1.1 despite all these tricks, things are looking grim. You might want to start saving up $60 worth of router replacement kitty.



Short Circuits



You’re desperate. Nothing has worked, and your router is probably a doorstop. At this point, you might want to consider cracking the lid. This will certainly void your warranty, but then again, whatever bricked it this badly probably already did that.



There remains a small glimmer of hope. That glimmer is actually a spark, which, if you’re feeling brave, is what you may need to create.



Two invasive methods of short-circuiting your router have been reported successful. These techniques are controversial. Some in the router modifying community are opposed to even discussing these techniques. We’re not here to judge, nor do we endorse them. If you err even slightly, you’ll probably permanently destroy the router and possibly create a small fire hazard. Take precautions. Rubber-soled shoes and a fire extinguisher, minimum.



Unplug your router. Disassemble the case. On many models of WRT, the case is not held together with screws. You can press down on the top front to pop off the face. Manually untwist the two antennas. Press down on the bottom rear to pop off the backplane. You should be left with a tiny “I paid $60 for this?” circuit board attached to a plastic bottom panel. (Note that some router models do include a couple of screws which are accessible under the rubber feet.)



Look for the flash chip, which is typically marked “Intel” and is toward the front of the circuit board where the LEDs are. The pins on this chip are numbered at the corners – 1, 24, 25, and 48. Small white triangles mark every 5 pins.



The two most successful “shortcuts” have been on routers of V4 or less, using one of two methods: short pins 15 and 16, or short pin 16 to earth via the left antenna input. [At least one reader wrote to tell us that on the WRT54GL v1.1, he had to use pins 16 and 17. Your mileage my vary, kids.]



A small jeweler’s screwdrivers or the tip of a multimeter can be used to short pins 15 and 16. First, apply power to the router and depress the reset button for 30 seconds. Cycle the power again. Short pins 15 and 16, and depress the reset button for another 30 seconds. Now try to ping the router. Many report success.



Alternatively, use a copper or other conductive wire to connect the block of the left antenna input (the one with the braided cable) to pin 16. Again, press the reset button for 30 seconds, press the wire to pin 16 and the antenna block, and press the reset button for another 30 seconds.



You may experience small sparks with these procedures. And you need steady, accurate fingers – the pins on the flash chip are very, very small.



If you miss the correct pins, you’ve probably just completed what is known as “the final nail in the coffin.”



Secrets of the JTAG, aka Time to Buy a New Router



If you research bricked routers at all, you’ll inevitably come across the so-called miracle cure known as the JTAG (short for Joint Test Action Group, which is all about testing circuits). With the JTAG, you can supposedly revive nearly any dead router, not to mention the fact that (apparently) it slices, dices, chops and purees.



However, the JTAG is complicated. You need to build or buy a special cable. It may involve soldering. It connects your PC’s parallel port to circuitry inside your router. It is a very slow communications channel and can take hours of time from beginning to end. And it still may not work, despite the claims.



The JTAG poses the question, how much of a hacker are you? If the idea of building your own cable and connecting it to the guts of the router sounds incredibly cool, then by all means follow this link to the Google search for “hairydairymaid jtag” and follow the results. Otherwise, this may be the time to accept your loss and proceed through the stages of grief: anger, acceptance, and buying a new router.

                                         Page 1     Page 2   Page 3

How to Repair a Dead Linksys Wireless Router Page 2

It’s Dead, Jim!




Despite best — or not-so-best — efforts, accidents happen. Maybe your flash upgrade failed, or your router’s memory became corrupted. You may have made a mistake somewhere in the process. It could have been buggy firmware itself. After all, these open source replacements come with no guarantees. The time for blame has passed.



You’ll know your router has been bricked because, well, it no longer works. More specifically, you will probably see the power light blinking steadily. You may see most of its other lights lit solid.



If your router has a “DMZ” (define) light, note whether it is lit at power on or whether it lights a few seconds later, or never at all. This information could be useful soon.



Sometimes you can breathe new life into your bricked router. It is difficult to say exactly how often bricked routers are successfully revived, but it happens often enough that a number of resurrection techniques have emerged. There is no guarantee, of course, that any of these will work.



The methods devised by the networking community basically fall into two categories: gentle and desperate.



The more popular gentle recovery techniques involve establishing basic network communications with your router through software, followed by reflashing back to known, good firmware.



The desperate recovery techniques involve opening your router and attempting to physically reset its circuitry.



Gentle Recoveries



If you could simply reflash your seemingly dead router with an official Linksys firmware, you could, like Cher, turn back time. Not surprisingly, this is Linksys’ approved recovery method for Windows users, and the only one that won’t void your warranty – if it works.



To test if your router is only “a little bit dead,” you need to see if it responds to pings. First, reset your router to its factory default settings. Do this by powering it on and depressing the reset button for at least 30 seconds. You need the tip of a pen, or better yet, the pointy end of a pen cap to keep the recessed button depressed. The router’s lights will cycle off and back on after it reboots itself.



Using a computer with a wired Ethernet connection to one of the router’s LAN ports, open a command prompt in Windows (go to the Run command in the Windows Start menu, type "cmd" and then hit Enter). Use the ping command to see if the router responds at its factory default IP address, 192.168.1.1.



>ping 192.168.1.1

Pinging 192.168.1.1 with 32 bytes of data:

Reply from 192.168.1.1: bytes=32 time<10ms TTL=128

Reply from 192.168.1.1: bytes=32 time<10ms TTL=128



If you see something like the above, your router is not really dead. You may now dance a happy jig.



If, instead of “Reply from” you see “Request Timed Out” or “Hardware Error” or “Destination host unreachable,” your router is not responding. Do not dance a happy jig, and don’t bother with the rest of this Linksys-approved recovery, because you’ll just be wasting your time. Jump to the next section.



To proceed with the Linksys recovery, visit their Web site to download the latest official firmware. Select your router model from the drop-down list. Be sure to choose the exact model number marked on the underside label of your router – the WRT54G, for example, comes in versions from V1 to V6 (if unmarked, you have a V1).



Click the “Firmware” icon and proceed to download the firmware executable (.exe) file (define).



Force your network adapter into 10Mbps half-duplex mode. Because the procedure varies on different Windows versions, consult this Linksys support page for step-by-step instructions.



Launch the executable file you downloaded. Click “Next” on the splash screen. Set the “Router’s IP Address” to 192.168.1.1 and the “Router’s Password” to admin. Click “Next” again, and the firmware upload process begins.



About two minutes later, the update will complete, the router will reboot, and you’re back in business. At this point, you may revisit upgrading the firmware to an open-source replacement, but be sure to consider what may have gone wrong before, so as not to simply repeat your router’s near-death experience.



The Ping, Dear God, I Beg Of You Technique



If you router did not respond to pings at 192.168.1.1, it isn’t in great shape. But all hope is not yet lost.



Earlier, did you notice if the “DMZ” light on the front panel glows a few seconds after applying power? If yes, you may be able to reset the router to a failsafe mode. Cycle the power to your router and, as soon as DMZ lights up, depress the reset button for two seconds. It may take some coordination to pull this off accurately. Try again to ping the router.



If your firmware is truly hosed, your router may only respond to pings at 192.168.1.1 for a very brief window upon power-up. The moment power is applied, the router hasn’t yet loaded its firmware and is operating on a kind of BIOS. It is during this fleeting moment that you may be able to “catch” the router while still momentarily conscious, just before its brain-dead firmware is loaded.



You need to test whether your router is indeed responsive, even if just for a second, because that is all that's needed to breathe new life into it.



First, connect both your computer and your router to a hub (define) or switch (obviously, the switch built into the router doesn't count). If your computer is wired directly to your router, your Ethernet link may drop when the router is non-responsive, and you could miss the brief moment when it blinks its eyes awake. The hub/switch will keep your link up.



Second, manually configure your wired network settings. Assign your computer the IP address 192.168.1.10 (the last digit should be any number greater than 1), with subnet mask 255.255.255.0, and gateway 192.168.1.1.



Third, open a command prompt in Windows, or a terminal in MacOS X or Linux. Windows users should type:



ping –t 192.168.1.1



The “-t” switch in Windows will keep the ping running indefinitely.



MacOS X or Linux users should type:



ping 192.168.1.1



Your computer will continuously lob pings at the router. Now, cycle power to the router. You’re looking for any sign of life at all – does the router respond to any ping? Depending on your ping command, a successful reply may say “Reply from…” or “XYZ bytes from…” along with information like “time” and “TTL”.



If you do see even one or two replies, you’re set! This verifies that your router experiences a moment of consciousness.



If your router does not respond to a ping within a few seconds of powering up, it isn’t going to happen.

                      Page1         Page2           Page3

How to Resurrect a Dead Linksys WRT54G Router Part1

One of the more exciting developments for networking enthusiasts has been the evolution of open-source firmware replacements for certain popular, inexpensive routers (usually the famed Linux-running Linksys WRT54G).




While replacement firmware offers the promise of significantly expanded features, greater customization and mondo-tweakability, it also carries some risk. Should misfortune strike, you might, oh, let’s say, render your router into a useless hunk of plastic. Or, as victims prefer to say, you could “brick it.” How does a router become a brick? And if it does, is there any hope of bringing it back to life?



The short answers: "by accident," and "yes... sometimes."



How a Router Becomes a Brick



Bricks are very good at holding up the walls of your house. Bricks are not very good at routing network traffic. You don’t want your router to suddenly become one. (Likewise, you don’t want the bricks in your walls to suddenly become routers – although that would be pretty cool, no?) But sometimes it happens. Often, you can avoid this fate by understanding how a router can become a brick.



There is an alchemy to turning a router into a brick. The most common formula is the bad flash. When you upgrade the firmware in your router, you’re basically swapping in a new brain in place of the old. This brain controls most of the router's cognitive functions.



The upgrade process, described in The Open Source WRT54G Story, can require up to two minutes. If "Something Bad" happens during this process – loss of power to the router, loss of network connectivity to the uploading PC – you may have just bricked your router.



When upgrading your firmware, try to prevent "Something Bad" from happening:



•Be sure the power source is secure.

•Only upgrade through a wired Ethernet connection; do not use a wireless connection.

•Be sure to manually configure the IP address on your uploading PC – do not rely on automatic DHCP address assignment.

•Be sure to disable any software firewall running on your uploading PC, including the Windows firewall.

RAM, Corrupted



Your router has a small amount of on-board NVRAM (define), or non-volatile memory. Sometimes your flash upgrade will be successful, but your NVRAM will become corrupted. Often, this happens when the firmware you uploaded to the router wasn’t exactly the right version for your model. Be sure to read the upgrade instructions for your chosen firmware very, very, very carefully.



For example, consider DD-WRT, one of the most popular open source firmware replacements for Linksys WRT series routers. DD-WRT is available in many flavors. There is a “minimal” build with only a base feature set. There is also a “generic” build which lacks optimizations, and some model-specific builds, among other variants.



When upgrading the router from the Linksys-branded firmware, you are supposed to “step up” by first installing the minimal DD-WRT build, and upgrading from there to a more feature-rich build.



However, when upgrading your router through DD-WRT’s Web interface, you're directed to use the generic build.



Trip up on one of these finer points, and your upgrade may appear successful at first. But then you configure the router, it reboots, and hello Brickville, city of bricks. Most likely, your “successful” flash upgrade produced corrupted NVRAM.



You will always find message board threads by those who have disobeyed the upgrade instructions without dire consequences. These people can also eat pizza for three meals daily and never gain weight, and smoke a pack a day until they’re 98 years old. In fact, they often smoke and eat pizza while upgrading their routers. But the rest of us – we're not like them. Just follow the instructions, carefully.

                  Page 1   Page2    Page 3

Router Recover from a bad flash or Dead like wrt54g, wrt54gl ...

Recover back your Routers like wrt54g, wrt54gl and many other Router
So, you're afraid you've bricked your router. Don't worry, there are a number of things you can try to get your router working again before giving up and living with the fact that your router is now a paperweight.

It is also unfortunately possible to configure your router in ways which make it dead to the world. These techniques may be useful in these cases also.

Before you continue below, make sure you've first tried a hard reset to revive your router:




1.Disconnect the router from UTP cables (not the power cable).

2.Push reset button for 30 secs.

3.Without releasing reset button, disconnect power cord.

4.Hold the reset button for another 30 secs.

5.Replug the power cord.

6.Still hold the reset button for another 30 secs.

7.Release the reset button and give the router about 10 secs to resettle.

8.Disconnect power cord for another 10 secs and then reconnect.

9.All should be in default settings now.

This procedure is usually called 30/30/30 reset.



If the power light blinks in a neverending way, the 30/30/30 reset has no effect. Go to the Windows section of this page to see the reset-from-scratch procedure

For more help in detail  visit my other blog  and  http://www.dd-wrt.com/wiki/index.php/Recover_from_a_Bad_Flash

Dual Wan DHCP Tomato with Round Robbin Loadbalancing

TODO


* Implement QOS on WAN2 (help?)

* WAN Failover

* DNS Failover (server doesn't appear to switch when an interface is down.)

* VPN testing



Change Log

ver. 0.1 - Modified w2.evt script to account for DNS route and disabled interfaces.

ver. 0.5 - Added iptables rules to preserve routes across connections, saved previous settings to properly remove rules/routes.



Useful info:

"RTNETLINK answers: No such process" means ip route cant find the interface "RTNETLINK answers: file exists" means there is already an overlapping entry in the routing table



I use the following at the beginning of my scripts to paste them into putty:



scrName=fullPathToYourScript

echo "" > $scrName

vi $scrName

:set noautoindent

i

Then just type: `Esc` :wq `Enter`









Preface

I have been working on a dual wan setup for Tomato for a while now and have compiled and modified a few scripts from various sources. This setup enables a second wan on port 4 of the router configured for DHCP (PPPOE is possible with modifications to the script). QOS is only applied to the primary WAN (i.e. WAN2 no QOS). I haven't tested to see what effect port forwarding has as that has not been a priority of the project. This works on a Asus WL-500GPv2 running the following flavor of Tomato:



* tomato-K26USB-1.27.9047MIPSR1-beta16-Ext

available from: http://tomatousb.org/ (Thank you teddy_bear.)

Of course you are modifying your router so the standard disclaimer applies... it is possible you can brick your router, use at your own risk, however I haven't bricked one beyond recovery...yet. I recommend running the w2.init script from the command line first, before you add any lines to the Administration, Scripts web interface, this way a simple power cycle will restore the routing table and firewall if you run into problems, if you mess up the nvram port settings then look into router reset / recovery, unless of course you implemented the safeguard mentioned in the Removal section.

This is a multi step process where first the new interface is created and then scripts are added to the 'Firewall' and 'WAN Up' scripts. Since the firewall and routing table is flushed and rebuilt every time the WAN comes up.



Prerequisites

* 2 wan connections

* jffs enabled and formatted.

* open port 4 on the router for wan 2 (you can change this)

* wan 1 is connected to WAN port

* Console access to router (ssh, telnet, etc...)







Removal

(This is first just in case...)



■as a safety precaution you may want to put this into the 12 second plus button script in case something goes wrong.

Remove the w2.init and w2.evt scripts from Firewall and WAN Up respectively and run the following in a console:



nvram set vlan0ports="0 1 2 3 5*"

nvram set vlan1ports="4 5"

nvram unset vlan2ports

nvram unset vlan2hwname

nvram unset wan2_iface

nvram unset wan_weight

nvram unset wan2_weight



#the following is optional and will remove all scripts from the Firewall and WAN Up... you are warned.

nvram set script_fire=""

nvram set script_wanup=""



# or if you stored your scripts as illustrated this will preserve your other scripts... I like this one better

nvram set script_fire=`nvram get script_fire
grep -v jffs/wan2/w2.evt`

nvram set script_wanup=`nvram get script_wanup
grep -v /jffs/wan2/w2.init`



nvram commit



#for completeness delete the scripts folder

rm -r /jffs/wan2

Setup Dual Wan Round Robbin Loadbalancing

First Create your 2nd wan interface: vlan2 on port 4



■Ports are labeled in reverse order i.e.

Box label: WAN 1 2 3 4

Nvram label: 4 3 2 1 0



some of the newer routers may have different internal assignments, so you may want to run



nvram show
grep vlan.ports

and examine the output... before modification mine looks like:



vlan0ports=1 2 3 4 5*

vlan1ports=0 5

Using the console:



nvram set vlan0ports="3 2 1 5*"

nvram set vlan1ports="4 5"

nvram set vlan2ports="0 5"

nvram set vlan2hwname=et0

nvram set wan2_iface=vlan2



#the following adjust the Round Robbin weighting of each respective interface

nvram set wan_weight=1

nvram set wan2_weight=1



nvram commit



mkdir /jffs/wan2

Using the console and your favorite text editor create the following script and save it to:

/jffs/wan2/w2.init



#!/bin/sh

# script to bring up the secondary wan interface



ModName="WAN2 init: "



runscr="/jffs/wan2/w2.evt"

iface=`nvram get wan2_iface`

lanhost=`nvram get lan_hostname`



#logger $ModName killing old: `ps
grep $iface
grep -v grep
awk '{print $1}'`

kill `ps
grep $iface
grep -v grep
awk '{print $1}'`

ifconfig $iface down

sleep 5

logger $ModName starting... $iface

ifconfig $iface up

ip=`udhcpc -i $iface -s $runscr -H $lanhost
grep Lease
awk '{print $3}'`

#ifconfig $iface up $ip



logger $ModName complete: $iface $ip

Using the console and your favorite text editor create the following script and save it to:

/jffs/wan2/w2.evt



#!/bin/sh

# Dual Wan Script for Tomato

# Purpose: insert the firewall and route entries, update DNS for wan2

# ver. 0.5

# secondary wan comes up, or the firewall is rebuilt



# Assumptions:

# Wan 2 is DHCP

# the following entries exist in nvram and are configured properly ( name(default value) ):

# lan_ifname(br0)

# wan_iface(vlan1)

# wan2_iface(vlan2)

#

# *use these values to adjust the round robbin weighting for each wan:

# wan_weight(1)

# wan2_weight(1)

#

# vlan0ports(3 2 1 5*)

# vlan1ports(4 5)

# vlan2ports(0 5)

# vlan2hwname(et0)





#IF0= local interface

#P0_NET= local network



#IFx= name of the interface on WANx

#IPx= IP address associated with $IFx

#Px= be the IP address of the gateway at Provider x

#Px_NET= be the IP network $Px is in

#IFx_W= Weight to assign the interface #IFx for round robbin load balancing



# Example values for variables:



# Local lan: (this is for understanding only as most values are set using either nvram or dynamically determined)

#IF0=br0

#IP0=192.168.108.1

#P0_NET=192.168.108.0/24



# Wan #1: (this is for understanding only as most values are set using either nvram or dynamically determined)

#IF1=vlan1

#IF1_W=1

#IP1=192.168.8.115

#P1=192.168.8.1

#P1_NET=192.168.8.0/24



# Wan #2: (this is for understanding only as most values are set using either nvram or dynamically determined)

#IF2=vlan2

#IF2_W=1

#IP2=192.168.0.14

#P2=192.168.0.1

#P2_NET=192.168.0.0/24



# dnamasq DNS table path

RESOLV_CONF="/tmp/etc/resolv.dnsmasq"



WANname="WAN2 evt: "



#must use numbers for table names

T1=100

T2=200



# marks for rules/routes

Mrk1=0x100

Mrk2=0x200



#logger $WANname start $0 $1



case "$1" in

deconfig)

ifconfig $interface 0.0.0.0

nvram set wan2_get_dns=""

;;

renew
bound)



ifconfig $interface $ip

${broadcast:+broadcast $broadcast}

${subnet:+netmask $subnet}



if [ -n "$router" ] ; then



#echo "deleting routers"

#while route del default gw 0.0.0.0 dev $interface ; do

# :

#done



# record the gateway

for i in $router ; do

#route add default gw $i dev $interface

#logger $WANname gateway $i

nvram set wan2_gateway=$i

done

fi



# i don't think I want to lose my existing dns servers.

${domain:+echo search $domain >> $RESOLV_CONF}



for i in $dns ; do

grep $i $RESOLV_CONF

if [ $? -ne 0 ]; then

logger $WANname adding dns $i

echo nameserver $i >> $RESOLV_CONF

nvram set wan2_get_dns=$i

fi



#if you use dyndns you may wan to use this.

#wget -O /dev/null http://USER:PASSWORD@members.dyndns.org/nic/update?hostname=DOMAIN

done



;;

esac



#logger $WANname variable init



# retrieve all the old settings to use for iptables/route removal

IF0=`nvram get lan_ifname_old`

IP0=`nvram get lan_ip_old`

P0_NET=`nvram get lan_net_old`



IF1=`nvram get wan_iface_old`

IP1=`nvram get wan_ip_old`

P1=`nvram get wan_gateway_old`

P1_NET=`nvram get wan_net_old`

IF1_W=`nvram get wan_weight_old`



IF2=`nvram get wan2_iface_old`

IP2=`nvram get wan2_ip_old`

P2=`nvram get wan2_gateway_old`

P2_NET=`nvram get wan2_net_old`

IF2_W=`nvram get wan2_weight_old`

IF2_DNS=`nvram get wan2_get_dns_old`



# since we want to preserve the existing routing table

# just remove what we are going to add



#logger $WANname removing firewall and routes

ip route del default scope global nexthop via $P1 dev $IF1 weight $IF1_W nexthop via $P2 dev $IF2 weight $IF2_W



#ip route del $P1_NET dev $IF1 src $IP1 table $T1

#ip route del default via $P1 table $T1

#ip route del $P2_NET dev $IF2 src $IP2 table $T2

#ip route del default via $P2 table $T2



ip route del $P1_NET dev $IF1 src $IP1

ip route del $P2_NET dev $IF2 src $IP2



ip route del default via $P1

ip route del default via $P2



ip route flush table $T1

ip route flush table $T2



ip rule flush

ip rule add lookup main prio 32766

ip rule add lookup default prio 32767



#logger $WANname routes removed



# remove iptables rules

iptables -D FORWARD $NDX -o $IF2 -j wanout

iptables -D FORWARD $NDX -i $IF2 -j wanin

iptables -D INPUT -j DROP -i $IF0 -d $IP2

iptables -t nat -D PREROUTING -j DROP -i $IF2 -d $P0_NET

iptables -t nat -D PREROUTING -j DNAT -p icmp -d $P2 --to-destination $IP0

iptables -t mangle -D PREROUTING -i $IF1 -m state --state NEW -j CONNMARK --set-mark $Mrk1

iptables -t mangle -D PREROUTING -i $IF2 -m state --state NEW -j CONNMARK --set-mark $Mrk2

iptables -t mangle -D POSTROUTING -o $IF1 -m state --state NEW -j CONNMARK --set-mark $Mrk1

iptables -t mangle -D POSTROUTING -o $IF2 -m state --state NEW -j CONNMARK --set-mark $Mrk2

iptables -t mangle -D PREROUTING -i $IF0 -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark

iptables -t mangle -D OUTPUT -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark

iptables -D POSTROUTING -t nat -m mark --mark $Mrk1 -j SNAT --to-source $IP1

iptables -D POSTROUTING -t nat -m mark --mark $Mrk2 -j SNAT --to-source $IP2

iptables -t nat -D POSTROUTING -j MASQUERADE -o $IF2



#logger firewall rules removed



# Fill Local lan variables

IF0=`nvram get lan_ifname`

IP0=`ifconfig $IF0
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
awk -F . '$1 != 127 && $1 !=255 && $4 < 255{print $1 "." $2 "." $3 "." $4}'`

P0_NET=`echo $IP0
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
awk -F . '$1 != 127 && $1 !=255 && $4 < 255{print $1 "." $2 "." $3 ".0/24"}'`



# Fill Wan #1 variables

IF1=`nvram get wan_iface`

IP1=`ifconfig $IF1
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
awk -F . '$1 != 127 && $1 !=255 && $4 < 255{print $1 "." $2 "." $3 "." $4}'`

P1=`nvram get wan_gateway`

P1_NET=`echo $IP1
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
awk -F . '$1 != 127 && $1 !=255 && $4 < 255{print $1 "." $2 "." $3 ".0/24"}'`

IF1_W=`nvram get wan_weight`



# Fill Wan #2 variables

IF2=`nvram get wan2_iface`

IP2=`ifconfig $IF2
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
awk -F . '$1 != 127 && $1 !=255 && $4 < 255{print $1 "." $2 "." $3 "." $4}'`

P2=`nvram get wan2_gateway`

P2_NET=`echo $IP2
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
awk -F . '$1 != 127 && $1 !=255 && $4 < 255{print $1 "." $2 "." $3 ".0/24"}'`

IF2_W=`nvram get wan2_weight`

IF2_DNS=`nvram get wan2_get_dns`



# add the routes and firewall rules

if [ "$1" != "deconfig" ]; then

#logger $WANname appending firewall and routes



if [ "$IF2_DNS" != "" ]; then

#Add the wan2 dns route if it exists

nvram set wan2_get_dns_old=$IF2_DNS

nvram set wan2_iface_old=$IF2

ip route add $IF2_DNS dev $IF2

fi



if [ "$IP1" != "" ]; then

nvram set wan_iface_old=$IF1

nvram set wan_ip_old=$IP1

nvram set wan_gateway_old=$P1

nvram set wan_net_old=$P1_NET

nvram set wan_weight_old=$IF1_W

# add rules first

ip rule add from $IP1 table $T1 prio 100

ip rule add fwmark $Mrk1 table $T1 prio 101

# now add the routes...

ip route add $P1_NET dev $IF1 src $IP1 table $T1

ip route add $P1_NET dev $IF1 src $IP1

ip route add default via $P1 table $T1

ip route add $P0_NET dev $IF0 table $T1

ip route add 127.0.0.0/8 dev lo table $T1

fi



if [ "$IP2" != "" ]; then

# save values

nvram set wan2_iface_old=$IF2

nvram set wan2_ip_old=$IP2

nvram set wan2_gateway_old=$P2

nvram set wan2_net_old=$P2_NET

nvram set wan2_weight_old=$IF2_W

# add rules first

ip rule add from $IP2 table $T2 prio 200

ip rule add fwmark $Mrk2 table $T2 prio 201

# now add the routes...

ip route add $P2_NET dev $IF2 src $IP2 table $T2

ip route add $P2_NET dev $IF2 src $IP2

ip route add default via $P2 table $T2

ip route add $P0_NET dev $IF0 table $T2

ip route add 127.0.0.0/8 dev lo table $T2

fi



# if both interfaces are up load balance

if [[ "$IP1" != "" && "$IP2" != "" ]]; then

logger $WANname LoadBalance enabled

ip route add $P2_NET dev $IF2 table $T1

ip route add $P1_NET dev $IF1 table $T2



# now apply weighted round robbin load balancing:

ip route add default scope global nexthop via $P1 dev $IF1 weight $IF1_W nexthop via $P2 dev $IF2 weight $IF2_W

else

# see if we can add a default route

if [ "$IP1" != "" ]; then

logger $WANname LoadBalance disabled Default route via $IF1

ip route add default via $P1

fi



if [ "$IP2" != "" ]; then

logger $WANname LoadBalance disabled Default route via $IF2

ip route add default via $P2

fi

fi



ip route flush cache



if [ "$IP2" != "" ]; then



#get the line number after wanout to insert the interface at the correct position

NDX=`iptables -L FORWARD -v --line-numbers
sed -n "/wanout/h;$ {x;p;}"
awk '{print $1}'`

NDX=`expr $NDX + 1`



iptables -I FORWARD $NDX -o $IF2 -j wanout

iptables -I FORWARD $NDX -i $IF2 -j wanin

iptables -I INPUT -j DROP -i $IF0 -d $IP2



iptables -t nat -A PREROUTING -j DROP -i $IF2 -d $P0_NET

iptables -t nat -A PREROUTING -j DNAT -p icmp -d $P2 --to-destination $IP0



# Setup rules for preserving routes across connections (conversations)

iptables -t mangle -A PREROUTING -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark

iptables -t mangle -A OUTPUT -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark

iptables -t mangle -A PREROUTING -i $IF1 -m state --state NEW -j CONNMARK --set-mark $Mrk1

iptables -t mangle -A PREROUTING -i $IF2 -m state --state NEW -j CONNMARK --set-mark $Mrk2

iptables -t mangle -A PREROUTING -m connmark --mark $Mrk1 -j MARK --set-mark $Mrk1

iptables -t mangle -A PREROUTING -m connmark --mark $Mrk2 -j MARK --set-mark $Mrk2

iptables -t mangle -A PREROUTING -m state --state NEW -m connmark ! --mark 0 -j CONNMARK --save-mark



# Selective routing example: send all http traffic to a specific interface (WAN 1)

#iptables -t mangle -A PREROUTING -i $IF1 -m state --state NEW -p tcp --dport 80 -j CONNMARK --set-mark $Mrk1

#iptables -t mangle -A PREROUTING -i $IF1 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark $Mrk1



# enable masquerading on the interface

iptables -t nat -A POSTROUTING -j MASQUERADE -o $IF2



# turn off Reverse Path Filtering as this is a multi-homed router.

RP_PATH=/proc/sys/net/ipv4/conf

for IFACE in `ls $RP_PATH`; do

echo 0 > $RP_PATH/$IFACE/rp_filter

done

fi

fi

When testing out the scripts a bunch of "RTNETLINK answers" may occur as the script is trying to remove routes that don't yet exist, this is ok. Once you have tested out your connection using the console add the following to the Firewall and WAN Up scripts and your done.



Web Interface:Administration:Scripts:Firewall



/jffs/wan2/w2.evt

Web Interface:Administration:Scripts:WAN Up



/jffs/wan2/w2.init

Failover Script

#!/bin/sh

# Failover Script for dual wan.

# ver. 0.1



# 0 is good

# !0 bad



#IFx_PINGIP=the address to ping

#IFx= the interface name

#IFx_IP= the interface IP

#IFx_GW= the gateway associated with the interface

#IFx_FAIL_MAX= the trigger point at which the interface is considered down

#IFx_SUCC_MAX= the trigger point at which the interface is considered up

#IFx_W= round robbin weighting factor

#IFx_PING_CT= the current test ping tally

#IFx_PING= the current ping result

#IFx_LPING= the previous ping result

#IFx_ISUP= the status of the interface as determined by the MAX ping counts

#IFx_TEST= testing status



# WAN 1 tracking variables

IF1_PING_CT=0

IF1_PING=1

IF1_LPING=-3

IF1_ISUP=1

IF1_TEST=0



# WAN 2 tracking variables

IF2_PING_CT=0

IF2_PING=1

IF2_LPING=-3

IF2_ISUP=1

IF2_TEST=0



#apply defaults if needed

if [ `nvram get wanfail_defaults` != "1" ]; then

echo setting nvram defaults



nvram set wanfail_defaults=1



nvram set wanfail_interval=10

nvram set wanfail_ping_timeout=2



nvram set wanfail_w1_pingadd=www.yahoo.com

nvram set wanfail_w1_fail_max=5

nvram set wanfail_w1_succ_max=2

nvram set wanfail_w1_refresh=1



nvram set wanfail_w2_pingadd=www.yahoo.com

nvram set wanfail_w2_fail_max=5

nvram set wanfail_w2_succ_max=2

nvram set wanfail_w2_refresh=1



fi



# interval to pause between ping attempts

SLEEP_SEC=`nvram get wanfail_interval`



# ping timeout

PING_SEC=`nvram get wanfail_ping_timeout`

PING_DLY=2



#run the configuration the first time.

nvram set wanfail_w1_refresh=0

nvram set wanfail_w2_refresh=0

EXECFG=0



while : ; do

echo " "

echo " "

echo sleeping for $SLEEP_SEC sec.



sleep $SLEEP_SEC



echo " "



echo Testing WAN 1





if [ `nvram get wanfail_w1_refresh` != "1" ]; then

echo refreshing wan1 vars

nvram set wanfail_w1_refresh=1

# Obtain Wan #1 variables

IF1_PINGIP=`nvram get wanfail_w1_pingadd`

IF1=`nvram get wan_iface`

IF1_IP=`ifconfig $IF1
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
awk -F . '$1 != 127 && $1 !=255 && $4 < 255{print $1 "." $2 "." $3 "." $4}'`

IF1_GW=`nvram get wan_gateway`

IF1_FAIL_MAX=`nvram get wanfail_w1_fail_max`

IF1_SUCC_MAX=`nvram get wanfail_w1_succ_max`

IF1_W=`nvram get wan_weight`



PING_SEC=`nvram get wanfail_ping_timeout`

SLEEP_SEC=`nvram get wanfail_interval`

SLEEP_SEC=`expr $SLEEP_SEC - $PING_DLY`



if [ $SLEEP_SEC -lt 5 ]; then

nvram set wanfail_interval=5

SLEEP_SEC=5

fi

fi





# WAN 1

# ping the test ip

echo ping -W $PING_SEC -I $IF1_IP -c 1 $IF1_PINGIP > /dev/null 2>&1

ping -W $PING_SEC -I $IF1_IP -c 1 $IF1_PINGIP > /dev/null 2>&1

IF1_PING=$?

echo $IF1 Ping result: $IF1_PING



if [ $IF1_PING -ne $IF1_LPING ]; then

# here all we know is the ping status changed so reset the counter.

echo $IF1 Status switched $IF1_LPING to $IF1_PING

IF1_PING_CT=0

IF1_TEST=0

fi

# record the last ping

IF1_LPING=$IF1_PING



# if were in testing then proceed

if [ $IF1_TEST -eq "0" ]; then

if [ $IF1_PING -eq $IF1_ISUP ]; then

# stop testing as the status has not really changed...

echo testing halted as the ping result is consistent with the status... $IF1_PING = $IF1_ISUP

IF1_TEST=1

else

#increment the ping count

IF1_PING_CT=`expr $IF1_PING_CT + 1`

echo $IF1 ping count=$IF1_PING_CT

if [ $IF1_ISUP -eq "0" ]; then

echo testing for failure

# zero equals up so check for failure

# so if we are testing and status is up check to see if we are past the trigger limit

if [ $IF1_PING_CT -gt $IF1_FAIL_MAX ]; then

IF1_TEST=1

IF1_ISUP=1

EXECFG=0

echo $IF1 exceeded the fail count status changed to $IF1_ISUP

fi

else

echo testing for success

# test for max success condition

if [ $IF1_PING_CT -gt $IF1_SUCC_MAX ]; then

#not testing anymore

IF1_TEST=1

IF1_ISUP=0

EXECFG=0

echo $IF1 exceeded the success count status changed to $IF1_ISUP

fi

fi

fi

fi



sleep $PING_DLY



echo " "

echo Testing WAN 3

# WAN 2



if [ `nvram get wanfail_w2_refresh` != "1" ]; then

echo refreshing wan2 vars

nvram set wanfail_w2_refresh=1

# Obtain Wan #2 variables

IF2_PINGIP=`nvram get wanfail_w2_pingadd`

IF2=`nvram get wan2_iface`

IF2_IP=`ifconfig $IF2
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
awk -F . '$1 != 127 && $1 !=255 && $4 < 255{print $1 "." $2 "." $3 "." $4}'`

IF2_GW=`nvram get wan2_gateway`

IF2_FAIL_MAX=`nvram get wanfail_w2_fail_max`

IF2_SUCC_MAX=`nvram get wanfail_w2_succ_max`

IF2_W=`nvram get wan2_weight`



PING_SEC=`nvram get wanfail_ping_timeout`

SLEEP_SEC=`nvram get wanfail_interval`

SLEEP_SEC=`expr $SLEEP_SEC - $PING_DLY`



if [ $SLEEP_SEC -lt 5 ]; then

nvram set wanfail_interval=5

SLEEP_SEC=5

fi

fi



# ping the test ip

echo ping -W $PING_SEC -I $IF2_IP -c 1 $IF2_PINGIP > /dev/null 2>&1

ping -W $PING_SEC -I $IF2_IP -c 1 $IF2_PINGIP > /dev/null 2>&1

IF2_PING=$?

echo $IF2 Ping result: $IF2_PING



if [ $IF2_PING -ne $IF2_LPING ]; then

# here all we know is the ping status changed so reset the counter.

echo $IF2 Status switched $IF2_LPING to $IF2_PING

IF2_PING_CT=0

IF2_TEST=0

fi

# record the last ping

IF2_LPING=$IF2_PING



# if were in testing then proceed

if [ $IF2_TEST -eq "0" ]; then

if [ $IF2_PING -eq $IF2_ISUP ]; then

# stop testing as the status has not really changed...

echo testing halted as the ping result is consistent with the status... $IF2_PING = $IF2_ISUP

IF2_TEST=1

else

#increment the ping count

IF2_PING_CT=`expr $IF2_PING_CT + 1`

echo $IF2 ping count=$IF2_PING_CT

if [ $IF2_ISUP -eq "0" ]; then

echo testing for failure

# zero equals up so check for failure

# so if we are testing and status is up check to see if we are past the trigger limit

if [ $IF2_PING_CT -gt $IF2_FAIL_MAX ]; then

IF2_TEST=1

IF2_ISUP=1

EXECFG=0

echo $IF2 exceeded the fail count status changed to $IF2_ISUP

fi

else

echo testing for success

# test for max success condition

if [ $IF2_PING_CT -gt $IF2_SUCC_MAX ]; then

#not testing anymore

IF2_TEST=1

IF2_ISUP=0

EXECFG=0

echo $IF2 exceeded the success count status changed to $IF2_ISUP

fi

fi

fi

fi



echo testing done

if [ $EXECFG -eq "0" ]; then

EXECFG=1

echo configuring routes....



# if both up great

if [[ $IF1_ISUP -eq "0" && $IF2_ISUP -eq "0" ]]; then

# configure for load balancing

echo "ip route replace default scope global nexthop via $IF1_GW dev $IF1 weight $IF1_W nexthop via $IF2_GW dev $IF2 weight $IF2_W"

#ip route replace default scope global nexthop via $IF1_GW dev $IF1 weight $IF1_W nexthop via $IF2_GW dev $IF2 weight $IF2_W

ip route replace default scope global nexthop via $IF1_GW dev $IF1 weight $IF1_W nexthop via $IF2_GW dev $IF2 weight $IF2_W

elif [ $IF1_ISUP -eq "0" ]; then

# set default route for IF1

echo "ip route replace default scope global via $IF1_GW dev $IF1"

ip route replace default scope global via $IF1_GW dev $IF1



# the implication is that the dhcp server may have changed... so bounce it

# $IF2 is down so attempt to get a new dhcp lease as that could have changed.



elif [ $IF2_ISUP -eq "0" ]; then

# set default route for IF2

echo "ip route replace default scope global via $IF2_GW dev $IF2"

ip route replace default scope global via $IF2_GW dev $IF2

# $IF1 is down so attempt to get a new dhcp lease as that could have changed.

else

#both are down...

echo "both are down... game over man! game over!.... we're all gonna die down here!"

# $IF1 is down so attempt to get a new dhcp lease as that could have changed.

# $IF2 is down so attempt to get a new dhcp lease as that could have changed.

fi

fi

done