PF на FreeBSD

От разработчика: Вариант 1 Вариант 2

Правила в pf:

1. Макросы: Определенные пользователем переменные
2. Таблицы
3. Опции управления
4. Скраб: Пересборка пакетов для их нормализации и дефрагментации
5. Очереди: Управление пропускной способностью и приоритетами (ALTQ)
6. Преобразования: (NAT, проброс портов)
7. Правила фильтрации

Как действуют правила фильтрации:

Применится последнее правильно, которое подошло по заданным критериеям. Параметр quick завершает проверку правил, если текущее правило верно. Если в начале разместить pass all то, в случае если ниодно нижестоящее правило не подошло – пакет будет разрешен.

rc.conf

pf_enable="NO"
pf_rules="/etc/pf/pf.conf"
pf_program="/sbin/pfctl"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pf.log"
pflog_program="/sbin/pflogd"
pflog_flags=""
pfsync_enable="NO"
pfsync_syncdev=""
pfsync_ifconfig=""

Правила

Общий вид:
action [direction] [log] [quick] [on interface] [af] [proto protocol] [from src_addr [port src_port]] [to dst_addr [port dst_port]] [flags tcp_flags] [state]

Конфиг

#--------------
# FILE pf.conf
#--------------

#------------
# 1. Marcos
#------------
ext_if="em0"

#------------
# 2. Tables
#------------
# Таблица c IP-адресами заблокированным на подключение к 25-порту
table  persist file "/etc/pf/ip_blocksmtp"

#------------
# 3. Options
#------------
set skip on lo0
set block-policy return

#------------
# 4. Scrub
#------------
scrub in all

#------------
# 5. Queue ALTQ
#------------

#------------
# 6. NAT, port map
#------------

#------------
# 7. Filter
#------------
pass all
pass on lo0
block drop in quick log on $ext_if from 

#---------------
# END of pf.conf
#---------------

Команды

# Включить
pfctl -e

# Выключить
pfctl -d

# Посмотреть что есть
pfctl -sr

# Проверить правила без применения
pfctl -nf /etc/pf/pf.conf

# Применить правила 
pfctl -f /etc/pf/pf.conf

# Просмотр содержимого таблицы
pfctl -t tablebname -T show

# Добавление адреса в таблицу
pfctl -t tablebname -T add 192.168.1.1 

# Удаление адресов из таблицы
pfctl -t tablename -T delete 192.168.1.1