Пакетный фильтр 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.
|