nat on $ext_if from $vpn_lan to any -> $ext_ip
nat on $ext_if from $wifi_lan to any -> $ext_ip
nat on $ext_if from $vip_ip to any -> $ext_ip
nat on $ext_if from $dmz_lan to any -> $ext_ip
nat on $ext_if inet from $it to any -> ($ext_if:0)
## RDR 1C
rdr on $ext_if proto tcp from any to $ext_ip port $1c_ports -> $term_srv
## RDR MAIL
rdr on $ext_if proto tcp from any to $ext_ip port $mail_ports -> $mail
## ftp-proxy
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
pass in on $ext_if inet proto tcp to $ext_ip port 21 flags S/SA keep state
anchor "ftp-proxy/*"
##
##########################################
## 7. Правила фильтрации ##
##########################################
antispoof quick for { lo0, $int_if, $ext_if }
block all
block drop in quick on $ext_if from $private_nets to any
block drop out quick on $ext_if from any to $private_nets
block drop in log quick on $ext_if from $bad_ip to any
block drop out log quick on $ext_if from any to $bad_ip
block drop out log quick on $ext_if proto tcp from $trusted_lan to any port smtp
block drop log quick inet proto tcp from $vpn_lan to any port smtp
block drop log quick on $ext_if from ddos to any #Названия таблиц в скобках. Убрал, т.к. сайт не пропускает.
block drop log quick on $ext_if from spamers to any
block drop log quick on $ext_if from brutforce to any
## Натим внешний интерфейс
pass out on $ext_if from $ext_if to any keep state
## Выпускаем ВПН наружу
pass from $vpn_lan to any keep state
## OpenVPN
pass in quick on $ext_if inet proto {tcp} from any to self port 1194
## Собираем вредителей в таблицы. (Имена таблиц у меня в скобках. здесь с ними не пропускает)
pass in quick on $ext_if inet proto tcp from any to ($ext_if) port www flags S/SA keep state (max-src-conn-rate 5/2, overload ddos flush global)
pass in quick on $ext_if inet proto tcp from any to ($ext_if) port { pop3, pop3s } keep state (max-src-conn-rate 15/60, overload spamers flush global)
pass in quick on $ext_if inet proto tcp from any to ($ext_if) port 22 keep state (max-src-conn-rate 1/40, overload brutforce flush global)
## OpenVPN
pass in log on tun0 from any to any keep state
pass out log on tun0 from any to any keep state
## Открываем сервисы ##
pass in on $ext_if inet proto tcp from any to $ext_if port $tcp_services flags S/SA keep state
pass in on $ext_if inet proto tcp from any to $ext_if port $1c_ports flags S/SA keep state
pass in on $ext_if inet proto udp from any to ($ext_if) port 53 keep state
pass in on $ext_if inet proto tcp from any to ($ext_if) port 53 keep state
#Открываем сервисы 1С
pass out on $ext_if inet proto tcp from $it to $1c_kontur keep state
pass in on $ext_if proto tcp from any to $www port 80 keep state
pass in on $ext_ip proto tcp from any to $www port 80 keep state
pass in on $ext_if proto tcp from any to $mail port $mail_ports keep state
pass in on $ext_if proto tcp from any to $term_srv port $1c_ports keep state
pass log inet proto icmp all icmp-type $icmp_types
##### END CONFIG
Все перепробовал. Как только даю nat on $ext_if inet from $it to any -> ($ext_if:0) сразу получаю полный доступ в инет. Хотя вроде разрешения нет.
Что-то я такое смутно помню, что у pf обработка правил идёт в порядке их следования в конфиге. Поэтому сначала делается NAT, а потом уже применяются правила блокировки/разрешения. И поэтому правило
pass out on $ext_if from $ext_if to any keep state
разрешает всем и всё, так как после NAT'a все пакеты, которые через NAT прошли, будут под это правило подпадать.
не совсем так, но суть верна — следует учитывать, что этот этап обработки трафика (filter Out) будет происходить уже после NAT, соответственно, исходные IP-адреса пакетов могут быть изменены NAT'ом.