OpenBSD PF: маркировка пакетов (политика фильтрации) [Содержание]



Введение

Packet tagging — это способ маркировки пакетов внутренним идентификатором, который впоследствии можно использовать как критерий в правилах фильтрации и трансляции. С помощью маркеров (тегов, tags) можно делать такие вещи, как создание «доверительных отношений» между интерфейсами и определение того, были ли пакеты обработаны правилами трансляции. Также можно отказаться от фильтрации на основе правил и начать применять policy-based filtering (фильтрацию на основе политик).

Присваивание маркера (tags) пакетам

Для присваивания маркера пакету используйте ключевое слово tag:
pass in on $int_if all tag INTERNAL_NET
Маркер INTERNAL_NET будет добавлен любому пакету, который соответствует приведенному выше правилу.

Маркер также может быть присвоен при помощи macro. Например:

name = "INTERNAL_NET"
pass in on $int_if all tag $name
Существует набор предопределенных макросов, которыми также можно воспользоваться. Эти макросы преобразовываются в момент загрузки правил, а НЕ во время выполнения.

Маркировка следует правилам:

Приведем следующий набор правил в качестве примера.
pass in on $int_if tag INT_NET
pass in quick on $int_if proto tcp to port 80 tag INT_NET_HTTP
pass in quick on $int_if from 192.168.1.5

Проверка присвоенных маркеров

Для проверки ранее примененных маркеров используйте ключевое слово tagged:
pass out on egress tagged INT_NET
Пакеты, исходящие из внешнего интерфейса, должны быть помечены тегом INT_NET, чтобы соответствовать приведенному выше правилу. Обратное сопоставление также можно выполнить при помощи оператора !:
pass out on egress ! tagged WIFI_NET

Политика фильтрации

Фильтрация на основе политик (policy filtering) применяет другой подход для описания набора фильтров. Политика определяет какие наборы правил для какого типа трафика разрешаются, а для какого блокируются. Затем пакеты классифицируются политикой, основанной на обычных критериях: IP адрес/порт источника/приемника, протокол, и др. Например рассмотрим следующую политику файрвола: Обратите внимание, что политика распространяется на весь трафик, проходящий через файервол. Элемент в скобках указывает тег, который будет использоваться для этого элемента политики.

Опишем правила для классификации пакетов в соответствии с политикой.

block all
pass out on egress inet tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in  on $int_if from $int_net tag LAN_INET
pass in  on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in  on egress proto tcp to $www_server port 80 tag INET_DMZ
pass in  on egress proto tcp from <spamd> to port smtp tag SPAMD rdr-to 127.0.0.1 port 8025
Теперь правила, которые определяют политику.
pass in  quick on egress  tagged SPAMD
pass out quick on egress  tagged LAN_INET_NAT
pass out quick on $dmz_if tagged LAN_DMZ
pass out quick on $dmz_if tagged INET_DMZ
Теперь, когда весь набор правил настроен, изменения заключаются в изменении правил классификации. Например, если в демилитаризованную зону добавляется POP3/SMTP-сервер, необходимо будет добавить правила классификации для POP3- и SMTP-трафика, например:
mail_server = "192.168.0.10"
[...]
pass in on egress proto tcp to $mail_server port { smtp, pop3 } tag INET_DMZ
Email трафик теперь будет передаваться как часть записи политики INET_DMZ.

Полный набор правил:

int_if      = "dc0"
dmz_if      = "dc1"
int_net     = "10.0.0.0/24"
dmz_net     = "192.168.0.0/24"
www_server  = "192.168.0.5"
mail_server = "192.168.0.10"

table <spamd> persist file "/etc/spammers"
# classification -- classify packets based on the defined firewall policy.
block all
pass out on egress inet tag LAN_INET_NAT tagged LAN_INET nat-to (egress)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on egress proto tcp to $www_server port 80 tag INET_DMZ
pass in on egress proto tcp from <spamd> to port smtp tag SPAMD rdr-to 127.0.0.1 port 8025

# policy enforcement -- pass/block based on the defined firewall policy.
pass in  quick on egress  tagged SPAMD
pass out quick on egress  tagged LAN_INET_NAT
pass out quick on $dmz_if tagged LAN_DMZ
pass out quick on $dmz_if tagged INET_DMZ

Маркировка Ethernet фреймов

Маркировка может быть выполнена на уровне Ethernet, если машина, выполняющая маркировку/фильтрацию, также используется как bridge(4). Создавая правила фильтрации моста, использующие ключевое слово tag, PF можно настроить на фильтрацию на основе исходного или целевого MAC-адреса. Правила моста создаются при помощи команды ifconfig(8):
# ifconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 tag USER1
После чего в файле pf.conf:
pass in on fxp0 tagged USER1