Видел несколько похожих тем но так и не нашел решения.Дано - стоит машинка FreeBSD 9.0 + PF
2 сетевые карты, одна снаружи с белым IP, вторая внутри шлюзом у всех машин
sysctl ip.forwarding включен
gateway_enable="YES" стоит
проблема: работает NAT, работает форвард снаружи - не работает форвард изнутри на локальный порт машины
Конкретно - перехват порта 80 с заворачиванием на squid, но это в данном случае не важно т.к. не работает никакой перехват - например проброс на локальный адрес на порт 22 тоже не работает
По результатам tcpdump - пакеты на внутреннем интерфейсе видны, а на lo0 уже ничего нет
'pfctl -sa' правило редиректа показывает (fxp0 - внутренняя карточка) :
rdr pass on fxp0 inet proto tcp from 192.168.200.0/24 to any port = http -> 192.168.200.1 port 3127
[ Evaluations: 27 Packets: 21 Bytes: 1040 States: 4 ]
[ Inserted: uid 0 pid 82759 State Creations: 8 ]
пробую с машины 192.168.200.8, с нее разрешил вообще все (см ниже конфиг)
Конфиг PF:
ext_if="xl0"
int_if="fxp0"
internal_net=$int_if:network
tcp_services="{ 13671 }"
allowed_ports="{5190, 2041, 2042, 2043, 2044}"
web_ports="{80, 8080, 443}"
icmp_types="echoreq"
table <remote> {ИПшники}
table <priv> {ИПшники тех кто не все}
set block-policy drop
set loginterface $ext_if
set skip on ng
nat on $ext_if from $internal_net to any -> ($ext_if)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr pass on $ext_if proto tcp from <remote> to $ext_if port 81 -> 192.168.200.1 port 81
rdr pass on $ext_if proto tcp from <remote> to $ext_if port 443 -> 192.168.200.7
rdr pass on $int_if proto tcp to !($int_if) port ftp -> 127.0.0.1 port 8021
rdr pass on $int_if proto { tcp } from $internal_net to any port 80 -> 192.168.200.1 port 3127
pass quick log from 192.168.200.8 to any
antispoof quick for { lo $int_if }
anchor "ftp-proxy/*"
block in log on $ext_if
pass in quick on $int_if from any to any
pass out quick on $int_if from any to any
pass out quick on $ext_if from ($ext_if) to any
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services
pass in on $ext_if inet proto tcp from <remote> to 192.168.200.7 port 443 synproxy state
pass out quick on $ext_if proto udp from $internal_net to any port 123 keep state
pass out quick on $ext_if from <priv> to any
pass out on $ext_if proto {tcp, udp} from $internal_net to any port $allowed_ports
UPDATE:
а) при написании правила редиректа в виде
rdr pass on $int_if proto { tcp } from $internal_net to any port 87 -> 192.168.200.1 port 3127
Редирект при обращении на сам хост 192.168.200.1 на порт 87 работает нормально - идет коннект на висящий на машинке Сквид ('telnet 192.168.200.1 87' с машины внутри сети)
А вот например 'telnet ya.ru 87' виснет на connecting to ya.ru...
б) при написания редиректа на лупбэк:
rdr pass on $int_if proto { tcp } from $internal_net to any port 87 -> 127.0.0.1 port 3127
уже не работает ничего, ни на саму машину ни наружу
IP-адрес ya.ru резолвится нормально, проверил
машина имеет полные права ходить везде (pass quick log from 192.168.200.8 to any - в правилах)