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

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

我刚刚读了一本关于 PF 的书(The Book Of PF, No Starch),但有一个问题没有得到解答。

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

例子:

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 之前获取来自 10.0.0.23 NAT 到 $ext_if 地址的数据包的源 IP?

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

如果您阅读 PF NAT 常见问题解答 [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 的数据包到达,它首先匹配第一条规则,然后匹配第二条规则和第三条“规则”。但由于第二条规则是最后决定通过/阻止的规则,因此数据包会被阻止。正确的?

答案1

是的,你问的问题很理论化,但却是一个非常有趣的问题。

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

在您的示例中,数据包将被丢弃。我必须查看代码或询问 Henning Brauer 以确定他们是否在 drop 情况下完全跳过 NAT 检查,但它会不是进行 NAT 处理。

我认为你的规则PF之书涵盖了(有第二版?),但我认为他们在比赛规则中并没有明确说明这一点。

答案2

如果我错了,请纠正我,您想通过 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

快速关键词

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

错误的:

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 

这些规则的评估略有不同。如果阻止行匹配,则由于快速选项,数据包将被阻止,并且规则集的其余部分将被忽略。

相关内容