《13. OpenBSD PF用户指南之高级配置——包标记(过滤策略)》
发表于 : 2010-01-21 10:21
PF: 数据包标记 (过滤策略)
--------------------------------------------------------------------------------
目录
介绍
给数据包设定标记
检查已贴标记
过滤策略
标记以太帧
--------------------------------------------------------------------------------
介绍
包标记是一种给数据包贴上内部标识符以便以后可以在过滤和转换规则标准中应用的一种方法。经过标记, 有可能做这样的事情, 例如在接口间建立信任以及确认是否数据包经过转换规则处理。它还可以使过滤方式从基于规则的过滤变成基于策略的过滤。
给数据包设定标记
给数据包添加标记要使用 tag 关键字:
这条规则将给所有匹配上述规则的数据包贴上INTERNAL_NET标记。
标记也可以通过 宏 指派。例如:
同样也可以使用一组预定义的宏。
$if - 接口
$srcaddr - 源IP地址
$dstaddr - 目标IP地址
$srcport - 源端口
$dstport - 目标端口
$proto - 协议
$nr - 规则号
这些宏将在规则集载入时被扩展, 而不是运行时才扩展。
标记数据包遵循如下规则:
标记是"粘"的。一旦匹配的规则给一个数据包"贴"上了标记, 则这个标记永远不会被删除, 除非被其它的标记替代。
因为标记的"粘性", 即使最后一条匹配的规则没有使用tag关键字, 数据包上仍然有标记。
一个数据包只能有一个标记。
标记是 内部 的鉴别符。标记不会被发到外面。
标记名称最多可用63个字符。OpenBSD 4.0和以前版本的标记名称长度只有15个字符。
使用下面的规则集举例。
(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state
$int_if上进站数据包将被"贴"上INT_NET标记。#1
$int_if上进站并去往端口80的TCP数据包首先被规则#1贴上INT_NET标记, 这个INT_NET标记随后被会规则#2替换为INT_NET_HTTP标记。#2
从192.168.1.5到$int_if的进站数据包的标记有两种可能。如果这是去往端口80的TCP数据包, 它将匹配规则#2, 并被贴上INT_NET_HTTP标记。否则这个数据包将匹配规则#3, 但是也会被贴上INT_NET标记, 因为这个数据包也匹配规则#1, 贴上的INT_NET标记不会被移除除非一条后面的规则指定了一个新的标记(这就是所谓的标记的 "粘性")。
除了使用过滤规则可以给数据包贴标记外, nat、rdr及binat等转换规则也可以使用 tag 关键字给数据包贴标记。
检查已贴标记
要检查先前的已贴标记要使用 tagged 关键字:
pass out on $ext_if tagged INT_NET keep state
从$ext_if的出站数据包必须已经贴上了INT_NET标记才能匹配上面的规则。相反地匹配也可以通过使用 ! 操作符实现:
pass out on $ext_if ! tagged WIFI_NET keep state
转换规则(nat/rdr/binat) 也可以使用 tagged 关键字匹配数据包。
过滤策略
过滤策略使用不同的方法写过滤规则。策略定义了什么类型的通讯匹配什么规则后被放行或阻止, 然后数据包基于传统的标准源/目标IP地址/端口、协议等按照策略分为不同的类型。例如, 检查下面的防火墙策略:
允许从内部LAN(LAN_INET)到Internet的通讯 并且必须已经被转换(LAN_INET_NAT)
允许从内部LAN到DMZ(LAN_DMZ)的通讯
允许从Internet到位于DMZ的服务器(INET_DMZ)的通讯
允许将来自Internet的通讯重定向到 spamd(8) (SPAMD)
禁止所有其它的通讯
注意策略是如何覆盖所有通过防火墙的通讯的。圆括号内是用于策略的标记。
需要编写过滤及转换规则以便按策略分类数据包。
现在设置定义策略的规则。
现在建立了完整的规则集, 修改分类规则的这类变动, 例如, 如果DMZ区增加了一台 POP3/SMTP 服务器, 就需要为POP3和SMTP通讯增加分类规则, 像这样:
Email通讯现在作为 INET_DMZ 策略项的一部分会被放行。
完整的规则集:
标记以太帧
如果做标记/过滤的这台计算机也担当一个 bridge(4),贴标记可以在以太级别进行。 通过使用tag关键字产生 bridge(4) 过滤规则, PF可以使过滤基于源或目的的MAC地址。用 brconfig(8) 命令产生Bridge(4)规则,例如:
然后在pf.conf里:
--------------------------------------------------------------------------------
目录
介绍
给数据包设定标记
检查已贴标记
过滤策略
标记以太帧
--------------------------------------------------------------------------------
介绍
包标记是一种给数据包贴上内部标识符以便以后可以在过滤和转换规则标准中应用的一种方法。经过标记, 有可能做这样的事情, 例如在接口间建立信任以及确认是否数据包经过转换规则处理。它还可以使过滤方式从基于规则的过滤变成基于策略的过滤。
给数据包设定标记
给数据包添加标记要使用 tag 关键字:
代码: 全选
pass in on $int_if all tag INTERNAL_NET keep state
这条规则将给所有匹配上述规则的数据包贴上INTERNAL_NET标记。
标记也可以通过 宏 指派。例如:
代码: 全选
name = "INTERNAL_NET"
pass in on $int_if all tag $name keep state
同样也可以使用一组预定义的宏。
$if - 接口
$srcaddr - 源IP地址
$dstaddr - 目标IP地址
$srcport - 源端口
$dstport - 目标端口
$proto - 协议
$nr - 规则号
这些宏将在规则集载入时被扩展, 而不是运行时才扩展。
标记数据包遵循如下规则:
标记是"粘"的。一旦匹配的规则给一个数据包"贴"上了标记, 则这个标记永远不会被删除, 除非被其它的标记替代。
因为标记的"粘性", 即使最后一条匹配的规则没有使用tag关键字, 数据包上仍然有标记。
一个数据包只能有一个标记。
标记是 内部 的鉴别符。标记不会被发到外面。
标记名称最多可用63个字符。OpenBSD 4.0和以前版本的标记名称长度只有15个字符。
使用下面的规则集举例。
(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state
$int_if上进站数据包将被"贴"上INT_NET标记。#1
$int_if上进站并去往端口80的TCP数据包首先被规则#1贴上INT_NET标记, 这个INT_NET标记随后被会规则#2替换为INT_NET_HTTP标记。#2
从192.168.1.5到$int_if的进站数据包的标记有两种可能。如果这是去往端口80的TCP数据包, 它将匹配规则#2, 并被贴上INT_NET_HTTP标记。否则这个数据包将匹配规则#3, 但是也会被贴上INT_NET标记, 因为这个数据包也匹配规则#1, 贴上的INT_NET标记不会被移除除非一条后面的规则指定了一个新的标记(这就是所谓的标记的 "粘性")。
除了使用过滤规则可以给数据包贴标记外, nat、rdr及binat等转换规则也可以使用 tag 关键字给数据包贴标记。
检查已贴标记
要检查先前的已贴标记要使用 tagged 关键字:
pass out on $ext_if tagged INT_NET keep state
从$ext_if的出站数据包必须已经贴上了INT_NET标记才能匹配上面的规则。相反地匹配也可以通过使用 ! 操作符实现:
pass out on $ext_if ! tagged WIFI_NET keep state
转换规则(nat/rdr/binat) 也可以使用 tagged 关键字匹配数据包。
过滤策略
过滤策略使用不同的方法写过滤规则。策略定义了什么类型的通讯匹配什么规则后被放行或阻止, 然后数据包基于传统的标准源/目标IP地址/端口、协议等按照策略分为不同的类型。例如, 检查下面的防火墙策略:
允许从内部LAN(LAN_INET)到Internet的通讯 并且必须已经被转换(LAN_INET_NAT)
允许从内部LAN到DMZ(LAN_DMZ)的通讯
允许从Internet到位于DMZ的服务器(INET_DMZ)的通讯
允许将来自Internet的通讯重定向到 spamd(8) (SPAMD)
禁止所有其它的通讯
注意策略是如何覆盖所有通过防火墙的通讯的。圆括号内是用于策略的标记。
需要编写过滤及转换规则以便按策略分类数据包。
代码: 全选
rdr on $ext_if proto tcp from <spamd> to port smtp \
tag SPAMD -> 127.0.0.1 port 8025
nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)
block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state
现在设置定义策略的规则。
代码: 全选
pass in quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET_NAT keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state
现在建立了完整的规则集, 修改分类规则的这类变动, 例如, 如果DMZ区增加了一台 POP3/SMTP 服务器, 就需要为POP3和SMTP通讯增加分类规则, 像这样:
代码: 全选
mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ keep state
Email通讯现在作为 INET_DMZ 策略项的一部分会被放行。
完整的规则集:
代码: 全选
# macros
int_if = "dc0"
dmz_if = "dc1"
ext_if = "ep0"
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.
rdr on $ext_if proto tcp from <spamd> to port smtp \
tag SPAMD -> 127.0.0.1 port 8025
nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)
block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ keep state
# policy enforcement -- pass/block based on the defined firewall policy.
pass in quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET_NAT keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state
标记以太帧
如果做标记/过滤的这台计算机也担当一个 bridge(4),贴标记可以在以太级别进行。 通过使用tag关键字产生 bridge(4) 过滤规则, PF可以使过滤基于源或目的的MAC地址。用 brconfig(8) 命令产生Bridge(4)规则,例如:
代码: 全选
# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
tag USER1
然后在pf.conf里:
代码: 全选
pass in on fxp0 tagged USER1