Настройка Packet Filter (PF)


Пакетный фильтр PF ( OpenBSD Packet Filter )

PF - OpenBSD Packet Filter - базовый firewall в OpenBSD. Начиная с версии 5.3 включен в базовую конфигурацию FreeBSD в качестве отдельного загружаемого модуля.

Существуют два варианта запуска:
- пересборка ядра
- инициализация через rc.conf

Замечание: в любом случае предполагается, что в конфигурации ядра системы содержаться строки:
options INET
device bpf
I. Пересборка ядра

Включение PF путем компиляции с ядром FreeBSD не является обязательным требованием. При компиляции PF с ядром загружаемый модуль не используется. Для инициализации PF необходимо добавить в файл конфигурации ядра следующие строки:
device pf # включает поддержку межсетевого экрана ''Packet Filter''
device pflog # включает необязательное сетевое псевдоустройство pflog(4),
# которое может использоваться для протоколирования трафика
device pfsync # включает необязательное сетевое псевдоустройство pfsync(4),
# используемое для отслеживания ''изменений состояния''

Замечание: pfsync не входит в загружаемый модуль, и для его использования необходимо собрать новое ядро.
II. Инициализация через pf.conf

Для активации 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" # Включить сетевой шлюз
III. Управление

После инициализации PF тем или иным способом им можно управлять используя следующие команды:
pfctl -e # включить PF
pfctl -f <имя_файла> # загрузить правила из конфигурационного файла
# <имя_файла> (обычно /etc/pf.conf)
pfctl -nf <имя_файла> # анализировать конфигурационный файл <имя_файла>, но не
# загружать
pfctl -Nf <имя_файла> # загрузить только правила NAT из файла
pfctl -Rf <имя_файла> # загрузить только правила фильтрации
pfctl -sn # показать текущие правила NAT
pfctl -sr # показать текущие правила фильтрации
pfctl -ss # показать текущее состояние таблиц
pfctl -si # показать статистику правил и состояние счетчиков
pfctl -sa # показать все
IV. Конфигурационный файл

Конфигурационный файл (/etc/pf.conf) состоит из следующих частей:
Макросы: Определяемые пользователем переменные, которые могут
содержать адреса IP, имена интерфейсов, и т.д.
Таблицы: Применяются для хранения списков IP адресов
Опции: Параметры, влияющие на работу pf
Scrub: Подготовка пакета к нормализации и дефрагментации
Очереди: Обеспечивает управление полосой пропускания и
установку приоритетов пакета.
Трансляции: Контроль NAT и перенаправлением пакета
Правила фильтрации: Осуществляют выборочную фильтрацию пакетов на интерфейсах

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

Списки позволяют определять множества, имеющие общие признаки в пределах правила - такие как IP адреса, номера портов и т.д. При загрузке наборов правило для списка "раскладывается" на отдельные правила для каждого элемента.

Синтаксис: {элементы_списка}

Замечание: запятая при перечислении элементов необязательна, достаточно пробела.
VII. Макросы

Макросы - определяемые пользователем переменные, которые могут представлять собой IP адреса, номера портов, имена интерфейсов, и т.д.

Имена макросов должны начаться с символа и могут содержать символы,цифры, и символы подчеркивания. Названия макросов не могут носить имена зарезервированных слов, типа pass, out, или queue.
Синтаксис: <имя_макроса>="<значение>" # определение макроса
$<имя_макроса> # вызов макроса

Замечание:
<значением> могут быть также списки и другие макросы, возможна рекурсия:
<имя_макроса_списка>="{" <имя_макроса1><имя_макроса2> "}"

VIII. Таблицы

Таблицы используются для хранения группы адресов IPv6 и/или IPv4.
Синтаксис: table <имя_таблицы> { список_адресов }
table <имя_таблицы> file <имя_файла>

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

При определении таблиц могут использоваться следующие атрибуты:

const - содержание таблицы не может быть изменено после ее создания. Без этого атрибута pfctl( 8 ) может использоваться для добавления или удаления элементов таблицы в любое время, при выполнении с securelevel(7), равным двум и выше.

persist - заставляет ядро сохранять таблицу в памяти, даже когда никакие правила к ней не обращаются. Без этого атрибута, ядро автоматически удалит таблицу, когда последнее правило, ссылающееся на нее будет отработано.

Управление таблицами также может осуществляться на лету, используя pfctl( 8 ).

Синтаксис:
pfctl -t <имя_таблицы> -T add # добавить в таблицу
pfctl -t <имя_таблицы> -T delete # удалить
pfctl -t <имя_таблицы> -T show # вывести на экран ip адреса из таблицы Это
# также откроет таблицу, если она не существует.
IX. Правила фильтрации

Синтаксис: {pass,block}{in,out}[log][quick]on interface[proto{tcp,udp,...}]from SRC_IP[port SRC_PORT] to DST_IP[port DST_PORT][tcp_flags][state]

