tag
:
pass in on $int_if all tag INTERNAL_NETМаркер
INTERNAL_NET
будет добавлен любому пакету, который
соответствует приведенному выше правилу.
Маркер также может быть присвоен при помощи macro. Например:
name = "INTERNAL_NET" pass in on $int_if all tag $nameСуществует набор предопределенных макросов, которыми также можно воспользоваться.
$if
- Интерфейс
$srcaddr
- IP адрес отправителя
$dstaddr
- IP адрес получателя
$srcport
- Номер порта отправителя
$dstport
- Номер порта получателя
$proto
- Протокол
$nr
- Номер правила
Маркировка следует правилам:
tag
.
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
$int_if
,
будет присвоен маркер INT_NET
из первого правила.
$int_if
,
и направленным на порт 80, сначала будет присвоен маркер
INT_NET
, как сказано в первом правиле.
Затем маркер будет заменен на INT_NET_HTTP
как
следует из второго правила.
$int_if
от 192.168.1.5 будут помечены одним из двух способов.
Если пакет направлен на 80/TCP порт, то он соответствует второму
правилу и будет помечен маркером INT_NET_HTTP
.
В противном случае пакет соответствует третьему правилу, но
будет помечен маркетом INT_NET
.
Так как пакет соответствует первому правилу, будет присвоен маркер
INT_NET
, и он не будет удален впоследствии, если он
не попадет в правила, определяющие маркер
(это свойство и назвается "липкостью" маркера).
tagged
:
pass out on egress tagged INT_NETПакеты, исходящие из внешнего интерфейса, должны быть помечены тегом
INT_NET
, чтобы соответствовать приведенному
выше правилу.
Обратное сопоставление также можно выполнить при помощи оператора
!
:
pass out on egress ! tagged WIFI_NET
Опишем правила для классификации пакетов в соответствии с политикой.
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_DMZEmail трафик теперь будет передаваться как часть записи политики 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
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