User Tools

Site Tools


freebsd_pf_anchors

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
freebsd_pf_anchors.txt · Last modified: 2023/10/19 17:57 by admin