[OpenBSD]

[上一小节: 地址池和负载均衡] [总目录] [下一小节: 记录]

PF: 数据包贴标签 (过滤策略)


目录


介绍

给数据包贴标签是一种给数据包贴上内部标识符以便以后可以在过滤和转换规则标准中应用的一种方法。通过贴标签, 可实现这样的目的, 例如在接口间建立"信任"以及确认是否数据包经过转换规则处理。它还可以使过滤方式从基于规则的过滤变成基于策略的过滤。

给数据包贴标签

给数据包贴标签要使用 tag 关键字:
pass in on $int_if all tag INTERNAL_NET

这条规则将给所有匹配上述规则的数据包贴上INTERNAL_NET标签

一个标签也可以通过 macro 指派。例如:

name = "INTERNAL_NET"
pass in on $int_if all tag $name

同样也可以使用一组预定义的macro。

这些macros将在规则集载入时被扩展, 而不是运行时才扩展。

为数据包贴标签遵循如下规则:

使用下面的规则集举例。

(1) pass in on $int_if tag INT_NET
(2) pass in quick on $int_if proto tcp to port 80 tag INT_NET_HTTP
(3) pass in quick on $int_if from 192.168.1.5

检查应用的标签

要检查先前的已贴标签要使用 tagged 关键字:
pass out on $ext_if tagged INT_NET

$ext_if的出站数据包必须已经贴上了INT_NET 标签才能匹配上面的规则。相反地匹配也可以通过使用! 操作符实现:

pass out on $ext_if ! tagged WIFI_NET

过滤策略

过滤策略使用不同的方法写过滤规则。策略定义了哪种类型的通讯匹配什么规则后被放行或阻止, 然后数据包基于传统的标准,按照源/目标的IP地址/端口、协议等按照策略分为不同的类型。例如, 检查下面的防火墙策略:

注意策略是如何覆盖所有通过防火墙的通讯的。圆括号内是用于策略的标签。

需要编写过滤及转换规则以便按策略分类数据包。

block all
pass out on $ext_if 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 $ext_if proto tcp to $www_server port 80 tag INET_DMZ pass in on $ext_if proto tcp from  to port smtp \
   tag SPAMD rdr-to 127.0.0.1 port 8025

现在设置定义策略的规则。

pass in  quick on $ext_if tagged SPAMD
pass out quick on $ext_if tagged LAN_INET_NAT
pass out quick on $dmz_if tagged LAN_DMZ
pass out quick on $dmz_if tagged INET_DMZ

现在建立了完整的规则集, 修改也只是修改分类规则, 例如, 如果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 

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.
block all
pass out on $ext_if 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 $ext_if proto tcp to $www_server port 80 tag INET_DMZ pass in on $ext_if 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 $ext_if tagged SPAMD pass out quick on $ext_if tagged LAN_INET_NAT pass out quick on $dmz_if tagged LAN_DMZ pass out quick on $dmz_if tagged INET_DMZ

标签以太帧

如果做标签/过滤的这台计算机也作为一个 bridge(4),贴标签可以在以太级别进行。通过使用tag关键字产生 bridge(4) 过滤规则, PF可以使过滤基于源或目的的MAC地址。用 brconfig(8) 命令产生Bridge(4)规则,例如:
# ifconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
   tag USER1 

然后在pf.conf里:

pass in on fxp0 tagged USER1

[上一小节: 地址池和负载均衡] [总目录] [下一小节: 记录]


[back] www@openbsd.org
$OpenBSD: tagging.html, v 1.18 2007/05/07 01:27:19 joel Exp $