Если внимательно прочитать документацию на PF хотя бы один раз - то сразу будет формироваться правильный список правил и их порядок.Пример:
############# 1) Макросы и списки ##############
if_ext_local="ng0"
if_ext_unlim="ng1"
if_inet="xl1"
if_lan="xl0"
############# 2) Таблицы (tables) #######################
############# 3) Опции PF (pf options) ##################
############# 4) Scrub (нормализация) ###################
scrub in all fragment reassemble min-ttl 15 max-mss 1400
scrub in all no-df
scrub all reassemble tcp
############# 5) Очереди (queries) ######################
############# 6) Трансляция адресов (NAT) ###############
nat on $if_ext_local inet from 192.168.0.0/24 -> ($if_ext_local)
nat on $if_ext_unlim inet from 192.168.0.0/24 -> ($if_ext_unlim)
############# 7) Правила фильтрации (filtering rules) ###
#######Блокирующие правила#######
### Блокировать любые пакеты (правило по умолчанию) ###
block drop log all
### Блокировать любые пакеты без обратного адреса ###
block in from no-route to any
block in from urpf-failed to any
#######Разрешающие правила#######
### Разрешить любые пакеты по loopback-интерфейсу ###
pass quick on lo0 all
### Разрешим любые пакеты по внутреннему интерфейсу ###
pass quick on $if_lan all
### Правила для VPN-клиента
pass out on $if_inet proto tcp from $if_inet to {10.8.0.1} port 1723
pass on $if_inet proto gre all
### Доступ к портам сервера с локалки Уфанет ###
pass in on $if_ext_local proto tcp from any to any port 873 modulate state
pass in on $if_ext_local proto tcp from any to any port 80 modulate state
pass in on $if_ext_local proto tcp from any to any port {21 20000><21000} modulate state
### Разрешить Ping на внешних интерфейсах###
pass on {$if_ext_local $if_ext_unlim} inet proto icmp all icmp-type 8 code 0
### Разрешаем любые пакеты от VPN-интерфейсов ###
pass out on $if_ext_local from ($if_ext_local) to any keep state
pass out on $if_ext_unlim from ($if_ext_unlim) to any keep state