Контроль Разума
Advertisement
Запрос «PF» перенаправляется сюда. Cм. также другие значения.



Packet Filter (PF)
Тип Межсетевой экран
Разработчик проект OpenBSD
ОС BSD-системы
Текущая версия 4.4 — 1 ноября 2008 года
Лицензия BSD
Сайт PF FAQ

Pácket Fílter (PF) — Межсетевой экран, разрабатываемый в рамках проекта OpenBSD. Обладает высокой скоростью работы, удобством в конфигурировании и большими возможностями, включая поддержку IPv6. На данный момент используется, помимо OpenBSD, также в NetBSD и FreeBSD, а также основанных на этих трёх MirBSD, DesktopBSD, pfSense и других. PF был даже портирован на Microsoft Windows[1].

История[]

История PF началась в 2000 году, когда Даррен Рид, разработчик использовавшегося в то время в OpenBSD файрвола ipf, изменил лицензию на своё детище. Тогда ipf был исключён из CVS-репозитория, а его место к релизу OpenBSD 3.0 занял написанный «с нуля» PF.

Архитектура[]

PF состоит из двух частей: собственно сетевого фильтра и утилиты pfctl, которая предоставляет интерфейс для управления межсетевым экраном. Фильтр полностью работает в контексте ядра операционной системы, взаимодействие с ним осуществляется через системный вызов ioctl. Поэтому pfctl, строго говоря, не является необходимой частью PF.

PF изначально не рассчитан на многопоточную обработку пакетов. С другой стороны, отсутствие блокировок положительно влияет на производительность.

Фильтр обрабатывает сетевые пакеты один (при посылке пакета с того же компьютера, на котором стоит фильтр, на другой компьютер, или наоборот) или два (при пересылке внутри компьютера или когда компьютер с фильтром исполняет роль сетевого шлюза) цикла обработки. Каждый цикл состоит из следующих этапов:

нормализация
сборка фрагментированных и отбрасывание заведомо некорректных пакетов, а также другие операции, упрощающие дальнейшую обработку.
трансляция
перенаправление трафика (более тонкое, чем его могут обеспечить обычные средства маршрутизации) и трансляция сетевых адресов (NAT, biNAT), с поддержкой пула адресов назначения.
фильтрация
принятие окончательного решения о пропуске или блокировке сетевого пакета.

Следует отметить, что при задании правил трансляции можно указать безусловный пропуск трафика; в таком случае фаза фильтрации опускается, что позволяет повысить производительность. И наоборот, при фильтрации можно указать шлюз, на который должен быть перенаправлен пакет; это бывает полезно в тех случаях, когда нужно задействовать параметры фильтрации, недоступные при трансляции.

При трансляции PF просматривает правила до первого подходящего в следуюем порядке:

  1. Правила binat (двусторонняя трансляция)
  2. Правила rdr (перенаправление) и nat (односторонняя трансляция)

Если подошедшее правило содержит соответствующую пометку, то до этапа фильтрации дело не доходит и пакет сразу отправляется по назначению.

При фильтрации PF просматривает все правила, и затем применяет последнее подошедшее правило. Это удобно, так как позволяет задать серию правил, постепенно сужающих область применения, что выглядит более естественно, чем обратный порядок. Если ни одно правило не подошло, то пакет пропускается; эта мера служит защитой от случайной ошибки при конфигурировании сетевого экрана. Однако для правил фильтрации можно сделать соответствующую пометку, и тогда PF, если данное правило подходит, сразу закончит обработку пакета.

Возможности фильтрации[]

PF умеет фильтровать пакеты по следующим параметрам:

  • Сетевой адрес (для TCP и UDP также и порт) источника и получателя пакета
  • Сетевой интерфейс (или их группа), на котором обрабатывается пакет
  • Флаги (для TCP)
  • Биты TOS
  • Тип ICMP (для ICMP и ICMPv6)
  • Метки правил (label) и теги (tag)
  • Локальный пользователь (владелец сокета)
  • Различные счётчики соединений
  • Вероятность

Последний параметр позволяет создавать правила, которые срабатывают «иногда», что помогает бороться с (порой непреднамеренными) DDoS-атаками.

