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 не накладывается - ядро не собирается, на стейбле - работает
как задумано :).

Ответить