На шлюзе под управлением Debian 6.0 необоходимо настроить балансинг между двумя интернет-каналами посредством iproute2.Имеем три сетевых интерфейса:
eth0 - локальная сеть IP сетевого интерфейса 192.168.1.1, локальная сеть 192.68.1.0/24.
eth1 - первый провайдер (provider1), подключение ADSL. Моджем настроен в режиме роутера, IP сетевого интерфейса 192.168.2.2, IP модема 192.168.2.1. Сеть провайдера 2.2.2.0.24.
eth2 - второй провайдер (provider2), подключение через Ethernet, IP 1.1.1.100, шлюз провайдера 1.1.1.254, сеть провайдера 1.1.1.0.24.
Соотвественно имеем, если default gateway указывает на 192.168.1.1 весь трафик идет через первого провайдера, если 1.1.1.254 то через второго. Сейчас основным каналдом является eth2 и настроен скрипт автоматического переключения на eth1 в сулчае падения с возвратом назад. Такая схема работает.
Но клиент хочет, чтобы когда работают оба канала трафик распределялся между двумя каналами (за исключением некоторых портов).
Добавил таблицы:
user@server:/#cat /etc/iproute2/rt_tables
1 intranet
2 provider1
3 provider2
Создал скрипт для добавления маршрутов:
/sbin/ip route flush table default
/sbin/ip route flush table provider2
/sbin/ip route flush table provider1
/sbin/ip rule add from 1.1.1.100 table provider2
/sbin/ip rule add from 192.168.2.2 table provider1
/sbin/ip route add 1.1.1.0/24 dev eth2 src 1.1.1.100 table provider2
/sbin/ip route add default via 1.1.1.254 table provider2
/sbin/ip route add 2.2.2.0/24 dev eth2 src 192.168.2.2 table provider1
/sbin/ip route add default via 192.168.2.1 table provider1
/sbin/ip route replace default scope global nexthop via 1.1.1.254 dev eth2 weight 2 nexthop via 192.168.2.1 dev eth1 weight 1
В iptables:
-A POSTROUTING -o eth2 -j SNAT -s 192.168.100.0/24 --to-source 1.1.1.100
-A POSTROUTING -o eth1 -j SNAT -s 192.168.100.0/24 --to-source 192.168.2.2
При применении такой конфигурации, схема начинает работать. Проверю трейсом на разные айпи, один идут через eth1 другие через eth2. Но периодически пинги к некоторым айпи пропадают. Воспроизводится ситуация так:
находим внешний IP, который идет через eth1, трейс идет, пинг идет. Делаем на шлюзе ip route flush cache и пробуем еще раз трейс и пинг, черезщ несколько таких действйи пинг паропадет, трейс тоже. Смотрю tcpdump -i eth2 на шлюзе и вижу на нем такие пакеты (для примера внешний айпи 8.8.8.8):
IP 192.168.2.2 > 8.8.8.8: ICMP echo request
IP 192.168.2.2 > 8.8.8.8: ICMP echo request
Тоесть пакеты с eth1 и исходящим IP 192.168.2.2 почему-то идут на eth2. Но идут они туда не всегда а периодически. Такое впечатление, что для них второй раз срабатывает маршрутизация scope global nexthop и их поэтмоу кидает на интерфейс eth2.
Хотя указано же, что ip rule add from 192.168.2.2 table provider1, все пакеты и источником 192.168.2.2 должны роутиться на 192.168.2.1.
Не могу понять по какой причине так происходит.