Создал две дополнительных таблицы маршрутизации.
В каждую добавил информацию о сети соответствующего провайдера, локальной сети и 127.0.0.0/8. Добавил в каждую таблицу шлюз провайдера как default маршрут.
В основной таблице шлюз первого провайдера прописан как шлюз по умолчанию.
Дальше делаю так:
Код: Выделить всё
ip rule add fwmark 100 table ISP1
ip rule add fwmark 200 table ISP2
iptables -t mangle -A PREROUTING -i eth1 -j MARK --set-mark 100
iptables -t mangle -A PREROUTING -i eth2 -j MARK --set-mark 200
iptables -t mangle -A PREROUTING -d some_IP/32 -j MARK --set-mark 200
iptables -o eth1 -j MASQUERADE
iptables -o eth2 -j MASQUERADE
iptables -A FORWARD -s $LOCAL_NET -j ACCEPT
iptables -A FORWARD -d $LOCAL_NET -j ACCEPTИ получаю такую картину: при попытке соединиться из внутренней сети на some_IP пакет проходит PREROUTING, где успешно маркируется правильной меткой; потом попадает в FORWARD, где видно, что выходной интерфейс определён верно (т.е. пакет попал по метке в нужную таблицу); выходит на нужном интерфейсе через POSTROUTING с NAT'ом. tcpdump показывает вылетающий пакет. Т.е. всё правильно.
Только соединения нет, потому что в обратном направлении пакеты пропадают. tcpdump показывает, что пакет проходит по правильному интерфейсу. В PREROUTING пакет проходит, успешно маркируется правильной меткой. И всё. Дальше его уже нету. В FORWARD - тишина.