iptables PREROUTING 上的 BPF 匹配失败

iptables PREROUTING 上的 BPF 匹配失败

我正在研究 iptables 规则来匹配 PREROUTING 表中的一系列 MAC 地址;我的实现使用 iptables-extensions 中的 BPF 匹配选项。下面是一个表达式示例,该表达式应该匹配丢弃 aa:bb:cc:dd:ee:ff 的 MAC 地址,匹配所有字节。

((ether[6:4] & 0xffffffff) = (0xaabbccdd & 0xffffffff)) && ((ether[10:2] & 0xffff) = (0xeeff & 0xffff))

根据 的输出tcpdump -nn,该表达式似乎是正确的。

当通过tcpdump -dddnfbpf_compile实用程序发送时,生成的字节码用于创建 iptables 规则。

iptables -t raw -A PREROUTING -i br0 -m bpf --bytecode "BYTECODE OUTPUT" -j DROP

我的问题是,当在 PREROUTING 表中制定此规则(需要完成)时,数据包很少会被丢弃;大多数数据包都能通过过滤器。如果在 INPUT 表中制定了规则,则数据包似乎被成功阻止。

为什么会发生这种情况?

答案1

事实证明,您不能为此使用 BPF 匹配,至少不能在 iptables 内使用。

仅当使用 RAW 链路类型(例如在 TAP 设备上)时,才可以对以太网标头使用 BPF 匹配。当使用仅支持 EN10MB 的物理设备时,不包含以太网标头。

如果您想实现此功能并且需要使用 iptables,则需要创建一个 TAP(或类似)虚拟接口,您可以从中查看标头信息。

相关内容