Nftables默认掉链问题

Nftables默认掉链问题

我想对我的防火墙规则采用默认丢弃方法。我创建了一些用于测试目的的规则:

table bridge vmbrfilter {
    chain forward {
        type filter hook forward priority -100; policy drop;
        ip saddr 192.168.1.10 ip daddr 192.168.1.1 accept;
        ip saddr 192.168.1.1 ip daddr 192.168.1.10 accept;
    }
}

192.168.1.1然而,和之间的交通192.168.1.10仍然受阻。为了看看是否是语法问题,我尝试了:

table bridge vmbrfilter {
    chain forward {
        type filter hook forward priority -100; policy accept;
        ip saddr 192.168.1.10 ip daddr 192.168.1.1 drop;
        ip saddr 192.168.1.1 ip daddr 192.168.1.10 drop;
    }
}

然而,这成功地阻止了两个 IP 之间的流量。所以我不知道为什么我的accept规则没有被遵守。维基nftables百科说:

丢弃判决意味着如果数据包到达基础链的末端,则该数据包将被丢弃。

accept我的链中确实有应该匹配的规则。

我是否理解不正确?预先感谢您的任何帮助。

更新:AB 的 ARP 规则建议很有帮助。但是我发现我的 VLAN 标记导致我的防火墙规则出现问题。 ARP 规则允许标记的流量通过物理 NIC 进入,ARP 回复通过网桥进行传输,但在从物理 NIC 退出时被阻止。

答案1

以太网上的 IPv4 依赖于地址解析协议解析对等方的以太网 MAC 地址,以便稍后向其发送单播数据包。

当您过滤任何 ARP 请求时,因为没有例外,这些请求不会成功,并且在典型的 3 秒超时后,您将得到标准的“没有到主机的路由”。不会有任何 IPv4 数据包从 192.168.1.10 发送到 192.168.1.1 或从 192.168.1.1 发送到 192.168.1.10,因为上一步失败。

因此,现在添加此规则,稍后看看如果您确实需要的话如何对其进行微调:

nft add rule bridge vmbrfilter forward ether type arp accept

如果网桥能够识别 VLAN ( vlan_filtering=1),或者即使不能够识别(即:网桥操作帧但并不真正了解更多有关它们的信息,如果来自两个不同 VLAN 的两个帧具有相同的 MAC 地址,这可能不太好),那么这里有一条规则允许 VLAN 标记帧内的 ARP 数据包:

nft add rule bridge vmbrfilter forward ether type vlan vlan type arp accept

但无论如何,IP不适配也会出现同样的问题。这需要有关 VLAN 设置的更多信息。

这是一个规则集,允许标记和未标记的帧,需要重复规则。 ARP 没有进一步的表达式来过滤它,因此自动选择协议/类型,它需要一个显式的vlan type arp.

table bridge vmbrfilter        # for idempotency
delete table bridge vmbrfilter # for idempotency

table bridge vmbrfilter {
    chain forward {
        type filter hook forward priority -100; policy drop;
        ip saddr 192.168.1.10 ip daddr 192.168.1.1 accept
        ip saddr 192.168.1.1 ip daddr 192.168.1.10 accept
        ether type arp accept

        ether type vlan ip saddr 192.168.1.10 ip daddr 192.168.1.1 accept
        ether type vlan ip saddr 192.168.1.1 ip daddr 192.168.1.10 accept
        ether type vlan vlan type arp accept
    }
}

还有旧版本的nftables(例如:OP的0.9.0)当它们没有额外的过滤器时,可能会在输出中省略强制过滤器表达式(例如,但不存在于这个答案中:ether type vlan arp htype 1(display truncated) vs vlan id 10 arp htype 1) ,因此它们的输出不应被重新用作输入在配置文件中。人们仍然可以通过使用来区分差异并知道存在附加过滤器表达式nft -a --debug=netlink list ruleset

据我所知,目前还不支持协议的任意封装/解封装nftables,因此规则的重复似乎是不可避免的(只需查看字节码即可了解如何在 VLAN 和非 VLAN 情况下查找相同字段:不同的偏移量)。

相关内容