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_DMZ
Email 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