Описание интерфейсов:
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
Код: Выделить всё
Конфиг 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
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
На 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