ipfw nat redirect_port + policy based

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
iltmpz
ефрейтор
Сообщения: 58
Зарегистрирован: 2008-11-10 13:10:56

ipfw nat redirect_port + policy based

Непрочитанное сообщение iltmpz » 2011-05-30 12:45:47

Есть 2 независимых инет-канала 1.1.1.1 и 2.2.2.2, разные провайдеры, есть внутренняя сеть. Во внутренней сети сервер терминалов: 192.168.0.2
Дефолтовый трафик с роутера идет через 1.1.1.1, множественные таблицы маршрутизации в ядре не собирал.

Надо, чтобы когда внешний клиент из инета обращается к 1.1.1.1:3389 или к 2.2.2.2:3389 - запрос перенаправлялся роутером на сервер терминалов, ответ возвращался с сервера терминалов по default gw на роутер, и он отдавал пакет обратно на тот интерфейс, с которого пришел ответ.

Проблема в следующем: при обращении на основной интерфейс (1.1.1.1), клиент получает ответ, на второй - нет.

Собственно, ситуация следующая:
Пакет заходящий через 1.1.1.1 проходит через nat, проходит через локальную сеть на сервер терминалов, после чего ответ выходя с сервера терминалов попадает на роутер и обратно через nat выходит к клиенту. Тут все ок.
Пакет заходящий через 2.2.2.2 проходит через nat, проходит через локальную сеть на сервер терминалов, после чего ответ выходя с сервера терминалов попадает на роутер,а вот дальше он похоже пытается выйти через тот дефолтовый интерфейс с ip 1.1.1.1, вместо 2.2.2.2.

Похоже на то, что роутер теряет какой-то тег, который должен был бы говорить о том, что исходный пакет пришел с 2.2.2.2, чтобы ответ возвращался туда же. Можно ли как-то решить эту проблему? Другими словами, на роутер (на интерфейс лок. сети) с терминала приходит ответ с порта 3389, как понять, с какого внешнего интерфейса пришел запрос, на который ответил сервер терминалов?
Приходит в голову только поиграться с keep-state, но что-то я не совсем понимаю, куда тут его пристроить. Или может быть, надо включить какой-то ключ ipfw nat, который я не включил? И вообще реализуемо ли это теми средствами, которыми я пытаюсь это реализовать?
У меня оба nat'а запускаются так:

Код: Выделить всё

${fwcmd} nat 2 config if ${ext_if_2} reset same_ports redirect_port tcp 192.168.0.2:3389 3389
${fwcmd} nat 1 config if ${ext_if_1} reset same_ports redirect_port tcp 192.168.0.2:3389 3389
Отсылка трафика через второй интерфейс работает так:

Код: Выделить всё

${fwcmd} add fwd ${ext_gw_2} ip from 2.2.2.2 to any out xmit ${ext_if_1}

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение terminus » 2011-05-30 12:53:07

http://www.lissyara.su/articles/freebsd ... #example_5
В данном примере "пробрасывать порты" можно только с того внешнего IP адреса который имеет default route в таблице маршрутизации по-умолчанию (fib 0). В данном случае это сетевой адаптер em0 с IP 11.22.33.44 - в экземпляре его ната выставлен проброс соединений приходящих на 25 порт на внутреннюю машину 192.168.1.5. Чтобы иметь возможность делать это с обеих внешних IP адресов, надо добавить в пример еще и такие правила:

Код: Выделить всё

add 1011 skipto 1040 ip from any to any out xmit fxp0 tagged 1
add 1012 skipto 1060 ip from any to any out xmit fxp0 tagged 2
add 10171 skipto 10180 tag 1 ip from any to any in recv em0
add 10201 skipto 10210 tag 2 ip from any to any in recv em1
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.


Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение skeletor » 2011-05-30 13:06:49

Вообще-то лучше почитать статью 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 # зарулим их куда надо
Обязательно прочесть в самом низу пункт "2. Динамические правила и ipfw fwd; теги."

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение terminus » 2011-05-30 13:10:31

Что читать-то, если fwd + keep-state не работают? :smile:
В его задаче нет необходимости рутить трафик самого сервера, а только натовый трафик внутренных машин. В этом случае мой пример должен работать.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

iltmpz
ефрейтор
Сообщения: 58
Зарегистрирован: 2008-11-10 13:10:56

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение iltmpz » 2011-05-30 19:33:07

