[Предыдущая: Перенаправление трафика (Проброс портов)] [Содержание] [Следующая: Параметры работы фильтра]
Главное соглашение в правилах 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 }"
После того, как правила будут перезагружены, всё будет работать, как прежде.
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
Для определения политики по умолчанию, используются два правила:
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.
Правила используемые для блокирования 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
Другие, подобные варианты также будут работать.
[Предыдущая: Перенаправление трафика (Проброс портов)] [Содержание] [Следующая: Параметры работы фильтра]