Команды управления пакетным фильтром pf

pfctl -d	выключить пакетный фильтр
pfctl -e	включить пакетный фильтр

pfctl -f /etc/pf.conf	загрузить конфиг из /etc/pf.conf
pfctl -n -f /etc/pf.conf	проверить на ошибки /etc/pf.conf, но не загружать его
pfctl -R -f /etc/pf.conf	загрузить только правила фитрации из /etc/pf.conf
pfctl -N -f /etc/pf.conf	загрузить только правила NAT из /etc/pf.conf
pfctl -O -f /etc/pf.conf	загрузить только опции из /etc/pf.conf

pfctl -F all	сбросить всё
pfctl -F rules	сбросить только правила фильтрации
pfctl -F queue	сбросить только очереди
pfctl -F nat	сбросить правила NAT
pfctl -F info	сбросить всю статистику
pfctl -z clear	очистить все счётчики

pfctl -s rules	показать текущие правила фильтрации
pfctl -sn	посмотреть список загруженных правил
pfctl -v -s rules show	показать информацию по каждому правилу фильтрации
pfctl -vvsr	показать текущие правила фильтрации с добавлением номера правила
pfctl -v -s nat	показать текущие правила NAT отдельно по каждому правилу
pfctl -s nat -i xl1	показать правила NAT для интерфейса xl1
pfctl -s queue	показать очереди
pfctl -s state	показать текущее состояние таблиц
pfctl -s info	показать статистику правил и состояние счётчиков
pfctl -s all	показать все что можно
 
pfctl -t testtable -T show	просмотр содержимого таблицы testtable
pfctl -t testtable -T show -v	просмотр более подробной статистики по каждому адресу таблицы testtable
pfctl -t testtable -T add 192.168.1.1	добавление адреса 192.168.1.1 в таблицу testtable
pfctl -t testtable -T delete 192.168.1.1	удаление адреса 192.168.1.1 из таблицы testtable
pfctl -t testtable -T flush	очистить таблицу testtable

A SAMPLE FREEBSD / OPENBSD / NETBSD PF FIREWALL RULE ( /ETC/PF.CONF)
ПРИМЕР ПРАВИЛА МЕЖСЕТЕВОГО ЭКРАНА FREEBSD / OPENBSD / NETBSD PF (/ETC/PF.CONF)
Use the following to open port # 3306 on a BSD based systems:
Используйте следующее, чтобы открыть порт # 3306 в системах на основе BSD:

pass in on $ext_if proto tcp from any to any port 3306

OR allow only access from your web server located at 10.5.1.3:
ИЛИ разрешить доступ только с вашего веб-сервера, расположенного по адресу 10.5.1.3:

pass in on $ext_if proto tcp from 10.5.1.3 to any port 3306  flags S/SA synproxy state

Редирект на PF

осуществляется очень просто, допустим внутри сети у вас есть вебсервер на который надо пробросить весь трафик идущий на ip внешнего маршрутизатора (89.252.34.110, сетевай карта em0) на внутренний адрес (192.168.10.10), правило для pf будет таким:

rdr on em0 proto { tcp, udp } from any to 89.252.34.110 -> 192.168.10.10
nat on em0 proto { tcp, udp } from 192.168.10.10 to any -> 89.252.34.110

Для того что бы пробросить один порт, например 80 c ip 89.252.34.110 на 192.168.10.10 80 порт, конструкция будет такая:

rdr on em0 proto { tcp, udp } from any to 89.252.34.110 port 80 -> 192.168.10.10
nat on em0 proto { tcp, udp } from 192.168.10.10 to any -> 89.252.34.110

Или допустим нужно порт 8080 ip 89.252.34.110 пробросить на 192.168.10.10, 80 порт то прописать надо такие настройки:

rdr on em0 proto { tcp, udp } from any to 89.252.34.110 port 8080 -> 192.168.10.10 port 80
nat on em0 proto { tcp, udp } from 192.168.10.10 to any -> 89.252.34.110

Во всех предыдущих примерах использовалась строка:

nat on em0 proto { tcp, udp } from 192.168.10.10 to any -> 89.252.34.110

Это пример настройки ната отдельного ip. Для того что бы задействовать нат целой подсети достаточно прописать такие настройки:

nat on em0 from 192.168.10.0/24 to any -> 89.252.34.107

Мы занатим всю сеть 192.168.10.0/24 в адрес 89.252.34.107.

Перезапуск PF без потери соединений

pfctl -f /etc/pf.conf

https://www.cyberciti.biz/tips/how-do-i-enable-remote-access-to-mysql-database-server.html
https://romantelychko.com/blog/928
http://www.hilik.org.ua/%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%BF%D1%80%D0%BE%D0%B1%D1%80%D0%BE%D1%81-%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2-%D0%B8-nat-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-pf
https://forums.freebsd.org/threads/pf-start-restart-without-loosing-connections.59723/