Страница 1 из 1

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

Добавлено: 2013-02-20 14:13:31
Exaile
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 ?

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

Добавлено: 2013-02-20 15:14:12
vadim64
pf критичен?
ipfw можно попробывать

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

Добавлено: 2013-02-20 15:30:16
Exaile
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 коннект на внешний адрес из локалки.