[OpenBSD]

[Предыдущая: Перенаправление трафика (Проброс портов)] [Содержание] [Следующая: Параметры работы фильтра]

PF: Сокращения для написания правил


Table of Contents


Вступление

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

Использование макросов

Макросы полезны тем, что они обеспечивают альтернативу жёсткому указанию адресов, номеров портов, названий интерфейсов, и т.д, в правила. Поменялись IP адреса серверов? Не проблема, всего лишь обновите макрос; нет необходимости возиться с правилами фильтрации, тратить время, которое вы могли бы потратить на совершенствование своих потребностей.

Главное соглашение в правилах PF, это задать макрос для каждого сетевого интерфейса. Если когда нибудь понадобится заменить сетевую карту на другую, которая будет использовать другой драйвер, например заменить 3COM на Intel, можно обновить макрос и правила фильтрации будут работать, как и раньше. Другое преимущество, когда устанавливаешь одни правила на разных машинах. Некоторые машины могут иметь различные сетевые карты и использование макросов для определения сетевых интерфейсов позволяет правилам быть установленными с минимальным изменением. Использование макросов для определения информации в правилах, такой как номера портов, IP адреса и название интерфейсов, является рекомендуемой практикой.

# задание макросов для каждого сетевого интерфейса
IntIF = "dc0"
ExtIF = "fxp0"
DmzIF = "fxp1"

Другое важное соглашение, это использование макросов для задания IP адресов и сетевых блоков. Это может значительно упростить обслуживание правила, когда меняются IP адреса.

# определение нашей сети
IntNet = "192.168.0.0/24"
ExtAdd = "24.65.13.4"
DmzNet = "10.0.0.0/24"

Если внутренняя сеть постоянно расширяется или была изменена в другой IP блок, можно обновить макрос:

IntNet = "{ 192.168.0.0/24, 192.168.1.0/24 }"

После того, как правила будут перезагружены, всё будет работать, как прежде.

Использование Списков

Давайте посмотрим на хороший набор правил для адресов описанных в RFC 1918, которые не должны появляться в Интернете, потому что обычно это приводит к проблемам:
block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 127.0.0.0/8
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 10.0.0.0/8

Упрощение этих правил:

block in  quick on tl0 inet from { 127.0.0.0/8, 192.168.0.0/16, \
   172.16.0.0/12, 10.0.0.0/8 } to any
block out quick on tl0 inet from any to { 127.0.0.0/8, \
   192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }

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

NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
   10.0.0.0/8 }"
ExtIF = "tl0"
block in  quick on $ExtIF from $NoRouteIPs to any
block out quick on $ExtIF from any to $NoRouteIPs

Макросы и списки упрощают файл pf.conf, но на самом деле правила разворачиваются с помощью pfctl(8). Пример указанный выше на самом деле развернётся в:

block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 10.0.0.0/8
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 127.0.0.0/8

Как вы видите, упрощение только для удобства написания правил в pf.conf, а не упрошение обработки правил pf(4)'ом.

Макросы могут быть использованы для определения не только адресов и портов; но вообще для чего угодно:

pre = "pass in quick on ep0 inet proto tcp from "
post = "to any port { 80, 6667 } keep state"

# Классная комната Дэвида
$pre 21.14.24.80 $post

# Дом Ника
$pre 24.2.74.79 $post
$pre 24.2.74.178 $post

Разворачивается в:

pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 6667 keep state

Грамматика PF

Грамматика Пакетного Фильтра достаточно гибка и обеспечивает большую гибкость в написании правил. PF способен делать выводы из определённых ключевых слов, что означает, что они не должны быть чётко заданы в определённом стиле и определённом порядке и поэтому нет необходимости строго запоминать синтаксис.

Избавление от ключевых слов

Для определения политики по умолчанию, используются два правила:

block in  all
block out all

Это может быть уменьшено до:

block all

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

Подобным образом, выражения "from any to any" и "all" могут быть исключены из правил, например:

block in on rl0 all
pass  in quick log on rl0 proto tcp from any to any port 22 keep state

может быть упрощено до:

block in on rl0
pass  in quick log on rl0 proto tcp to port 22 keep state

Первое правило блокирует любые входящие пакеты на интерфейсе rl0, а второе правило впускает TCP трафик на rl0 порт 22.

Упрощение Return

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

block in all
block return-rst in proto tcp all
block return-icmp in proto udp all
block out all
block return-rst out proto tcp all
block return-icmp out proto udp all

Это может быть упрощено, как:

block return

Когда PF видит ключевое слово return, он посылает соответствующий ответ, или вообще не отвечает, в зависимости от протокола блокируемого пакета.

Порядок ключевых слов

Порядок в котором указаны ключевые слова в большинстве случаев не важен. Например, правило записанное, как:

pass in log quick on rl0 proto tcp to port 22 \
   flags S/SA keep state queue ssh label ssh

Может быть записано, как:

pass in quick log on rl0 proto tcp to port 22 \
   queue ssh keep state label ssh flags S/SA

Другие, подобные варианты также будут работать.

[Предыдущая: Перенаправление трафика (Проброс портов)] [Содержание] [Следующая: Параметры работы фильтра]


[back] www@openbsd.org
$OpenBSD: shortcuts.html,v 1.3 2009/08/01 21:41:39 tobias Exp $