terminus писал(а):http://www.lissyara.su/articles/freebsd ... #example_5
В данном примере "пробрасывать порты" можно только с того внешнего IP адреса который имеет default route в таблице маршрутизации по-умолчанию (fib 0). В данном случае это сетевой адаптер em0 с IP 11.22.33.44 - в экземпляре его ната выставлен проброс соединений приходящих на 25 порт на внутреннюю машину 192.168.1.5. Чтобы иметь возможность делать это с обеих внешних IP адресов, надо добавить в пример еще и такие правила
Что-то я никак не могу понять, даже оригинальный пример из доки не работает. Набрал 1 к 1 то же, что и там, выкинув явно ненужное:
01011 skipto 1040 ip from any to any out xmit vlan1 tagged 1
01012 skipto 1060 ip from any to any out xmit vlan1 tagged 2
01040 setfib 0 ip from any to any in recv vlan1 keep-state
01050 allow ip from any to any via vlan1
01060 setfib 1 ip from any to any in recv vlan1 keep-state
01070 allow ip from any to any via vlan1
${fwcmd} nat 1 config log if vlan15 same_ports reset redirect_port tcp 192.168.0.2:3389 3389
${fwcmd} nat 2 config log if vlan30 same_ports reset redirect_port tcp 192.168.0.2:3389 3389
10170 nat 1 ip from any to any via vlan15
10171 skipto 10200 tag 1 ip from any to any in recv vlan15
10200 nat 2 ip from any to any via vlan30
10201 skipto 50000 tag 2 ip from any to any in recv vlan30
50000 allow ip from any to any
65535 deny ip from any to any
У меня vlan1 - внутренняя сеть, vlan15 - 1-й провайдер, vlan30 - 2-й провайдер.
Сейчас нет даже намека на policy base: отправляю пинг снаружи на 2й ип, ответ приходит от 1-го, дефолтового... Естественно tcp-соединения не устанавливаются.
setfib настроен, обе таблицы маршрутизации есть, пакеты от setfib 0 и 1 наружу идут правильно.
Что я не включил?

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение terminus » 2011-05-30 21:44:34

one_pass=0 ?

такой код:

Код: Выделить всё

01011 skipto 1040 ip from any to any out xmit vlan1 tagged 1
01012 skipto 1060 ip from any to any out xmit vlan1 tagged 2

01040 setfib 0 ip from any to any in recv vlan1 keep-state
01050 allow ip from any to any via vlan1

01060 setfib 1 ip from any to any in recv vlan1 keep-state
01070 allow ip from any to any via vlan1

${fwcmd} nat 1 config log if vlan15 same_ports reset deny_in redirect_port tcp 192.168.0.2:3389 3389
${fwcmd} nat 2 config log if vlan30 same_ports reset deny_in redirect_port tcp 192.168.0.2:3389 3389

10170 nat 1 ip from any to any via vlan15
10171 skipto 50000 tag 1 ip from any to any in recv vlan15

10200 nat 2 ip from any to any via vlan30
10201 skipto 50000 tag 2 ip from any to any in recv vlan30

50000 allow ip from any to any

65535 deny ip from any to any
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение terminus » 2011-05-30 22:09:53

Нашел у себя ошибку - там вместо "in recv vlan1 keep-state" надо было "via vlan1 keep-state"

Код: Выделить всё

01011 skipto 1040 ip from any to any out xmit vlan1 tagged 1
01012 skipto 1060 ip from any to any out xmit vlan1 tagged 2

01040 setfib 0 ip from any to any via vlan1 keep-state
01050 allow ip from any to any via vlan1

01060 setfib 1 ip from any to any via vlan1 keep-state
01070 allow ip from any to any via vlan1

${fwcmd} nat 1 config log if vlan15 same_ports reset deny_in redirect_port tcp 192.168.0.2:3389 3389
${fwcmd} nat 2 config log if vlan30 same_ports reset deny_in redirect_port tcp 192.168.0.2:3389 3389

10170 nat 1 ip from any to any via vlan15
10171 skipto 50000 tag 1 ip from any to any in recv vlan15

10200 nat 2 ip from any to any via vlan30
10201 skipto 50000 tag 2 ip from any to any in recv vlan30

50000 allow ip from any to any

65535 deny ip from any to any

Проверяем что должно быть:

