Назад | Перейти на главную страницу

Маршрутизация + iptables? (ELB + NAT шлюз)

У меня есть группа идентичных внешних веб-серверов amazon linux ec-2, которые обслуживают свой веб-контент через Elastic Load Balancer (ELB).

У каждого из них есть общедоступный IP-адрес, поэтому, когда они подключаются к внешнему сервису в www, их IP-адреса регистрируются как несколько разных.

Я бы хотел, чтобы эти серверы продолжали обслуживать свой веб-контент через ELB, но подключались к внешнему миру через NAT-шлюз, используя его единственный эластичный IP-адрес.

Вот что я сделал:

1) создал шлюз NAT в той же подсети (10.0.1.100 это ip), поскольку машины ec2 + назначили ему эластичный ip. 2)

route add -host ifconfig.co gw 10.0.1.100 dev eth0
route add -host otherservice gw 10.0.1.100 dev eth0
...

Сейчас curl ifconfig.co возвращает внешний эластичный IP-адрес шлюза NAT, и это здорово :), однако мне нужно, чтобы весь трафик проходил через шлюз NAT, за исключением того, который проходит через ELB.

ОБНОВЛЕНИЕ. Вот что я сделал для выполнения задачи: 1) удалил настраиваемый маршрут к ifconfig.co и другим службам;

2) создана вторая подсеть 10.0.200.0/24;

3) добавлен шлюз NAT в качестве шлюза по умолчанию в свою таблицу маршрутизации;

4) добавил следующие строки в /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

ELB находится в той же сети, что и ваши веб-серверы. С точки зрения веб-серверов все веб-запросы будут исходить от балансировщика нагрузки. Поскольку балансировщик нагрузки находится в той же сети, никакой сложной маршрутизации не требуется.

Просто добавьте один маршрут по умолчанию к шлюзу NAT на каждом веб-сервере. Или, если вы хотите, чтобы все серверы в подсети использовали шлюз NAT, измените маршрут по умолчанию в вашей подсети, как предложено выше.