Обратный нат

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

Обратный нат

Непрочитанное сообщение kharkov_max » 2014-05-22 17:17:21

День добрый.

Хочу раскурить тему.
Есть локалка в локалке работает jabber сервер.
Собственно снаружи на него сделан проброс нужного порта, в локалке подключено по внутреннему IP.

Хочу в локалке переделать на внешний IP что бы подключение к примеру с ноута, что через интернет, что локально шло через внешее доменное имя.
Собственно внутри можно реализовать через DNS но это не выход.

Вот тут вопрос, как верно реализовать обратный NAT ?
Собственно нужно что бы пакет из локальной сети на внешний IP был завернут назад в локальную сеть на другой хост.

Погуглив наворачивается толко:
http://www.lissyara.su/articles/freebsd ... /ipfw_nat/
reverse

Параметр предписывает поменять внутренне представление для случаев обработки
входящего и исходящего трафика через проходы IN и OUT.

В случае установки этого параметра, трафик поступивший в механизм nat из
прохода IN будет считаться исходящим, т.е. требующим проведения маскировки,
а трафик поступивший из прохода OUT будет считаться входящим, т.е.
требующем демаскировки.

Такое поведение может быть необходимо в некоторых случаях построения схем
прозрачного проксирования, когда исходящий трафик необходимо перенаправлять
на локальную машину, а сам механизм nat запущен на внетреннем сетевом
интерфейсе (обычно nat запускают на внешнем сетевом интефейсе).
Но пока недопонимаю как оно будет работать...

Собственно у кого какие варианты решения данного вопроса, именно через фаервол.

Хостинговая компания 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/

Аватара пользователя
baton4eg
сержант
Сообщения: 274
Зарегистрирован: 2009-10-11 14:36:35
Контактная информация:

Re: Обратный нат

Непрочитанное сообщение baton4eg » 2014-05-26 1:05:25

pf binat ?
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих файлов вообще нет!" (c)
"Я ем руками, она вилкой и ножом, я бью вилкой и ножом, она руками" (с)

Аватара пользователя
skeletor
майор
Сообщения: 2507
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

Re: Обратный нат

Непрочитанное сообщение skeletor » 2014-05-26 14:26:36

На ipfw нельзя завернуть на не локальный (там где стоит ipfw) хост. Используй pf
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
kharkov_max
капитан
Сообщения: 1810
Зарегистрирован: 2008-10-03 14:56:40

Re: Обратный нат

Непрочитанное сообщение kharkov_max » 2014-05-27 19:49:12

baton4eg писал(а):pf binat ?
Как бы хочется на ipfw
skeletor писал(а):На ipfw нельзя завернуть на не локальный (там где стоит ipfw) хост. Используй pf
Не верю, как то можно....

Вообщем по бурной реакции видно ни кто не занимался данным вопросом.
Ок, буду гуглить, если найду решение отпишусь

Аватара пользователя
skeletor
майор
Сообщения: 2507
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

Re: Обратный нат

Непрочитанное сообщение skeletor » 2014-05-27 19:58:32

kharkov_max писал(а):
skeletor писал(а):На ipfw нельзя завернуть на не локальный (там где стоит ipfw) хост. Используй pf
Не верю, как то можно....
Нельзя! Хоть убейтесь. При выполнении правила ipfw add fwd будет ругань, если адрес не локальный. Можно использовать утилиты типа redir, но там есть свои нюансы.
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
kharkov_max
капитан
Сообщения: 1810
Зарегистрирован: 2008-10-03 14:56:40

Re: Обратный нат

Непрочитанное сообщение kharkov_max » 2014-05-27 20:15:00

Хорошо.

Можете на пальцах разъяснить опцию NAT reverse ?
Если можно то с реальным примером ...

Аватара пользователя
skeletor
майор
Сообщения: 2507
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

Re: Обратный нат

Непрочитанное сообщение skeletor » 2014-05-27 20:48:46

"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
kharkov_max
капитан
Сообщения: 1810
Зарегистрирован: 2008-10-03 14:56:40

Re: Обратный нат

Непрочитанное сообщение kharkov_max » 2014-05-27 20:53:34

Вы думаете я там не смотрел ?

Кроме описания параметра там более ни чего нет.
Не доходит до меня эта схема ...

Пример нужен жизненный...

Аватара пользователя
skeletor
майор
Сообщения: 2507
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

Re: Обратный нат

Непрочитанное сообщение skeletor » 2014-05-27 21:15:09

Был у меня похожий пример, реализовал через redir. Но учтите, он подменяет src addr на адрес хоста, где запущен.
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
kharkov_max
капитан
Сообщения: 1810
Зарегистрирован: 2008-10-03 14:56:40

Re: Обратный нат

Непрочитанное сообщение kharkov_max » 2014-06-30 9:40:50

Нарыл пример того чего я хочу.
Вот оригинал статейки http://birdofluck.livejournal.com/8778.html

Собственно вот человек рассказывает природу явления и его решение
Следующая задача, которая в общем-то была бы сферической в вакууме, если бы не суровая чугунная реальность:
Требуется обеспечить работоспособность этих редиректов внутри локальной сети.
Проблема тут в следующем:
Пусть есть адрес 172.16.1.42, который через 1.2.3.4:25 должен попадать на 172.16.1.2:25.
Шаг 1 (TCP SYN от .42 прилетает на шлюз)
172.16.1.42:33456 -> 1.2.3.4:25
Шаг 2 (транслируем через 10й инстанс в redirect_port на input)
172.16.1.42:33456 -> 172.16.1.2:25
Шаг 3 (пакет далее не транслируется и убегает в локальную сеть искать 172.16.1.2)
Шаг 4 (172.16.1.2 получает SYN-пакет, отвечает SYN+ACK на 172.16.1.42:33456.)
172.16.1.2:25 > 172.16.1.42:33456
Шаг 5 (172.16.1.42 отвечает RST, поскольку подобного соединения в TCP-стеке найти не может (src-адрес с т.з. 42 должен быть 1.2.3.4))

