Iptables: как заставить хосты выходить через определенный внешний IP?
Пусть есть Linux-router.
Пусть есть 3 внешних IP (eth0=EXT_IP0, eth0:1=EXT_IP1, eth0:2=EXT_IP2).
Пусть у него есть внутренний eth1=192.168.0.1.
И пусть есть некий 192.168.0.2 — сервер терминалов.
Задача:
1. прокидывать снаружи с EXT_IP1 порт терминалов на сервер терминалов.
2. но чтобы с последнего наружу трафик (новый) выезжал по EXT_IP2.
Первая часть решена (CentOS6, /etc/sysconfig/iptables):
*nat
-A PREROUTING -i eth0 -d <EXT_IP1> -p tcp --dport 3389 -j DNAT --to-destination 192.168.0.2:3389
*filter
-A FORWARD -i eth0 -m state --state NEW -m tcp -p tcp -d 192.168.0.2 --dport 3389 -j ACCEPT
Маскарад тоже:
-A POSTROUTING -o eth0 -j MASQUERADE
Но выезжают все, ессно, через EXT_IP0.
А надо — через EXT_IP2.
Помечаем исходящий трафик с нужной машины соответствующими метками в iptables:
iptables -t mangle -A PREROUTING -s 192.168.0.2 -j MARK --set-mark 102
iptables -t mangle -A PREROUTING #все остальное# -j MARK --set-mark 101
Настраиваем корректно обе таблицы маршрутизации:
ip route add $сеть_провайдера via $внешнийIP dev eth0:2 table wan102
…
ip rule add fwmark 102 table wan102
И по аналогии настраиваем таблицу для остальных wan101
Прошу прощения — не могли бы Вы подсказать — не будет ли эта конструкция проще, если выгонять через EXT_IP2 всю сеть?
Я тут подумал и решил выгнать сервер терминалов в отдельную физическую (и IP, ессно) сеть.
Ну, вам виднее. Можно делать как угодно. Я лишь основную логику объяснил. Фильтруем, маркируем, маршрутизируем. А что куда и как фильтровать\маршрутизировать нужно решать из общих соображений топологии сети, а не легче\проще.
Из общих соображений — логично делать количество таблиц маршрутизации по количеству внешних интерфейсов и распределять исходящий трафик по принципу: откуда пришел, туда и отправляем.
А уж через какой выводить вовне сервер — дело сугубо ваше интимное.
Как упростит\усложнит задачу выделение сервера в отдельную сеть — не вижу. Скорее чуть усложнит. Проще просто отфильтровать по источнику и отмаркировать.