Вот для примера, как и обещал:
В
/etc/iproute2/rt_tables добавляем
101 P1 - Провайдер1
102 P2 - Провайдер2
routing.shecho "Чистим таблицы"
ip route flush table P1
ip route flush table P2
echo "Чистим правила в таблицах"
ip rule delete table P1
ip rule delete table P2
echo "Чистим кэш"
ip route flush cache
echo "Заносим gw в таблици"
ip route add default via <шлюз 1-го провайдера> dev <интерфейс 1-го прова> table P1
ip route add default via <шлюз 2-го провайдера> dev <интерфейс 2-го прова> table P2
echo "Добавляем правила в таблици"
ip rule add from <IP 1-го прова> table P1
ip rule add from <IP 2-го прова> table P2
echo "Добавляем правила в таблици по маркировке"
ip rule add fwmark 1 table P1
ip rule add fwmark 2 table P2
echo "Заносим сети провайдера в таблицу 1"
ip route add <Сеть 1-го прова> dev <интерфейс 1-го прова> src <IP 1-го прова> table P1
echo "Заносим сети провайдера в таблицу 2"
ip route add <Сеть 2-го прова> dev <интерфейс 2-го прова> src <IP 2-го прова> table P2
echo "Заносим локальные сети в таблицу 1"
ip route add <локальная сеть> dev <интерфейс локалки> src <IP на интерфейсе локалки> table P1
ip route add 127.0.0.0/8 dev lo table P1
echo "Заносим локальные сети в таблицу 2"
ip route add <локальная сеть> dev <интерфейс локалки> src <IP на интерфейсе локалки> table P2
ip route add 127.0.0.0/8 dev lo table P2
echo "Удаляем маршрут по умолчанию"
ip route del default
echo "Создаем маршрут по умолчанию"
ip route add default scope global nexthop via <шлюз 1-го прова> dev <интерфейс 1-го прова> weight 1 nexthop via <шлюз 2-го прова> dev <интерфейс 2-го прова> weight 1
Если провайдер выдает динамику, то можно в качестве параметров скрипту передавать IP и шлюз
Вырезка из правил iptables
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:balance - [0:0]
-A PREROUTING -m state --state RELATED,ESTABLISHED -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A PREROUTING -i <интерф. прова1> -m state --state NEW -j CONNMARK --set-xmark 0x1/0xffffffff
-A PREROUTING -i <интерф. прова2> -m state --state NEW -j CONNMARK --set-xmark 0x2/0xffffffff
-A PREROUTING -d <IP или сеть> -j CONNMARK --set-xmark 0x1/0xffffffff - это принудительный выход через 1-го прова.
-A PREROUTING -d <IP или сеть> -j CONNMARK --set-xmark 0x2/0xffffffff - это принудительный выход через 2-го прова.
-A PREROUTING -i <интерфейс локалки> -m state --state NEW -j balance
-A PREROUTING -m connmark --mark 0x1 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -m connmark --mark 0x2 -j MARK --set-xmark 0x2/0xffffffff
-A PREROUTING -m state --state NEW -m connmark ! --mark 0x0 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -m state --state RELATED,ESTABLISHED -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -m state --state NEW -j balance
-A balance -o lo -j RETURN
-A balance -o <интерфейс локалки> -j RETURN
-A balance -m connmark ! --mark 0x0 -j RETURN
-A balance -m state --state RELATED,ESTABLISHED -j RETURN
-A balance -j CONNMARK --set-xmark 0x2/0xffffffff
-A balance -j RETURN
В итоге вывод команды
ip ro будет следующим.
..........
default
nexthop via <шлюз 1-го прова> dev <интерфейс 1-го прова> weight 1
nexthop via <шлюз 2-го прова> dev <интерфейс 2-го прова> weight 1
...........
Оба провайдера работают как на вход так и на выход.