当忽略更具体的规则允许时,FreeBSD-12.0 PF 防火墙默认规则将被阻止

当忽略更具体的规则允许时,FreeBSD-12.0 PF 防火墙默认规则将被阻止

我们的 PF 防火墙包含以下内容:

. . .
scrub in all fragment reassemble no-df max-mss 1440
### em1 ipv4 = 123.12.3.234
nat               log   on $ext_if \
                  from  $net_nat \
                  to    any -> ($ext_if)
. . .
antispoof         log   for $ext_if
block return  out log   all
block drop    in  log   all
. . .

稍后又出现了以下内容:

pass          in  log   quick \
                  from  11.22.33.164 \
                  to    any

pass          out log   quick \
                  from  any \
                  to    11.22.33.164

但是,TCPDUMP 显示发生了以下情况:

 00:00:00.116888 rule 3/0(match): block in on em1: 11.22.33.164.2148 > 123.12.3.234.59865: Flags [R.], seq 1, ack 1, win 5707, length 0

 00:00:00.115632 rule 3/0(match): block in on em1: 11.22.33.164.2148 > 123.12.3.234.62733: Flags [R.], seq 1, ack 1, win 159, length 0

 00:00:00.011031 rule 2/0(match): block out on em1: 123.12.3.234.64105 > 11.22.33.164.2148: Flags [P.], seq 2111901423:2111901475, ack 316150303, win 258, length 52

 00:00:00.074555 rule 3/0(match): block in on em1: 11.22.33.164.2148 > 123.12.3.234.58208: Flags [.], ack 1, win 159, length 0

 00:00:00.065409 rule 3/0(match): block in on em1: 11.22.33.164.2148 > 123.12.3.234.56489: Flags [.], ack 1, win 159, length 0

 00:00:00.077103 rule 3/0(match): block in on em1: 11.22.33.164.2148 > 123.12.3.234.62245: Flags [P.], seq 0:36, ack 1, win 136, length 36

 00:00:00.040241 rule 3/0(match): block in on em1: 11.22.33.164.2148 > 123.12.3.234.58208: Flags [.], ack 1, win 159, length 0

 00:00:00.026616 rule 3/0(match): block in on em1: 11.22.33.164.2148 > 123.12.3.234.56489: Flags [R.], seq 1, ack 1, win 159, length 0

我的问题是:为什么?是什么原因导致后面的“快速”规则不匹配,而是让默认规则生效?

答案1

如果我没看错的话,您有一个 NAT 路由器,后面还有一个您希望允许其访问互联网的客户端。我注意到,几乎所有的规则都说明了它们适用的接口,却没有说明方向。您的规则恰恰相反,注重方向,但没有指定接口。

查看仅有的两条“通过”规则,
pass in quick from 11.22.33.164 to any pass out quick from any to 11.22.33.164
这些规则只有在应用于路由器的 LAN 接口时才有意义。第一条允许特定 IP 与路由器及其所连接的任何设备通信,另一条允许事物通过路由器与该 IP 通信。这是可以接受的第一步。但是,我认为数据包不允许继续传输,因为缺少 WAN 接口的相应规则。虽然我不记得“nat”是否需要这样做(以及规则中使用的 IP 是否需要预 nat 或后 nat)。一个快速尝试的方法是从这两个规则中删除“in”和“out”关键字。

在我的家庭设置中,我通过使用这些草率的捷径来避免大部分工作:
set skip on { lo0 $lan_if $vpn_if } # trusted interfaces nat on $wan_if inet from !$wan_if to any -> ($wan_if:0) pass out quick all # outbound default to allow block return in quick all no state # inbound default to deny, return icmp(unreachable)

答案2

除了规则逻辑的问题之外,它看起来更像是某种状态不同步。

您可以尝试scrub部分放松或完全移除它。例如,no-df正在盲目剪切复制,但移除 DF 会干扰路径 MTU 发现。

相关内容