Таким образом, надо менять еще и адрес источника, то есть вводить еще один nat.
То есть: перед редиректом сначала меняем адрес источника, затем отдаем пакет в нат с редиректами. Ответные пакеты разворачиваем наоборот.
Из-за нюансов, описанных выше, для ната нам нужен будет еще 1 адрес, не висящий непосредственно на интерфейсе. Выбирать в общем-то можно любой приватный, не использующийся в сети (т.е. тот, трафик на который пойдет через наш маршрутизатор с натами). "Не висящий непосредственно на интерфейсе" нужно для корректной работы out-хука в ipfw nat (описано выше).
Реализуется оно например через blackhole маршрут (аналог типичного приема с ''ip route 1.2.3.0/24 null0'' в quagga, когда нужно натить много разных клиентов в пул публичных адресов). Примерно так:
route add 10.10.10.10 -blackhole -iface lo0
Рисуем, как оно должно выглядеть:
# В квадратных скобочках - в каком хуке ipfw мы получаем соответствующий пакет
# TCP SYN
[IN] 172.16.1.42:33456 -> 1.2.3.4:25
# ipfw nat в позе reverse (то есть, натим пакет в внешний адрес, out hook)
[IN] 10.10.10.10:54123 -> 1.2.3.4:25
# наш нат с пробросом портов (in hook)
[IN] 10.10.10.10:54123 -> 172.16.1.2:25
Ответ:
# TCP SYN+ACK
[IN] 172.16.1.2:25 -> 10.10.10.10:54123
# Отдаем пакет нату с пробросом (put hook)
[OUT] 1.2.3.4:25 -> 10.10.10.10:54123
# Отдаем пакет reverse nat'у (in hook)
[OUT] 1.2.3.4:25 -> 172.16.1.42:33456

Смотрим теперь как это выглядит в правилах:
ipfw nat 1 config ip ${isp1_addr} # ISP 1
ipfw nat 2 config ip 2.3.4.5 # ISP 2
ipfw nat 10 redirect_port tcp 172.16.1.2:25 ${isp1_addr}:25 redirect_port tcp 172.16.1.2:25 ${isp2_addr}:25
# skip_global позволяет избежать неприятных нюансов с nat global (global не проверяет этот инстанс), который вызывается раньше
ipfw nat 11 config ip 10.10.10.10 reverse skip_global
ipfw table 1 add 172.16.1.7 1 # Табличка с соответствиями префиксов внутри сети с номерами натов
ipfw table 1 add 172.16.1.0/24 2
...
ipfw skipto 5000 from any to any out # Делим для упрощения IN и OUT
# В данный нат нужно направлять только тот трафик, который относится к редиректам
# Можно сделать это например, так:
ipfw allow ip4 from ${localnet} to ${localnet} recv ${int_iface}
ipfw nat 11 ip4 from ${localnet} to me recv ${int_iface}
ipfw nat 10 ip4 from any to me recv ${isp1_iface}
ipfw nat 10 ip4 from any to me recv ${isp2_iface}
ipfw nat 1 ip4 from any to me recv ${isp1_iface}
ipfw nat 2 ip4 from any to me recv ${isp2_iface}
# Отправляем пакеты на наш виртуальный адрес порт редиректору
ipfw nat 10 ip4 from ${localnet} to 10.10.10.10 recv ${int_iface}
# Направляем их же дальше 2му нату
ipfw nat 11 ip4 from any to 10.10.10.10 recv ${int_iface}
... (5000)
# Направляем в нужный нат существующие трансляции. У оттранслированных пакетов меняется
# src-адрес и в правила дальше они не попадают
ipfw nat global ip4 from ${localnet} to not me
ipfw nat tablearg from ${localnet} to not me
# Направляем отттранслированные пакеты нужному провайдеру
ipfw fwd ${isp1_gw} ip4 from ${isp1_addr} to any
ipfw fwd ${isp2_gw} ip4 from ${isp2_addr} to any
Если у кого есть интерес к данному решению прошу присоеденится к вопросу ...

Собственно саму схему прохождения пакета не совсем понимаю.
Пример сразу на 2 внешних интерфейса, один можно выкинуть (у меня один).

Не совсем понятен смысл правил:
1.

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

ipfw nat 1 config ip ${isp1_addr} # ISP 1
ipfw nat 10 redirect_port tcp 172.16.1.2:25 ${isp1_addr}:25  redirect_port tcp 172.16.1.2:25 ${isp2_addr}:25 
Почему бы сразу не соеденить в одно

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

ipfw nat 1 config ip ${isp1_addr} redirect_port tcp 172.16.1.2:25 ${isp1_addr}:25  redirect_port tcp 172.16.1.2:25 ${isp2_addr}:25 
2. Не совсем понимаю смысл правила:

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

ipfw allow ip4 from ${localnet} to ${localnet} recv ${int_iface}
На внутреннем интерфейсе оно работать не будет, разве что на внешних .....
Так ?

Если у гуру есть желание распишите пожалуйста прохождение пакета по данной схеме, что то я пал в ступор и запутался ...