- приходит соединение на 2й нат на vlan30
- трафик пробегает до "10200 nat 2 ip from any to any via vlan30"
- происходит деалиасинг, и так как выставлен one_pass=0 трафик вернется в фаервол
- вернувшись он перейдет на "10201 skipto 50000 tag 2 ip from any to any in recv vlan30"
- на пакет будет навешен тег 2, после чего пакет уйдет на 50000 и будет принят на проходе in

- перейдя в проход out, пакет добежит до "01012 skipto 1060 ip from any to any out xmit vlan1 tagged 2"
- сдесь он перепрыгнет на "01060 setfib 1 ip from any to any via vlan1 keep-state"
- пакет подпадет под условие и будет создана запись в динамических правилах которая ссылается на действие setfib 1
- уйдет на "01050 allow ip from any to any via vlan1" и бедет передан к терминальному серверу.

--

- ответ от RDS сервера дойдет до 01040 где на неявном check-state он будет обработан и перепрыгнет на 01060
- на 01060 к нему будет применено действие родительского правила "setfib 1" после чего он уйдет на 01070 выйдя из in

- перейдя в проход out пакет добежит до "10200 nat 2" после чего на 50000 уйдет в сеть

---

- ответ добежит на проходе in до 10200, потом до 10201 и на 50000

- на out добежит до 01012, потом 01060 и 01070.


Обмен должен происходить корректно... Проверьте пожалуйста. Если заработает я исправлю статью.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

iltmpz
ефрейтор
Сообщения: 58
Зарегистрирован: 2008-11-10 13:10:56

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение iltmpz » 2011-06-02 15:48:27

Что-то вообще не могу понять как это должно работать:
заменил "in recv" на "via", не получилось, потом тыкался, что-то делал, добавлял ipfw add count log и т.п, конфигурацию вроде не менял, потом после перерыва вдруг заработало - стали устанавливаться соединения и на тот, и на другой внешний ип. Перезагрузил - перестало работать, и теперь не могу понять, что это было...
Сейчас конфиг в точности как у Вас, только в nat config не писал deny_in и log.
И да, one_pass=0

Сейчас картина следующая:
редирект через основной ип работает, через 2-й - на внешнем интерфейсе в момент обращения через TCP 81 (вместо 3389 проверяю тестовый порт 81 с пробросом на локальный 80) ловится ICMP:8.0 192.168.1.3 2.2.2.2 in via vlan30, а TCP-обращение на 81-й порт снаружи вообще не поступает!
Что такое 192.168.1.3 - понятия не имею, такой подсети и тем более такого IP у меня вообще не существует. Также не понимаю, откуда взялся ICMP-запрос - я отправлял TCP. Есть идеи что это может быть?

suspender
сержант
Сообщения: 160
Зарегистрирован: 2007-11-19 10:47:09

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение suspender » 2011-06-06 21:43:33

Конструкция с tagged не работает даже в случае тупо сервисов на этой же тачке (то есть sshd openvpn и прочие nginx у меня отвечали через defaultrouter независимо от того на какой интерфейс пришёл запрос) Таг пропадает, как только пакет ушёл из ядра. Ответный пакет никаким тагом не помечен.
Из за этого прищлось переходить на pf (благослови господи конструкцию reply-to).

С пробросом портов хз можно ли так же красиво разрулить в pf, но вот комбинация reply-to и tcp-proxy по идее должна сработать.
А с ipfw нифига у вас не получится.
Где то видел статью с использованием natd вместо kernel nat - там пускали весь трафик через natd, и затем чекали в каком экземпляре ната есть такая динамическая запись - туда типа и отправим.

iltmpz
ефрейтор
Сообщения: 58
Зарегистрирован: 2008-11-10 13:10:56

Re: ipfw nat redirect_port + policy based

Непрочитанное сообщение iltmpz » 2011-06-16 15:59:22

suspender писал(а):Таг пропадает, как только пакет ушёл из ядра. Ответный пакет никаким тагом не помечен.
Из за этого прищлось переходить на pf (благослови господи конструкцию reply-to).
Аналогично: тэг пропадает, и мне так и не удалось понять, как его сохранить. А может я все-таки сам виноват и с правилами накосячил, но вроде перепроверил все 100 раз. Так что лимит времени на эксперименты закончился, и тоже пришлось вернуться на pf, благо на нем это все уже давно работало.
А переходить с pf на natd тоже не вариант: я-то надеялся производительность оптимизировать переходом на ipfw nat, а с natd какой смысл?..