Содержание

Packet Filter Firewall (PF) межсетевой экран FreeBSD

Packet Filter Firewall (PF) — это межсетевой экран, разрабатываемый в рамках проекта OpenBSD. Обладает высокой скоростью работы, удобством в конфигурировании и большими возможностями, включая поддержку IPv6. На данный момент используется, помимо OpenBSD, также в NetBSD и FreeBSD, а также основанных на этих трёх MirBSD, DesktopBSD, pfSense и других.

Маркирование пакетов (tagged) — это способ пометить пакет внутренним идентификатором для дальнейшего использования в качестве критерия в правилах трансляции и фильтрации. Маркирование позволяет создать «доверие» между интерфейсами, а так же помогает определить был ли пакет обработан правилами трансляции. Также становится возможным переход от фильтрации, основанной на правилах, к фильтрации, основанной на политиках.

Версии pf

Различные версии FreeBSD содержат разные версии pf. Таблица соответствий версий pf:

PF состоит из двух частей: собственно сетевого фильтра и утилиты pfctl, которая предоставляет интерфейс для управления межсетевым экраном. Фильтр полностью работает в контексте ядра операционной системы, взаимодействие с ним осуществляется через системный вызов ioctl. Поэтому pfctl, строго говоря, не является необходимой частью PF.

/etc/pf.os - описаны ОС, которые может распознать PF.

Синтаксис pf.conf. Очередность правил.

# man pf.conf

Файл pf.conf состоит из семи частей:

Трансляция осуществляется до фильтрации. Правила фильтра увидят уже оттранслированные пакеты.

  1. NAT.
  2. IP forward, проброс пакетов.

Преобразование ICMP пакетов происходит без модификации исходного порта.

За исключением макросов и таблиц, каждый раздел должен находиться в конфигурационном файле в порядке представленном выше, хотя и не все разделы обязаны присутствовать в файле.

Пустые строки игнорируются, а строки начинающиеся с # читаются, как комментарий.

{pass,block}{in,out}{quick} proto {tcp,udp,icmp,gre ...} 
from SRC_IP to DSP_IP port = PORT_NUM {keep stat, flags S/SA ...}
pass -разрешить
block - запретить
далее если нужно на вход или выход in/out
далее параметр quick - если присутсвует, то список 
правил далее не просматривается и пакет останавливается на данном правиле
proto - протокол
from - откуда, to - куда будет идти пакет, port = номер порта
Дополнительные опции: keep stat, флаги соединения и т.д.

Просмотр статистики лог - файлов PF

# tcpdump -nettti pflog0
# tcpdump -netttr /var/log/pflog
> tcpdump -netttr /var/log/pflog | awk '{print $8}' | grep -v tun0 | cut -d. -f1 -f2 -f3 -f4 | sort | uniq -c | sort -n
...
  58 79.126.82.217
  61 94.180.10.118
  74 195.26.95.226
  81 89.254.227.14
  86 62.133.191.44
 133 95.27.11.27
 198 94.180.54.247

Протокол Протокол pfsync - это протокол, используемый пакетным фильтром для управления и обновления таблиц состояния для stateful inspection и NAT преобразование сетевых адресов.

Запуск PF в ОС FreeBSD

Для активации PF во время загрузки в /etc/rc.conf должны быть включены следующие переменные:

pf_enable="YES"                 # Включить PF (загрузить модуль если необходимо)
pf_rules="/etc/pf.conf"         # определение правил для pf
pf_flags=""                     # дополнительные флаги для запуска pfctl
pflog_enable="YES"              # запустить pflogd(8)
pflog_logfile="/var/log/pflog"  # где pflogd должен сохранять протокол
pflog_flags=""                  # дополнительные флаги для запуска pflogd

Если за межсетевым экраном находится локальная сеть и необходимо передавать пакеты для компьютеров этой сети, или использовать NAT, включите также следующий параметр:

gateway_enable="YES"            # Включить сетевой шлюз

Основные команды pfctl

Полная команда Кратко Пояснение Примечание
# pfctl -e Включить фильтр
# pfctl -d Выключить фильтр
# pfctl -F all -f /etc/pf.confСбросить все правила (NAT, правила фильтрации, состояния соединений, таблицы и т.д.) и загрузить новые с файла /etc/pf.conf
># crontab -l
@daily /sbin/pfctl -F all -f /scripts/pf/pf.rules.current
# pfctl -f FILE_PATH Перечитать правила из файла FILE_PATH Все предыдущие параметры и таблицы сбросятся.
# pfctl -Rf FILE_PATH Перечитать правила только фильтра из файла FILE_PATH
# pfctl -Nf FILE_PATH Перечитать только NAT правила из файла FILE_PATH
# pfctl -t название таблицы -T add 204.92.77.111 Добавить в таблицу Работа с таблицами.
# pfctl -t название таблицы -T delete Удалить из таблицы Работа с таблицами.
# pfctl -t название таблицы -T show Вывести на экран содержимое таблицы (IP адреса) Работа с таблицами.
# pfctl -s info # pfctl -siСтатистика из pfctl
# pfctl -si | grep Status
# pfctl -s rules # pfctl -sr Просмотреть все правила
# pfctl -s rules -v # pfctl -sr -v Просмотреть все правила и счетчики обработки.Вместо того, чтобы гадать, о том, как же часто будет срабатывать правило, вы можете использовать счётчики обработки и срабатывания по правилам. Если вверху списка вы увидите правила, которые проверяются чаще других, но редко срабатывают, их можно переместить ниже по списку правил.
# pfctl -s nat # pfctl -sn Просмотреть все правила для NAT преобразование сетевых адресов
# pfctl -s state # pfctl -ss Просмотреть установившиеся сессии
# pfctl -s all # pfctl -sa Показать все что можно
# pfctl -sm Показать предельные значения
# echo "set loginterface fxp0" | pfctl -mf - 
# pfctl -x level , например # pfctl -xmВключить отладочный режим. Отладочные сообщения по умолчанию попадают на консоль,также syslogd записывает их в /var/log/messages.
# pfctl -x noneОтключить отладочный режим.

Наилучший способ проверить, насколько полезны оказались опции -o или -oo для вашего набора правил, это сравнить его с изменённым:

$ pfctl -nvf /etc/pf.conf >before
$ pfctl -oonvf /etc/pf.conf >after
$ diff -u before after

Примеры

Примеры: Защита портов от входящего трафика

Пример:

table <abusive_hosts> persist
block in quick from <abusive_hosts>

pass in on $ext_if proto tcp to $web_server \
    port www flags S/SA keep state \
    (max-src-conn 100, max-src-conn-rate 15/5, overload <abusive_hosts> flush)

Эти правила делают следующее:

Ссылки

Руководства:

Статьи: