LAN: eth0: 192.168.0.1/24
IP1: eth1: 192.168.1.1/24, gateway: 192.168.1.2/24
IP2: eth2: 192.168.2.1/24, gateway: 192.168.2.2/24
So here is how I would do by using iptables method:
Route tables
First edit the /etc/iproute2/rt_tables to add a map between route table numbers and ISP names
...
10 IP1
20 IP2
...
So table 10 and 20 is for ISP1 and ISP2, respectively. I need to populate these tables with routes from main table with this code snippet (which I have taken from hxxp://linux-ip.net/html/adv-multi-internet.html)
#!/bin/bash ip route show table main | grep -Ev '^default' | while read ROUTE ; do
ip route add table IP1 $ROUTE
done
And add default gateway to ISP1 through that ISP1’s gateway:
ip route add default via 192.168.1.2 table IP1
Do the same for IP2
So now I have 2 route tables, 1 for each IP.
Iptables
OK now I use iptables to evenly distribute packets to each route tables. More info on how this work can be found here (http://www.diegolima.org/wordpress/?p=36) and here (http://home.regit.org/?page%5Fid=7)
# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
NAT
Well NAT is easy:
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
Thanks, but in order to force google services to work correctly I’ve modified mark rules in the following way:
iptables -A PREROUTING -t mangle -i $LAN_IF -m state –state NEW -j MARK –set-mark 10
iptables -A PREROUTING -t mangle -i $LAN_IF -m state –state NEW -m statistic –mode random –probability 0.5 -j MARK –set-mark 20