Cellular digital packet data
- 1 year ago
- 0
- 0
Packet Filter (PF) — файрвол , разрабатываемый в рамках проекта OpenBSD . Обладает высокой скоростью работы, удобством в конфигурировании и большими возможностями, включая поддержку IPv6 . На данный момент используется, помимо OpenBSD, в NetBSD и FreeBSD , а также основанных на этих трёх MirOS BSD , DesktopBSD , pfSense и других. Начиная с версии 10.7 PF используется в Mac OS X . PF был портирован на Microsoft Windows и лёг в основу файрвола .
История PF началась в 2000 году, когда , разработчик использовавшегося в то время в OpenBSD файрвола IPFilter , изменил лицензию на него. Тогда ipf был исключён из CVS -репозитория, а его место к релизу OpenBSD 3.0 занял написанный «с нуля» PF.
В OpenBSD 3.3 появился — псевдоинтерфейс, позволяющий реплицировать информацию о контексте соединений между двумя (а позднее и больше) хостами. При использовании CARP или другой аналогичной технологии pfsync позволяет, в частности, создавать отказоустойчивые конфигурации из нескольких физических межсетевых экранов: при отказе одного хоста второй продолжит обрабатывать сетевой трафик без разрыва соединений.
Изначально PF был довольно похож на IPFilter. Крупный редизайн внутренней архитектуры начался в 2005 году усилиями и . В рамках этого проекта PF получил поддержку нового вида правил match , новую схему учёта контекста соединений ( англ. states в оригинальной терминологии). Так же крупным изменением стал отказ от разделения наборов правил по типам: ранее PF, как и IPFilter, имел раздельные наборы правил для NAT и фильтрации трафика. Так же, в рамках общего развития OpenBSD, PF получил поддержку множественных таблиц и .
PF состоит из двух частей: собственно фильтра пакетов и утилиты pfctl, которая предоставляет интерфейс для управления межсетевым экраном. Фильтр полностью работает в контексте ядра операционной системы , взаимодействие с ним осуществляется через системный вызов ioctl. Поэтому pfctl, строго говоря, не является необходимой частью PF.
PF изначально не рассчитан на многопоточную обработку пакетов. С другой стороны, отсутствие блокировок положительно влияет на производительность.
PF умеет пропускать ненужные проверки во время прохождения списка правил. Например, если два правила подряд относятся только к протоколу TCP , то пакет любого другого протокола (например, UDP ), после того как не подойдёт к первому правилу, не будет проверяться на втором. Для этого сначала при составлении набора правил pfctl, зная оптимальный порядок проверок, может изменить взаимный порядок нескольких идущих подряд правил; затем подготовленный набор анализируется при загрузке в PF и для каждого правила составляется карта переходов по несовпадению того или иного параметра.
PF при оптимизации списка правил может также учитывать накопившуюся статистику частоты проверок для правил, и корректировать карту переходов в соответствии с этой статистикой.
Фильтр обрабатывает сетевые пакеты в один (при посылке пакета с того же компьютера , на котором стоит фильтр, на другой компьютер, или наоборот) или два (при пересылке внутри компьютера или когда компьютер с фильтром исполняет роль сетевого шлюза ) цикла обработки.
Собственно обработка пакета происходит согласно набору правил. В финале обработки пакет либо отбрасывается, либо пропускается. Каждое правило состоит из набора условий и набора указаний, выполняемых при удовлетворении набора условий. Правила бывают трёх видов:
Указания, записанные для block- и pass-правил, выполняются после завершения прохода по набору правил. Если для block- или pass-правила сделана соответствующая пометка, то при удовлетворении пакетом условий данного правила, проход по набору правил будет прерван с выполнением соответствующих указаний. Такой порядок позволяет задать серию правил, постепенно сужающих область применения, что выглядит более естественно, чем обратный порядок. Если ни одно block- или pass-правило не подошло, то пакет пропускается: это мера защиты от случайной ошибки при конфигурировании сетевого экрана.
Правила могут включать в себя следующие указания:
PF умеет фильтровать пакеты по следующим параметрам:
Последний параметр позволяет создавать правила, которые срабатывают «иногда», что помогает бороться с (порой непреднамеренными) DDoS-атаками .
Теги назначаются правилами PF. У каждого пакета может быть не более одного тега. Правилом можно установить/заменить тег, но нельзя убрать существующий. Тег сохраняется у пакета на всё время прохождения по сетевому стеку.
PF также позволяет переопределить используемую таблицу маршрутизации, за счёт чего можно переносить пакеты между доменами маршрутизации. Разумеется, это имеет смысл только для входящего трафика, для которого маршрут ещё не определён стандартными средствами.
Для правил можно указывать метки . Одна и та же метка может соответствовать нескольким правилам. Метки позволяют лучше идентифицировать правила из пользовательского пространства, а также отключать встроенную оптимизацию набора правил для определённых правил; последнее может быть нужно, например, для биллинговых систем.
PF не только умеет проводить фильтрацию с учётом контекста, но поддерживает три варианта работы в этом режиме (терминология из оригинальной документации):
По умолчанию все pass-правила учитывают контекст (keep state), а относящиеся к TCP ещё и проверяют флаги SYN-пакета. Это сделано поскольку позволяет заметно сократить объём правил (как в плане их количества, так и в плане их описания в файле конфигурации) в типичных ситуациях. При этом можно принудительно отказаться от этих возможностей для конкретного правила или всего их набора. Следует также учитывать, что если пакет не попал ни под одно pass-правило, то никаких проверок и создания контекста не происходит.
Одной из самых интересных возможностей PF является работа с таблицами адресов:
Например, в таблицу можно занести все приватные адреса в единую таблицу и затем блокировать попытки подключения извне от якобы этих адресов всего одним правилом.
Более того, путём использования пометок об исключении адресов (диапазонов адресов) можно путём всего трёх записей в таблице указать такую конфигурацию: в таблицу входит диапазон
10.0.0.0/8
, кроме
10.0.3.192/26
, плюс ещё входит
10.0.3.211
. Соответствующие записи в таблицу можно заносить в любом порядке, PF будет их использовать в соответствии с их префиксами (маской подсети).
Сторонние программы через системный вызов или посредством вызова программы pfctl могут управлять содержимым таблиц. Например, DHCP -сервер (недоступная ссылка) из состава OpenBSD поддерживает использование до трёх таблиц PF:
Правила можно объединять в блоки ( anchors в оригинальной документации). При этом можно для каждого блока задавать общие параметры, которые будут действовать для всех правил в блоке.
Блоки обрабатываются наравне с правилами и могут вкладываться друг в друга. При этом содержимое блоков может изменяться независимо друг от друга, а также от общего списка правил. Последний, по сути, является тем же блоком.
Блоки правил удобны для использования в программах, так или иначе управляющих потоками трафика. Примеры программ: