使用OpenBSD> = 4.7的PF中的NAT和源IP过滤


8

我刚刚读了一本关于PF的书(《 PF的书》,没有淀粉),但是有一个问题没有解决。

如果我有一台使用两个接口$ int_if和$ ext_if的网关计算机,并且我将NAT从$ int_if:net(即10.0.0.0/24)到$ ext_if的包使用matchNAT转换为NAT,则应用NAT ?过滤规则之前还是之后?

例:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23

那样有用吗?还是获取来自10.0.0.23的数据包的源IP NAT到$ ext_if的地址,然后检查其是否来自10.0.0.23?

我认为,此图对回答这个问题没有帮助,但是仍然很有趣:[ http://www.benzedrine.cx/pf_flow.png ]

如果您阅读PF NAT FAQ [ http://www.openbsd.org/faq/pf/nat.html ],尤其是“配置NAT”部分,则会遇到以下句子:

当通过匹配规则选择数据包时,该规则中的参数(例如nat-to)会被记住,并在达到与数据包匹配的通过规则时将其应用于数据包。这允许通过单个匹配规则来处理整个数据包类别,然后可以使用阻止和通过规则来做出是否允许流量的特定决定。

我认为这听起来不像我在上一段中所说的那样,因此源IP被“记住”,直到对要对该数据包执行的操作做出决定为止。如果做出决定,将应用NATting。

你怎么看?

PS:这是一个非常理论上的问题。如果您有点务实,可以按照以下方式进行:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23

因此,block当数据包进入$ int_if时,该规则已被应用。

编辑:当然,另一种可能性是在NAT之前进行决定:

pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)

如果来自.23的数据包到达,它首先匹配第一个规则,然后匹配第二个规则和第三个“规则”。但是,由于第二条规则是最后决定通过/阻塞的规则,因此数据包被阻塞了。对?

Answers:


1

是的,这是理论上的问题,您提出的是一个非常有趣的问题。

当该match规则作用于最后一个匹配规则时,将被应用。 match就像您提到的,规则是“粘性”的。它们的主要目的是能够一次设置类似NAT规则的内容,而不必将nat-to放在关于出站流量的一堆规则的末尾。

在您的示例中,数据包将被丢弃。我不得不看一下代码,或者让Henning Brauer确定他们是否在丢弃情况下完全跳过了NAT检查,但是不会被NAT淘汰。

我认为您的规则包含在《 PF之书》中(是否获得了第二版?),但是我认为他们对比赛规则并不明确。


0

如果我错了,请纠正我,您要传递10.0.0.0/24中的所有传出数据包,但要阻止10.0.0.23?如果是这样,请将您的规则更改为:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop out quick on $ext_if from 10.0.0.23
pass out on $ext_if from 10.0.0.0/24

只是用于quick防止防火墙继续过滤(类似于break某些编程语言)。

http://www.openbsd.org/faq/pf/filter.html#quick

快速关键字

如前所述,每个数据包都是根据过滤规则集从上到下进行评估的。默认情况下,数据包被标记为可以通过,可以通过任何规则进行更改,并且可以在过滤器规则结束之前来回更改多次。最后一个匹配规则“获胜”。对此有一个例外:过滤规则的quick选项具有取消任何进一步规则处理的效果,并导致执行指定的操作。让我们看几个例子:

错误:

block in on fxp0 proto tcp to port ssh
pass  in all 

在这种情况下,可以对分界线进行评估,但永远不会有任何效果,因为它之后是一条将通过所有内容的线。

更好:

block in quick on fxp0 proto tcp to port ssh
pass  in all 

这些规则的评估略有不同。如果块行匹配,由于使用了快速选项,则将阻止该数据包,而忽略其余规则集。


我知道这个quick关键字,但是我不太喜欢它-我总是尝试使用pf的评估顺序;)顺便说一句,我在OpenBSD FAQ页面上找到了答案:“ NAT被指定为可选的nat-to参数,通常,不是直接在通过规则上设置而是使用匹配规则。当通过匹配规则选择数据包时,该规则中的参数(例如nat-to)会被记住并应用于当达到与数据包匹配的通过规则时,该数据包。因此,我的规则集不会造成任何问题,并且可以正确阻止.23
dermesser 2013年

(第2行中的匹配规则让数据包经过所有规则后才通过,然后应用NAT)
dermesser 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.