15.09.2011 19:41, Oleksandr V. Typlyns'kyi пишет: > Today Sep 15, 2011 at 19:01 Denis Zaika wrote: > >> Так как дефолтные маршруты есть в оба интерфейса, путь к произвольному >> адресу в сети до попытки связаться с ним неопределен. Если с такого >> адреса пробовать подключаться к внутренней машине через нат, обратный >> пакет может выйти через другой интерейс. То есть связи через один из >> внешних адресов не будет. Причем когда запись в ECMP устареет, следующая >> попытка может оказаться неуспешной уже на адресе, к которому раньше >> коннектилось. >> >> Можно ли это вообще как-то правильно отконфигурировать? У меня идеи >> кончились :(. > > Пролетала тут ссылочка на статью Вадима Гончарова: > http://nuclight.livejournal.com/124348.html > Она идей добавит :) > > В частности, с использованием появившегося во FreeBSD 6.2 параметра tag на > каждый пакет > можно навешивать внутриядерный тег, что в применении со skipto позволяет > сделать, > к примеру, запоминание, с какого шлюза пришел входящий пакет на машине с > каналами > к двум разным провайдерам, и ответные пакеты отправлять в тот канал, откуда > они > пришли (допустим, у вашей машины только один IP-адрес, и сделать fwd на базе > внешнего адреса не получится), т.е. реализовать аналог reply-to из pf: > > ipfw add 100 skipto 300 tag 1 in recv $ext_if1 keep-state > ipfw add 200 skipto 300 tag 2 in recv $ext_if2 keep-state > ipfw add 300 allow { recv $ext_if1 or recv $ext_if2 } # входящие снаружи > ipfw add 400 allow in recv $int_if # разрешить ответы на внутреннем проходе > ipfw add 500 fwd $gw1 tagged 1 # остались ответы на внешнем интерфейсе, > ipfw add 600 fwd $gw2 tagged 2 # зарулим их куда надо > > UPDATE: > 2. Динамические правила и ipfw fwd; теги. > > Приведенный в посте пример того, как на динамических правилах сделать > аналог reply-to в pf, на самом деле, не работает. В исходниках был > обнаружен запрет специально именно этого случая в мохнатом 2000 году из-за > какой-то паники ядра на тех версиях. Что давно уже не актуально, но это, > конечно же, поправить забыли. Патчится одной строчкой - открываете > /sys/netinet/ip_fw2.c, находите слова case O_FORWARD_IP: (конкретный патч > не приведу, зависит от версии системы). И вот там чуть ниже в строчке кусок > if (!q || dyn_dir == MATCH_FORWARD) > надо заменить на > if (sa->sin_port && (!q || dyn_dir == MATCH_FORWARD)) > [UPD: 06.07.11 патч закоммичен в 7.x и 8.x, патч более неактуален, теперь всё > работает так, как и описано в посте] > > Еще, кстати, не стоит забывать, что все имеющиеся на пакетах теги, будь то > метаинформация самой системы (от того же IPSEC и много чего еще) или явно > навешенные теги ipfw/pf - существуют только внутри ядра. То есть, если > вывести пакет из ядра через divert, они потеряются. >
Патч на 8.2 не накладывается - ядро не собирается, на стейбле - работает как задумано :).
