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_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
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