我正在研究 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 -ddd
或nfbpf_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(或类似)虚拟接口,您可以从中查看标头信息。