Добрый день всем!Имеется два канала в интернет. И Linux машина, которая их разруливает. Имеем 3 интерфейса. Два на каждого провайдера и один смотрит в сторону локальной сети, в которой находится веб-сервер, к которому собственно и необходимо дать доступ через обоих провайдеров.
eth1 - смотрит в сторону 1го провайдера (назовем его isp1) и имеет адрес 100.0.0.100/24 (default gw = 100.0.0.1)
на этот адрес рутится подсеть 10.10.10.0/24 в которую входит адрес 10.10.10.10/24. 10.10.10.10/24 и является адресом для веб-сервера через 1го провайдера. Этот канал, собственно, и является основным.
eth2 - смотрит в сторону 2го провайдера (назовем его isp2) и имеет адрес 10.20.20.9/24 (default gw = 10.20.20.1), плюс он имеет алиас eth2:1 10.20.20.20/24, который является адресом для веб-сервера через второго провайдера.
eth0 - смотрит в локалку и имеет адрес 10.0.0.1/24, в этой локалке и стоит веб-сервер, который имеет адрес 10.0.0.2/24.
Имеем примерно следующие правила для iptables:
# Пропускаем всех, кто идет на веб-сервер
-A FORWARD -p tcp -m tcp -d 10.0.0.2 -i eth1 -o eth0 --dport 80 -j ACCEPT
-A FORWARD -p tcp -m tcp -d 10.0.0.2 -i eth2 -o eth0 --dport 80 -j ACCEPT
# Меняем адреса в случае, когда веб-сервер идет в инет
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -j SNAT --to-source 10.10.10.10
-A POSTROUTING -s 10.0.0.0/24 -o eth2 -j SNAT --to-source 10.20.20.20
# Меняем адреса, когда клиенты идут на веб-сервер
-A PREROUTING -d 10.10.10.10 -i eth1 -j DNAT --to-destination 10.0.0.2
-A PREROUTING -d 10.20.20.20 -i eth2 -j DNAT --to-destination 10.0.0.2
Далее iproute2:
# Создаю алиас на 2ой интерфейс
ip addr add 10.20.20.20/24 dev eth2 label eth2:1
# Формируем таблицу маршрутизации для 1го провайдера
ip route add 100.0.0.0/24 dev eth1 src 100.0.0.100 table isp1
ip route add 10.0.0.0/24 dev eth0 src 10.0.0.1 table isp1
ip route add 127.0.0.0/8 dev lo table isp1
ip route add default via 100.0.0.1 table isp1
# Формируем таблицу маршрутизации для 2го провайдера
ip route add 10.20.20.0/24 dev eth2 src 10.20.20.9 table isp2
ip route add 10.0.0.0/24 dev eth0 src 10.0.0.1 table isp2
ip route add 127.0.0.0/8 dev lo table isp2
ip route add default via 10.20.20.1 table isp2
# Default GW для Default таблицы
ip route add default via 100.0.0.1 dev eth1
# Правила для isp1
ip rule add from 100.0.0.100 table isp1
ip rule add from 10.10.10.0/24 table isp1
# Правила для isp2
ip rule add from 10.20.20.9 table isp2
ip rule add from 10.20.20.20 table isp2
# Очищаем кэш
ip route flush cache
А проблема, собственно, заключается вот в чем:
Рассматриваем 3-way handshake, клиент пытается установить соединение с веб-сервером через второго провайдера, отправляет SYN сегмент, отслеживаю tcpdump'ом, что адреса сменились (10.20.20.20 -> 10.0.0.2) и сегмент был благополучно доставлен. Теперь веб-сервер отправляет SYN+ACK клиенту. Так же вижу, что адреса нормально преобразовались обратно DNAT'ом (10.0.0.2 -> 10.20.20.20), но уходит сегмент через eth1, а не через eth2, где и благополучно посылается куда подальше. Как не сложно догадаться, где-то что-то не так.
Но вот где именно и что?
Скажу сразу, что пробовал менять:
1. Отказатся от алиасов и сделать, как и в случае с isp1, используя подсети.
2. Отрубить SNAT.
3. Быть может что-то еще, но забыл:-)