tag
keyword:
pass in on $int_if all tag INTERNAL_NETThe tag
INTERNAL_NET
will be added to any packet which matches
the above rule.
A tag can also be assigned using a macro. For instance:
name = "INTERNAL_NET" pass in on $int_if all tag $nameThere are a set of predefined macros which can also be used.
$if
- The interface
$srcaddr
- Source IP address
$dstaddr
- Destination IP address
$srcport
- The source port specification
$dstport
- The destination port specification
$proto
- The protocol
$nr
- The rule number
Tagging follows these rules:
tag
keyword.
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
will be assigned a tag of
INT_NET
by rule #1.
$int_if
and destined for port 80
will first be assigned a tag of INT_NET
by rule #1.
That tag will then be replaced with the INT_NET_HTTP
tag by
rule #2.
$int_if
from 192.168.1.5 will be tagged
one of two ways.
If the packet is destined for TCP port 80 it will match rule #2 and be
tagged with INT_NET_HTTP
.
Otherwise, the packet will match rule #3 but will be tagged with
INT_NET
.
Because the packet matches rule #1, the INT_NET
tag is
applied and is not removed unless a subsequently matching rule
specifies a tag (this is the "stickiness" of a tag).
tagged
keyword:
pass out on egress tagged INT_NETOutgoing packets on the external interface must be tagged with the
INT_NET
tag in order to match the above rule.
Inverse matching can also be done by using the !
operator:
pass out on egress ! tagged WIFI_NET
Rules now need to be written to classify packets into the policy.
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 8025Now the rules that define the policy are set.
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_DMZNow that the whole ruleset is set up, changes are a matter of modifying the classification rules. For example, if a POP3/SMTP server is added to the DMZ, it will be necessary to add classification rules for POP3 and SMTP traffic, like so:
mail_server = "192.168.0.10" [...] pass in on egress proto tcp to $mail_server port { smtp, pop3 } tag INET_DMZEmail traffic will now be passed as part of the INET_DMZ policy entry.
The complete ruleset:
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
keyword, PF
can be made to filter based on the source or destination MAC address.
Bridge rules are created using the
ifconfig(8) command:
# ifconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 tag USER1And then in
pf.conf
:
pass in on fxp0 tagged USER1