Вирт. машина (далее linux-роутер) предназначенная для агрегации ISP и проброса подключений к внутреннему серверу подключена к двум «железным» роутерам через коммутатор и получает от них интернет. Оба роутера в одной подсети (192.168.1.1, 192.168.1.2).
linux-router:
eth0: address 192.168.1.111 (получает интернет от первого ISP)
eth1: address 192.168.1.112 (получает интернет от второго ISP)
eth2: address 10.0.0.1 (подключена к целевому серверу в локальной сети)
Что я делаю:
1. Забочусь о том, чтобы пакеты уходили на через тот же интерфейс на который пришли.
ip rule add from 192.168.1.111 lookup t1
ip rule add from 192.168.1.112 lookup t2
ip route add default via 192.168.1.1 dev eth0 table t1
ip route add 192.168.1.0/24 dev eth0 table t1
ip route add default via 192.168.1.2 dev eth0 table t2
ip route add 192.168.1.0/24 dev eth1 table t2
На этом этапе мне доступны службы работающие на linux-router по двум IP (например, первый «железный» роутер пробрасывает порт 22 на 192.168.1.111, а второй на 192.168.1.112, в итоге получаю доступ из интернета к SSH по двум белым IP).
2. Пробрасываю порт 80 к IIS'у висящему на 10.0.0.2 и подключенному к eth2.
- мечу пакеты:
iptables -t mangle -N in-marking
iptables -t mangle -A PREROUTING -m conntrack -ctstate NEW -j in-marking
iptables -t mangle -A in-marking -i eth0 -j CONNMARK --set-xmark 0x1/0x3
iptables -t mangle -A in-marking -i eth1 -j CONNMARK --set-xmark 0x2/0x3
На этом этапе, если посмотреть connmark -L -p tcp --dport 22 (для подключений к SSH lunux-роутера), то видно, что пакеты получают нужные метки (для 80-го порта в дальнейшем какая-то ерунда).
Когда порт 80 будет проброшен и веб-сервер даст ответ, надо восстановить метку и направить ответ туда откуда он пришёл:
iptables -t mangle -N out-marking
iptables -t mangle -A PREROUTING -m connmark ! --mark 0x0/0x3 -j out-marking
iptables -t mangle -A out-marking -i eth2 -j CONNMARK --restore-mark --mask 0x3
ip rule add fwmark 0x1/0x3 lookup t1
ip rule add fwmark 0x2/0x3 lookup t2
И наконец самое загадочное. NAT'им подключения на 80-й порт внутреннего сервера.
NAT'им:
iptables -t nat - A PREROUTING -m connmark --mark 0x1/0x3 -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
iptables -t nat - A PREROUTING -m connmark --mark 0x2/0x3 -i eth1 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
Проблема. Веб-сервер доступен только по одному интерфейсу, причём выбирается он кажется случайно.
С помощью iptables -vL -t nat я вижу, что оба правила применяются в зависимости от того на какой интерфейс (eth0 или eth1) пришёл запрос, но до моего веб-сервера доходят пакеты лишь с одного интерфейса, в этом я убеждаюсь с помощью tcpdump -i eth2 -t tcp (в одном случае он всегда молчит).
Помогите пожалуйста!
P.S. использовать iproute на веб-сервере и решить проблему не могу, т.к. сервер виндовый, а там с этим не понятно. К тому же хотелось бы иметь универсального агрегатора ISP, чтобы к нему подключать нужные внутренние машины.
P.P.S. Идея взята из http://habrahabr.ru/post/117620/