Позвольте попросить немного помощи, ибо сроки горят, а от обилия инфы башка уже не может вычленить правильный ответ.
Есть некая локальная сеть, работает отличненько, дефолтным шлюзом крутится чертик с ipfw+natd. В сетку с недавнего времени внедрили сервер с некоторыми сервисами и mpd на борту. Соответственно выделили ему IP покрасивше и запустили, полет нормальный. Но вот на этом сервере ваш покорный слуга решил испробовать давно подмеченную вкусность в виде PF. Вроде разобрался, подучиваю синтаксис и т.д. и т.п. Но встала передо мной задача доселе не пробованная мною.
Для суммирования некоторых сервисов одним IP (ибо сервер запущен под факультативный бизнес компании) и немного отделить котлеты от мух необходимо пробросить к внутреннему серверу определенный порт. Задача вроде бы на 5 минут с перекуром, но проблема в том, что целевой сервер, на который пробрасываются порты имеет основным шлюзом отличный от сервера, который ему пробрасывает порт. Зеленое - маршрут по умолчанию. Синее - маршрут проброса.
На данный момент порт пробрасывается, но на конечном сервере соединение на порт идет от внешнего IP коннектящегося. Как бы я не крутился с NATом, ну никак... Мозжечком понимаю что надо сделать так, чтобы сервак натил внешний IP во внутренний, но чет никак не получается =/
Листинг PF прилагается
Код: Выделить всё
SRV-BSD# cat /usr/local/etc/pf.conf
int_if="igb0"
ext_if="igb1"
vpn_ports="1701"
icmp_types="{echoreq, unreach}"
trusted_lan="192.168.0.0/24"
untrusted_lan="192.168.10.0/24"
localnet="127.0.0.0/8"
terminal_srv="192.168.0.253/32"
srv="192.168.0.111"
################ Set RETURN instead of DROP
set block-policy return
################ Allow lo0 and local network
set skip on lo0
set skip on $int_if
################ Normalize all incoming packets on all
scrub in all
scrub out all
nat on $ext_if from $trusted_lan to any -> $ext_if
nat on $ext_if from $untrusted_lan to any -> $int_if
nat on $int_if from $ext_if port 22221 to $srv port 2221 -> 192.168.0.252
rdr on $ext_if inet proto tcp to $ext_if port 22221 -> $srv port 2221
antispoof quick for $ext_if
pass in all
pass out all
Код: Выделить всё
TRANSLATION RULES:
nat on igb1 inet from 192.168.0.0/24 to any -> XX.XXX.XXX.XX
nat on igb1 inet from 192.168.10.0/24 to any -> { 192.168.0.2, 192.168.0.252, 192.168.10.2 } round-robin
nat on igb0 inet from XX.XXX.XXX.XX port = 22221 to 192.168.0.111 port = 2221 -> 192.168.0.252
rdr on igb1 inet proto tcp from any to XX.XXX.XXX.XX port = 22221 -> 192.168.0.111 port 2221
FILTER RULES:
scrub in all fragment reassemble
scrub out all fragment reassemble
block drop in quick on ! igb1 inet from XX.XXX.XXX.0/24 to any
block drop in quick inet from XX.XXX.XXX.XX to any
pass in all flags S/SA keep state
pass out all flags S/SA keep state
No queue in use
STATES:
all udp 224.0.0.1:626 <- 85.114.26.254:626 NO_TRAFFIC:SINGLE
INFO:
Status: Enabled for 12 days 01:12:07 Debug: Urgent
State Table Total Rate
current entries 1
searches 434875 0.4/s
inserts 26246 0.0/s
removals 26245 0.0/s
Counters
match 26966 0.0/s
bad-offset 0 0.0/s
fragment 0 0.0/s
short 0 0.0/s
normalize 0 0.0/s
memory 0 0.0/s
bad-timestamp 0 0.0/s
congestion 0 0.0/s
ip-option 2 0.0/s
proto-cksum 49 0.0/s
state-mismatch 28 0.0/s
state-insert 0 0.0/s
state-limit 0 0.0/s
src-limit 0 0.0/s
synproxy 0 0.0/s
TIMEOUTS:
tcp.first 120s
tcp.opening 30s
tcp.established 86400s
tcp.closing 900s
tcp.finwait 45s
tcp.closed 90s
tcp.tsdiff 30s
udp.first 60s
udp.single 30s
udp.multiple 60s
icmp.first 20s
icmp.error 10s
other.first 60s
other.single 30s
other.multiple 60s
frag 30s
interval 10s
adaptive.start 6000 states
adaptive.end 12000 states
src.track 0s
LIMITS:
states hard limit 10000
src-nodes hard limit 10000
frags hard limit 5000
tables hard limit 1000
table-entries hard limit 100000
OS FINGERPRINTS:
696 fingerprints loaded
SRV-BSD#