Jump to content
Калькуляторы

pf nat loopback (tcp connect с локального адреса на внешний)

Уже много раз где обсуждалось, но всё же проблему решить не могу.

 

uname -a
FreeBSD gw1 9.1-RELEASE FreeBSD 9.1-RELEASE #7: Tue Mar 19 20:08:57 MSK 2013    root@gw1:/usr/obj/usr/src/sys/GWKERNEL  amd64

 

igb0 - во внешку с реальниками для nat (подняты alias ip's) x.x.x.x/22

igb1 - внутренний интерфейс 192.168.253.252/24 (локалка)

vlans_igb1="123" - один из сегментов

ifconfig_igb1_123="inet 192.168.123.252/24" - шлюз который прописывает у себя пользователь на компьютере.

pf:

ext_if = "igb0"
int_if = "igb1"

# NAT & RDR
no nat inet from any to <no_nat> (в таблице no_nat наши локальные сети)

nat pass on $ext_if inet from 192.168.123.213 to any -> x.x.x.x
rdr pass on $ext_if inet from any to x.x.x.x -> 192.168.123.213

 

Фильтрации для x.x.x.x не используется т.к. это белые ипы клиентов которые выходят во внешку за nat.

 

Я нахожусь в этой же сети (192.168.123.0/24) прописываю у себя 192.168.123.213/24 и шлюз 192.168.123.252. Меня пускает во внешку под x.x.x.x - всё отлично всё работает, если я открываю какие то сервисы во вне - редирект так же работает. С внешки порты открыты которые нужны.

 

При заходе с локалки на x.x.x.x (не важно по IP или доменному имени если это сайт) tcp коннекта нету. А заходить так уже очень нужно было бы.

 

В iptables такое работает с помощью двух правил:

 

-A PREROUTING -d x.x.x.x/32 -j DNAT --to-destination 192.168.123.213
-A POSTROUTING -s 192.168.123.213/32 -j SNAT --to-source x.x.x.x 

 

 

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

 

Я читал faq pf redirect, но простветления не приходит :) единственное что получалось сделать это доп. правило нат на внутреннем интерфейсе т.е. в итоге я заходил из локалки на x.x.x.x, например на 80 порт, НО под ip шлюза т.е. 192.168.123.252. Это так же не устраивает, хотелось бы идти под своим локальным. Кто что подскажет как реализовать данное требование? Так же еще скомпилен ipfw + dummynet для шейпинга.

Edited by hsvt

Share this post


Link to post
Share on other sites
единственное что получалось сделать это доп. правило нат на внутреннем интерфейсе т.е. в итоге я заходил из локалки на x.x.x.x, например на 80 порт, НО под ip шлюза т.е. 192.168.123.252. Это так же не устраивает, хотелось бы идти под своим локальным. Кто что подскажет как реализовать данное требование?

Взаимо исключающие хотелки.

Воспользуйтесь tcpdump чтобы осознать.

 

Когда вы с локалки идёте на хххх, пф честно пересылает ваш пакет с локальным ип на 123.213, но 123.213 будет отвечать ВАМ(!) потому что там обратный адрес ВАШ(!), а ваш хост ждёт ответа от адреса хххх, соответственно пакет с ответом от 123.213 будет отброшен как не прошенный.

Вам именно нужно делать двойной нат (срц и дст) на роутере и видеть вы будете на 123.213 ип сервера.

Есть ещё варианты с icmp редиректами, вроде, но я такое не проверял и не могу ничего сказать.

Ещё, в теории, можно арпами анонсить хххх в локалку = прописать на 123.213 адрес хххх, в теории тоже может сработать.

 

И в линухе у вас тоже двойной нат и 123.213 видит ип сервера.

Share this post


Link to post
Share on other sites

Проверил как работает в линухе, только что еще раз стенд собрал: два компа, на первом прописан адрес 192.168.123.214/24 gw 192.168.123.253, на втором 192.168.123.215/24 gw 192.168.123.253. В iptables оба ipa сначены как писал выше, на белые ипы реальники.

 

На 192.168.123.215 я поднимаю 80 порт и захожу с 192.168.123.214 на x.x.x.x (белый ип ip 123.215 на который натиться) и в логах веб сервера мне показывает мой внешний ип белый, реальник соотвественно на который сначен 123.215. (да это не локальный ip, но хотя бы внешний и видно кто это, т.е. это не общий ip сервера) И так работает уже у нас давно, а вот на фряхе что-то не получается такого добиться.

 

Трацерт с 123.215 на x.x.x.x(123.214):

 

1. x.x.x.x

2. x.x.x.x

 

Два раза реальник один и тот же, алияс на линухе повешен так:

(т.е. этот ип сервера я и вижу)

 

ip a | grep x.x.x.x
   inet x.x.x.x/24 brd x.x.x.x.255 scope global secondary vlan600

 

Я понимаю может быть на линухе сделано не правильно и криво, но всё же для клиентов оно работает как надо т.е. они могут стучаться в локалке друг к другу по внешним адресам и использовать web, 1c, rdp, etc.

Edited by hsvt

Share this post


Link to post
Share on other sites

Господа, вы же технические специалисты, прикладывайте понятную графическую схему.

Share this post


Link to post
Share on other sites

Господа, вы же технические специалисты, прикладывайте понятную графическую схему.

 

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

 

Вам именно нужно делать двойной нат (срц и дст) на роутере и видеть вы будете на 123.213 ип сервера.

 

Подскажите тогда пожалуйста правила?

 

Пробовал вот так:

 

nat pass on $ext_if inet from 192.168.123.213 to any -> x.x.x.x
rdr pass on $ext_if inet from any to x.x.x.x -> 192.168.123.213

nat pass on igb1.123 inet from igb1.123:network to 192.168.123.213 -> igb1.123
no nat on igb1.123 proto tcp from igb1.123 to igb1.123:network
rdr pass on igb1.123 inet from igb1.123:network to x.x.x.x -> 192.168.123.213

 

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

 

no nat inet from any to <no_nat>

 

В таблице no_nat собраны наши локальные сети.

 

Про анонсы арпов это смотреть в сторону proxy arp вы имеете в виду ? Или вы про статические arp записи.

 

Так же я поднял bind и прописал локальную днс зону.

 

ftp     IN      A       192.168.123.213
mail    IN      A       192.168.123.213
ns1     IN      A       192.168.123.213
ns2     IN      A       192.168.123.213
pop     IN      A       192.168.123.213
smtp    IN      A       192.168.123.213
www     IN      A       192.168.123.213

 

Тогда все конекты работают и резолвится домен на локальный адрес, но работает только по доменному имени. Опять же если мне надо постучаться напрямую на реальник на конкретный порт приложения - этого не произойдёт. Где найти тут золотую середину и как лучше сделать?

Edited by hsvt

Share this post


Link to post
Share on other sites

Я вам уже писал как пакеты ходят и почему не работает.

Не может оно просто работать, тк пакеты в итоге ходят с разными адресами и разными путями.

Есть ещё вариант перетащить сервер в другую подсеть, тогда пакеты через фрю будут роутится для локальных клиентов. Поднятие алиаса на сервере 123.213 не поможет.

 

Почему в линуксе работает и как - изучите сами и нам расскажите.

 

http://www.netlab.linkpc.net/forum/index.php?topic=645.0

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this