Двухсторонний нат

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Exaile
рядовой
Сообщения: 26
Зарегистрирован: 2013-02-08 14:38:50

Двухсторонний нат

Непрочитанное сообщение Exaile » 2013-02-20 14:13:31

FreeBSD 9.1-RELEASE FreeBSD 9.1-RELEASE #3: Tue Jan 29 15:30:40 MSK 2013 :/usr/obj/usr/src/sys/KERNEL amd64

Описание интерфейсов:

igb0 - висит внешний x.x.x.x/22 + два алиаса y.y.y.y/24 к нему из этой же подсети под которыми должны выходить в инет пользователи. (реал ипы)

igb1 - внутренний интерфейс 192.168.253.252/24 (локалка)
vlans_igb1="123"
ifconfig_igb1_123="inet 192.168.123.252/24" - шлюз который прописывает у себя пользователь на сетевой карточке. (влан для сегмента на котором тестируем)

Маршруты на сервере:

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

netstat -rn
Routing tables

Internet:
Destination Gateway Flags Refs Use Netif Expire
default y.y.y.y UGS 0 3860184 igb0
192.0.0.0/8 192.168.253.254 UGS 0 144747 igb1
192.168.253.0/24 link#2 U 0 425 igb1
192.168.253.252 link#2 UHS 0 0 lo0
192.168.123.0/24 link#13 U 1 585043 igb1.1
192.168.123.252 link#13 UHS 0 0 lo0
y.y.y.0/22 link#1 U 0 0 igb0
y.y.y.y link#1 UHS 0 0 lo0
y.y.y.0/24 link#1 U 0 16811 igb0 =>
y.y.y.0/22 link#1 U 0 1737 igb0
y.y.y.y link#1 UHS 0 0 lo0
x.x.x.x link#1 UHS 0 3 lo0
x.x.x.x link#1 UHS 0 3 lo0
127.0.0.1 link#12 UH 0 16 lo0
Прописан дефолтный маршрут для внешки в сторону маршрутизатора провайдера + статик маршрут для igb1 который заворачивает -net 192.0.0.0/8 192.168.253.254 - где последний шлюз для локальной сети.

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

Конфиг pf:

# MACROS
ext_if="igb0"
int_if="igb1"
ext_ip="y.y.y.y"

# TABLES

# OPTIONS
set skip on { lo0 }

### SCRUB (Traffic normalization)
### NORMALIZATIONS (first matching rule wins!) ###
#scrub on $ext_if fragment reassemble random-id
#scrub on $ext_if all random-id no-df min-ttl 128 fragment reassemble reassemble tcp

# ALTQ & QUEUE
#altq on $ext_if cbq bandwidth 100Mb queue { normal }

# NAT & RDR
no nat on $ext_if from any to 192.0.0.0/8
no nat on $ext_if from any to y.y.y.0/22
no nat on $ext_if from any to y.y.y.0/22

nat on $ext_if inet from 192.168.123.214 to any -> y.y.y.y (общий нат, редирект не нужен)
nat on $ext_if inet from 192.168.123.215 to any -> y.y.y.y (общий нат, редирект не нужен)

nat on $ext_if inet from 192.168.123.27 to any -> x.x.x.x - выделенный нат, нужен проброс всех портов
nat on $ext_if inet from 192.168.123.213 to any -> x.x.x.x - выделенный нат, нужен проброс всех портов

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

# FILTERING
#antispoof quick for { lo0 $int_if } inet
#block in quick from any os NMAP
#block in on { $ext_if $int_if } from any to 240.0.0.0/4
#block in quick on $ext_if inet from any to 255.255.255.255
#block in quick on { $ext_if $int_if } proto { tcp, udp } from any to any port { 139 135 137 138 1900 445 2869 81 }
pass out
pass in
y.y.y.y - основной ип для общего ната
x.x.x.x - белые ип адреса для пользовательского ната

Трассировки:

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

