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