Метки правил назначаются сетевому пакету в ходе его прохождения списка правил фильтрации, когда пакет оказывается подходящим под правило с меткой. Каждая новая метка назначается вместо предыдущей. Теги назначаются аналогичным образом, однако новые теги назначаются в дополнение к уже существующим.

PF не только умеет проводить фильтрацию с учётом контекста, но поддерживает три варианта работы в этом режиме (терминология из оригинальной документации):

keep state
простой режим, запоминается только соответствие пар сетевых адресов и портов; этот режим применим не только к TCP, но и к UDP.
modulate state
более сложный режим, в котором PF самостоятельно выбирает начальные значения счётчиков пакетов TCP; это обеспечивает улучшенную защиту в случаях, когда одна из сторон выбирает плохие с точки зрения вероятности угадывания значения этих счётчиков.
synproxy state
в этом режиме PF самостоятельно устанавливает TCP-соединение с другой стороной, и только после этого соответствующие пакеты отсылаются инициатору; это обеспечивает защиту от атак типа SYN-флуд с подделкой адреса отправителя.

Таблицы адресов[]

Одной из самых интересных возможностей PF является работа с таблицами адресов:

  • Таблицы могут содержать как IPv4-, так и IPv6-адреса, вместе с маской подсети для каждого;
  • Поиск по таблице происходит быстрее, чем линейный поиск по набору адресов;
  • Таблицы могут быть произвольным образом изменены без необходимости перезагружать правила;
  • По каждой записи в таблице может вестись статистика;
  • Посредством опции фильтрации overload в выбранную таблицу могут помещаться адреса, превышающие те или иные ограничения на количество соединений;
  • Записи в таблицах могут быть автоматически удалены по достижении указанного времени их существования.

Например, в таблицу можно занести все приватные адреса[2][3][4] в единую таблицу и затем блокировать попытки подключения извне от якобы этих адресов всего одним правилом.

Сторонние программы через системный вызов ioctl или посредством вызова программы pfctl могут управлять содержимым таблиц. Например, DHCP-сервер dhcpd из состава OpenBSD поддерживает использование до трёх таблиц pf:

  • таблица, в которую добавляются IP-адреса новых DHCP-клиентов
  • таблица, из которой удаляются освобождающиеся IP-адреса
  • таблица, в которой поддерживается список временно запрещённых к использованию IP-адресов

Блоки правил[]

Правила можно объединять в блоки (anchors в оригинальной документации). При этом можно для каждого блока задавать общие параметры, которые будут действовать для всех правил в блоке. Блоки бывают четырёх видов: binat-, nat- и rdr-блоки (выполняются при трансляции) и блоки с правилами фильтрации.

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

Блоки правил удобны для использования в программах, так или иначе управляющих потоками трафика. Примеры программ:

  • relayd, прокси-сервер для организации автоматического контроля списка работающих backend-серверов;
  • authpf, командная оболочка UNIX, позволяющая контролировать доступ к сетевым ресурсам при помощи аутентификации пользователей через SSH.

Книги[]

  • «Absolute OpenBSD», — Майкл Лукас, ISBN 1-886411-99-9, No Starch Press, 2003, 500 стр.
  • «Building Firewalls with OpenBSD and PF» (2-е издание), — Ясек Артимьяк (Jacek Artymiak), ISBN 83-916651-1-9, 2003, 320 стр.
  • «Secure Architectures with OpenBSD», — Брэндон Палмер, Жосе Назарио, ISBN 0-321-19366-0, Addison-Wesley Professional, 2004, 520 стр.

Более полный список книг доступен на соответствующей странице сайта OpenBSD.

Примечания[]

  1. Сетевой экран Core Force для Microsoft Windows 2000/XP
  2. RFC 1918 (приватные адреса в Интернет)
  3. RFC 3927 (адреса для Zeroconf)
  4. IP Filter HOWTO, содержит хороший список приватных адресов с пояснениями


de:Pf (Paketfilter) en:PF (firewall) es:PF (software) fr:Packet Filter it:Pf (software) ja:PF (ファイアウォール) pl:Packet Filter

Advertisement