|
| |||
|
|
Policy routing и Reverse Path Filtering Есть у меня машинка с двумя сетевыми интерфейсами (eth0 и eth1), подключёнными к разным провайдерам. Оба провайдера используют серые адреса и NAT. Пусть будут, скажем, 172.16.1.2 и 192.168.3.4. Default route смотрит в первого провайдера. Понадобилось мне отправить трафик на определённый порт через второго провайдера. Задача типичная, много раз в интернетах разжёванная. Создаём дополнительную маршрутную таблицу foo, добавляем в неё маршрут ip route add default via 192.168.3.1 dev eth1 table foo, маркируем нужный трафик с помощью iptables -t mangle -A PREROUTING -p tcp --dport $port -j MARK --set-mark 5, и маршрутизируем этот трафик по дополнительной таблице с помощью ip rule add fwmark 5 table foo.Трафик начинает ходить через eth1, но... уходит он с адреса 172.16.1.2, и естественно, ничего не работает. По совету лучших собаководов маскарадим маркированный трафик: -t nat -A POSTROUTING -m mark --mark 5 -j SNAT --to 192.168.3.4.Теперь трафик уходит с правильного адреса, ответы приходят, но... до программы не доходят. Дальнейшее гугление показало, что его убивает Reverse Path Filtering. Лечится путём echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter, и то же самое для eth1 и ещё для all, иначе таки не работает. Почему срабатывает RPF - не сильно понятно, по идее он должен убивать входящие пакеты, ответы на которые через этот интерфейс ходить не должны. А в данном случае они как раз должны.Вопрос: нельзя ли достичь нужного результата менее извращёнными методами, без SNAT и отключения RPF? Программа ни к какому адресу явно не байндится, он должен подставляться автоматически, а подставляется почему-то всегда только 172.16.1.2. Добавление к маршруту параметра src 192.168.3.4 ( ip route add default via 192.168.3.1 dev eth1 src 192.168.3.4 table foo) никакого эффекта не дало. Чувствую, что я упустил какую-то простую вещь, но не пойму, какую.. |
||||||||||||||