Table of Contents
PF: Анкеры (крепления)
Дополнительно к основному набору правил,
PF может считывать поднаборы правил.
Такие поднаборы называются анкерами.
Анкеры могут содержать правила и подключать (содержать)
другие анкеры.
(в документации не указывается максимальное количество анкеров и количество вложений анкеров?)
Анкеры могут крепиться с помощью символа (/),
как в файловой системе.
Основной набор правил можно считать начальным анкером.
Анкеры можно разделить на родительские, дочерние и родственные.
Примечание: Анкеры могут пригодиться для создания динамических правил в анкерах, которые можно менять на лету с помощью скриптов или просто чтобы не загромождать основной набор правил.
Анкеры могут подключаться к различным секциям конфигурации:
1) filter (правила фильтрации) - anchor
2) nat - binat-anchor
3) rdr - rdr-anchor
4) binat - binat-anchor
В конфигурации, где крепятся анкеры, такие места называются точками подключения.
Определять макросы для анкера нужно отдельно от основного набора.
Анкеры указываются в конфиге с помощью слова anchor.
Например,
anchor spam
Заполнять анкеры можно:
1) в конфигурации с помощью load anchor
anchor spam load anchor spam from "/etc/pf-spam.conf"
2) с помощью pfctl
echo "block in quick from 1.2.3.4 to any" | pfctl -a spam -f -
в этом случае
анкер создан, но еще не подключен к конфигурации,
если вы не указали это в конфигурации
Можно считывать анкеры с условиями,
например:
block on $ext_if all anchor spam proto tcp from any to any port smtp pass out on $ext_if all pass in on $ext_if proto tcp from any to $ext_if port smtp
echo "block in quick from 1.2.3.4 to any" | pfctl -a spam -f -
Анкеры могут заканчиваться на звездочку (*)
Например,
anchor "spam/*"
Это означает считать все анкеры напрямую подключенных к spam, в алфавитном
порядке (считываются анкеры подключенные напрямую, чтобы избежать рекурсии).
Как и в файловой системе,
путь к анкеру может указывать на родительский и родственный анкер
Например:
echo ' anchor "spam/allowed" ' | pfctl -f - echo -e ' anchor "../banned" \n pass' | pfctl -a spam/allowed -f -
Расчет основного набора правил будет начинаться в анкере spam/allowed,
который считает правила из анкера spam/banned,
перед окончательным расчетом правила pass.
(В документации не указано есть ли механизм от закольцовывания?)
Правила фильтрации анкеров (anchor)
могут также быть загружены
внутри набора правил
с помощью фигурных скобок ('{' '}').
Фигурные скобки определяют секции, которые
могут содержать правила или другие секции.
Когда анкеры загружаются таким способом (внутри фигурных скобок)
имя анкера становится необязательным (опциальным, на ваш выбор).
anchor "external" on $ext_if {
#блокировать пакеты
block
#анкер без имени, загружен внутри набора правил в анкере "external"
anchor out {
pass proto tcp from any to port { 25, 80, 443 }
}
#пропустить пакеты
pass in proto tcp to any port 22
}
Так как по спецификации парсера
имя анкера это строковое значение,
любое обращение к имени анкера
содержащее знак (/)
требует двойных кавычек (") вокруг имени анкера.
Управление анкерами
Посмотреть существующие анкеры добавляемые к основному набору правил
pfctl -s Anchors pfctl -sA
Посмотреть рекурсивно (также вложенные анкеры)
pfctl -s Anchors -v pfctl -sA -v
Посмотреть правила в анкере ssh
pfctl -a ssh -s rules
Очистить правила в анкере ssh
pfctl -a ssh -F rules
Посмотреть полный список правил в основной конфигурации
pfctl -nvf /etc/pf.conf
Если вы поменяли конфигурацию, допустим убрали анкер из конфигурации,
то из памяти он может не удалиться, хотя не будет задействован через конфиг
и очистка всех правил,
например pfctl -f /etc/pf.conf -F all
тоже может не помочь.
В этом случае (на ваш страх и риск, это просто пример),
если это необходимо, вам поможет перезагрузка системы.
Перезагрузить систему можно с помощью команды init 6 или reboot
Информация
Информация взята из:
uname -a
FreeBSD ... 13.2-RELEASE-p2
man pf.conf man pfctl