pass - разрешить
block - запретить
in/out - направление
log - указатель необходимости регистрации пакета через pflog( 8 ) (регистрируется лишь первый пакет соединения, в противном случае log all)
quick - указатель на то, что список правил далее не должен просматривается и к пакету применяется данное правило
interface - интерфейс
proto - протокол
SRC_IP - источник
SRC_PORT - порт источника
DST_IP - адресат
DST_PORT - порт адресата
tcp_flags - Определяет флаги, которые должны быть установлены в заголовке TCP при использовании proto tcp. Флаги определяются как flags check/mask.
state - Определяет, сохраняется ли информация о состоянии на пакетах, соответствующих этому правилу.

варианты:
keep state - работает с TCP, UDP, и ICMP
modulate state - работы только с TCP. PF генерирует Initial Sequence Numbers (ISNs) для пакетов, соответствующих этому правилу.
synproxy state - проксирует входящие TCP соединения. Эта опция включает функциональные возможности keep state и modulate state.
X. Инициализация управления очередями ALTQ

Поддержка ALTQ может быть включена только путем компилирования ядра FreeBSD с соответствующими параметрами.

Замечание: ALTQ поддерживается не всеми существующими драйверами сетевых карт. Для просмотра списка поддерживаемых устройств в вашем релизе FreeBSD обратитесь к стравеб сайта PF для FreeBSDнице справочника altq(4).

Следующие параметры включат ALTQ и добавят дополнительную функциональность:
options ALTQ
options ALTQ_CBQ # Class Bases Queuing (CBQ)
options ALTQ_RED # Random Early Detection (RED)
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
options ALTQ_PRIQ # Priority Queuing (PRIQ)
options ALTQ_NOPCC # Required for SMP build

options ALTQ - включает подсистему ALTQ
options ALTQ_CBQ - включает Class Based Queuing (CBQ). CBQ позволяет распределять пропускную способность соединений по классам или очередям для выставления приоритетов трафика на основе правил фильтрации.
options ALTQ_RED - включает Random Early Detection ( RED ). RED используется для предотвращения перегрузки сети. RED вычисляет длину очереди и сравнивает ее с минимальной и максимальной границей очереди. Если очередь превышает максимум, все новые пакеты отбрасываются. В соответствии со своим названием, RED отбрасывает пакеты из различные соединений в произвольном порядке.
options ALTQ_RIO - включает Random Early Detection In and Out.
options ALTQ_HFSC - включает Hierarchical Fair Service Curve Packet Scheduler. (Дополнительная информация http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html)
options ALTQ_PRIQ - включает Priority Queuing ( PRIQ ). PRIQ всегда пропускает трафик из более высокой очереди первым.
options ALTQ_NOPCC - включает поддержку SMP для ALTQ . Эта опция необходима для SMP систем.
XI. Правила ALTQ

Правила для очередей также задаются в конфигурационном файле (/etc/pf.conf)

Синтаксис: altq on interface scheduler bandwidth bw qlimit qlim tbrsize size queue {queue_list}

interface - сетевой интерфейс, на котором активируется очередь.
scheduler - какой планировщик будет использован. Доступные значения cbq и priq. На интерфейсе в один момент времени можно установить только один планировщик.
bw - общая пропускная способность, доступная планировщику. Может содержать аббревиатуры b, Kb, Mb, Gb для обозначения bits, kilobits, megabits, и gigabits в секунду, конкретное значение или процент от общей пропускной способности.
qlim - максимальное число пакетов в очереди. Необязательный параметр. По умолчанию - 50
size - размер token bucket regulator в байтах. Если не определен, то устанавливается на основе ширины полосы пропускания.
queue_list - список дочерних очередей, открываемых из родительской очереди.
Очередь определяется следующим образом

Синтаксис: queue name [on interface] bandwidth bw [priority pri][qlimit qlim] scheduler (sched_options) {queue_list}

name - имя очереди. Эта запись должна быть идентична определенной в директиве altq опцией queue_list. Для cbq это также может быть запись имени очереди в предыдущей директиве queue параметре queue_list. Имя не должно быть длиннее 15 символов.
interface - сетевой интерфейс, на котором запущена очередь. Это значение опциональное и если не определено, то очередь будет работать применительно ко всем интерфейсам. bw - общая пропускная способность, доступная планировщику. Может содержать аббревиатуры b, Kb, Mb, Gb для обозначения bits, kilobits, megabits, и gigabits в секунду, конкретное значение или процент от общей пропускной способности. Указывается только при использовании планировщика cbq.
pri - приоритет очереди. Для cbq приоритет изменяется от 0 до 7, для priq диапазон от 0 до 15. Приоритет 0 считается самым низким. Если этот параметр не определен, ему назначается 1. qlim - максимальное число пакетов в очереди. Необязательный параметр. По умолчанию - 50 scheduler - используемый планировщик - cbq или priq. Должен быть таким же, как и родительская очередь.
sched_options - дополнительные опции для управления планировщиком:
default - определить очередью по умолчанию, куда будут включаться все пакеты не подходящие под остальные очереди. Может быть только одна.
red - включить Random Early Detection (RED) для этой очереди.
rio - включить RED с IN/OUT. В этом режиме RED поддерживает очереди различной длины и различные пороговые значения, по одному на каждый уровень IP Quality of Service.
ecn - включить Explicit Congestion Notification (ECN) для этой очереди. Ecn работает совместно с red.
borrow - эта очередь может заимствовать пропускную способность у других очередей. Может быть определено только при использовании cbq.

Обновлено: 12.03.2015