We have DSL service from two ISPs:
MTNL (purchased in 2006, when
they were the only provider in the area) and
Airtel (purchased in 2009
during a week-long outage on the MTNL line). By coincidence, both ISPs
gave us UT Starcom UT-304R2 modems (but with different packaging and
firmware); these are configured as bridges, and I have two PPPoE
interfaces set up on my Linux gateway.
I used to let pppd set a default route through whichever link happened
to come up first at boot, and would switch the route by hand when that
link went down. That strategy proved remarkably short-sighted when I
found myself unable to access my home network from the outside because
the gateway lacked a functioning default route. Last weekend, I spent a
few minutes making sure I wouldn't be left stranded ever again. Here's a
When a PPP link is established, I want to add a default route through it
if there isn't a default route already. When a link goes down and takes
the default route with it, I want to switch the route to the other link.
(If both links are down, there's nothing to do but wait for one to come
up and establish a new default route). In both cases, I want to do a
dynamic DNS update when I add a new default route. To this end, I
# If there's a default route, exit.
/sbin/ip route list|grep -q "^default " && exit
# If we can't establish a new default route, exit.
/sbin/ip route add default dev $IF || exit
On my Ubuntu system,
/etc/ppp/ip-down after a
PPP link is brought up or torn down and they, in turn, run the scripts
respectively, with the interface name as the first argument. I told
pppd to keep its hands off the default route
/etc/ppp/ip-down.d/00link to call my script.
if [ $1 = "ppp0" ]; then
(It's worth noting that
ip-down.d/00link is called when the
interface is already down, so no "does the default route point to us?"
test is necessary. If it did, the route went down with the interface.)
Someday I will set up policy routing so that I can use both links
together. But, for now, I am satisfied with having the correct default
route set without my intervention.