Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Русскоязычное Linux-сообщество ([info]lj_ru_linux)
@ 2013-01-09 22:33:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
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) никакого эффекта не дало. Чувствую, что я упустил какую-то простую вещь, но не пойму, какую..


(Читать комментарии) (Добавить комментарий)