C:\Users\user1>tracert -d x.x.x.x

Трассировка маршрута к 77.232.152.85 с максимальным числом прыжков 30

  1     1 ms    <1 мс    <1 мс  192.168.123.252
  2    <1 мс    <1 мс    <1 мс  x.x.x.x

Трассировка завершена.

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

C:\Users\user1>tracert -d 192.168.123.27

Трассировка маршрута к 192.168.123.27 с максимальным числом прыжков 30

1 <1 мс <1 мс <1 мс 192.168.123.27
Трассировка завершена.

Проблема: не могу попасть с локалки на внешний ип x.x.x.x т.е. установить tcp/udp коннект (любые сервисы которые открываю там) когда у себя ставлю ип 192.168.123.213 или 192.168.123.27. (если пробовать зайти на 192.168. всё открывает, например, 80 порт)

На компе с которого тестируем указан один дефолтный маршрут на 192.168.123.252 (шлюз и влан на igb1)

С сервера такие же трассировки сразу напрямую уходят. Из внешки проверяю например тут http://www.networkcenter.info/tests/portcheck открываю любой сервис на внешнем реальнике x.x.x.x - всё доступно и открыто.

Когда делали binat то получалось что пользователи идут на x.x.x.x/22 хосты с y.y.y.y/32 ипов а должны идти с 192.168. поэтому переделали через просто nat + rdr.

Вывод pfctl -ss

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

all tcp x.x.x.x:80 <- 192.168.123.27 :28377 TIME_WAIT:TIME_WAIT

all tcp 192.168.123.27:80 (x.x.x.x:80) <- 192.168.123.27:14390 CLOSED:SYN_SENT
all tcp 192.168.123.27:14390 -> 192.168.123.27:80 SYN_SENT:CLOSED
all tcp 192.168.123.27:80 (x.x.x.x:80) <- 192.168.123.27:14391 CLOSED:SYN_SENT
all tcp 192.168.123.27:14391 -> 192.168.123.27:80 SYN_SENT:CLOSED

C:\Users\user1>netstat -anob | find "0.0.0.0:80"
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 9580
Порт на лок. компе открыт, фаер отключен. По 192.168.123.27:80 захожу всё работает. По x.x.x.x:80 ни в какую... Из внешки на x.x.x.x:80 работает.

На Linux сейчас это работает с помощью двух строчек и из локалки tcp/udp коннект на x.x.x.x/32 срабатывает...

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

-A PREROUTING -d x.x.x.x/32 -j DNAT --to-destination 192.168.123.27
-A POSTROUTING -s 192.168.123.27/32 -j SNAT --to-source x.x.x.x 
Надеюсь описал полностью всю картину, как сделать такой же аналог команд выше на FreeBSD ?
Последний раз редактировалось f_andrey 2013-02-20 15:11:31, всего редактировалось 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/

Аватара пользователя
vadim64
майор
Сообщения: 2101
Зарегистрирован: 2009-09-17 15:15:26
Откуда: Засратовец

Re: Двухсторонний нат

Непрочитанное сообщение vadim64 » 2013-02-20 15:14:12

pf критичен?
ipfw можно попробывать
Люди не делятся на национальности, партии, фракции и религии. Люди делятся на умных и дураков, а вот дураки делятся на национальности, партии, фракции и религии.

Exaile
рядовой
Сообщения: 26
Зарегистрирован: 2013-02-08 14:38:50

Re: Двухсторонний нат

Непрочитанное сообщение Exaile » 2013-02-20 15:30:16

pf не критичен, изначально пробовал сделать именно через ipfw:

#ipfw nat 222 config reset same_ports unreg_only redirect_addr 192.168.123.27 x.x.x.x
#$cmd 1 nat 222 ip from any to x.x.x.x via igb0
#$cmd 2 nat 222 ip from 192.168.123.27 to any via igb0

Но там так же НЕ срабатывал tcp коннект на внешний адрес из локалки.