LINUX.ORG.RU
ФорумAdmin

routing + iptables + elb + nat gateway

 , , , ,


0

1

Всем привет.

Вопрос про routing + iptables, видимо:

Есть несколько одинаковых веб серверов (amazon linux), на которых крутится сайт. У каждого сервера есть внутренний ip из подсети 10.0.1.0/24 и внешний ip. Раздаётся веб контент с них через балансировщик (ELB) и далее Internet Gateway (это всё Амазоновские приблуды).

Нужно, чтобы контент продолжал раздаваться через ELB балансировщик, а в остальной интернет сервера выходили через NAT Gateway, у которого есть внутренний и внешний ipшники (для того, чтобы их ipшник логался, как один и тот же на некоторых внешних сервисах, ну и для других вещей).

Сейчас этот NAT Gateway присутствует в той же подсети, что и машины и реализовано это с помощью, например, такого:

route add -host ifconfig.co gw 10.0.1.100 dev eth0
где 10.0.1.100 - это ip NAT Gateway'я, а eth0 интерфейс на машине. Теперь curl ifconfig.co возвращает внешний ip NAT Gateway, ура :)

Но нужно пустить ВЕСЬ трафик через NAT Gateway, кроме того, что приходит через ELB балансер.

Вижу это так: 1) создать 2ю подсеть, скажем 10.0.200.0/24; 2) перевести NAT Gateway туда; 3) добавить машинам второй eth1 интерфейс с второй подсетью; 3) с помощью роутинга и iptables настроить то, что требуется.

Собственно прошу помощи с последним пунктом, т.к. в роутингом и сложными правилами iptables, пока что, не очень силён.

С уважением, Валерий

Вам нужно настроить маркировку пакетов через -j CONNMARK и потом пакеты без маркера отправлять в отдельную таблицу маршрутизации, в которой прописан маршрут через NAT Gateway.

iptables -t mangle -I PREROUTING -i eth0 --state NEW -j CONNMARK --set-mark 4

iptables -t mangle -I OUTPUT -i eth0 -j CONNMARK --restore-mark

ip route add 10.0.200.0/24 dev eth1 table 44

ip route add default via 10.0.200.100 dev eth1 table 44

После этих команд смотрите, что тарфик ходит, проверяете, что счётчики у этих правил iptables растут, и делаете:

ip rule add fwmark 0 table 44

mky ★★★★★ ()
Ответ на: комментарий от mky

Спасибо, попробую!

Вопрос вдогонку: нужно ли мне делать

sysctl net.ipv4.conf.eth0.rp_filter=0
и
echo 1 > /proc/sys/net/ipv4/ip_forward
на каждом сервере?

vainkop1 ()
Ответ на: комментарий от mky

В итоге сделал так:

nano /etc/rc.d/rc.local
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
if [ -z "`cat /etc/iproute2/rt_tables | grep '^200'`" ] ; then echo "200 nat" >> /etc/iproute2/rt_tables; fi
ip route add default via 10.0.200.1 dev eth1 table nat
ip rule add fwmark 0x1 table nat
ip2addr=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')
iptables -A OUTPUT -t mangle -o eth0 -p tcp --dport 80 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o eth1 -p tcp --dport 80 -j SNAT --to $ip2addr
iptables -A OUTPUT -t mangle -o eth0 -p tcp --dport 443 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o eth1 -p tcp --dport 443 -j SNAT --to $ip2addr

vainkop1 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.