In this example the router has three interfaces:
eth0
for the local network, rfc1918eth1
is a broadband connection (default gateway) with a volatile ip addressppp0
is a narrow band connection (e.g. gprs, umts, ..) with a volatile ip addressAll interfaces are always-on.
For accessing the router and/or the local network from outside, the router connects to a vpn server which distributes the routes to other vpn clients.
In case of losing eth1
we still want to be able to connect to the router and/or the local network. That's what ppp0
is for.
You can define up to 252 custom routing tables in Linux (three tables are pre-defined). These can be referred either by a number or their corresponding mapping:
$ grep '^[^#]' /etc/iproute2/rt_tables
255 local
254 main
253 default
0 unspec
See also linux routing tables.
The default routing table Linux uses is main
(not default
, as one would suspect). The local
table is usually not for fscking around with, it is handled by the kernel and contains loopback addresses, broadcasts, etc.
Lower priority tables (up to 253
) can be used (almost) for whatever you like. When Linux looks for a route to a specific address, it walks through all tables beginning with 255
and stops at the first match.
Routes to more specific targets override routes to less specific ones, e.g. 192.168.255.0/24
overrides 192.168.0.0/16
. So setting a route to 93.184.216.34/32
via ppp0
would override the default route and the vpn connection would be established using the narrow band upstream. We don't want that.
Overriding only works within a single table. And that's what multitable routing is about: we set up a specific route in table 253
, in this case a route to the vpn server via ppp0
without overriding the default gateway in table 254
:
$ ip route add 93.184.216.34/32 dev ppp0 table default
That's it. As simple as that. Check it:
$ ip route ls
default via 10.255.255.1 dev eth1
10.64.64.64 dev ppp0 proto kernel scope link src 10.123.123.123
10.255.255.0/30 dev eth1 proto kernel scope link src 10.255.255.2
10.2.2.0/24 dev eth0 proto kernel scope link src 10.2.2.1
$ ip route ls table default
93.184.216.34 dev ppp0 scope link
$ ip route get 93.184.216.34
93.184.216.34 via 10.255.255.1 dev eth1 src 10.255.255.2
cache
Now when eth1
goes down, the main
routing table entries regarding eth1
get cleared and the default route vanishes. When trying to connect to the vpn server Linux finds a matching routing entry in table 253
(default
).