如何使用 iptables 删除无效以太类型的包?

如何使用 iptables 删除无效以太类型的包?
19:27:47.782291 98:9b:cb:: > ff:ff:ff:ff:ff:ff, ethertype Unknown (0x88e1), length 60:
        0x0000:  0000 a000 b052 38e5 d57f 0000 0000 0000  .....R8.........
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................
        0x0020:  0000 0000 0000 0000 0000 0000 0000       ..............
19:27:47.782293 98:9b:cb:: > ff:ff:ff:ff:ff:ff, ethertype Unknown (0x8912), length 60:
        0x0000:  0170 a000 0000 1f84 e5a3 97a2 5553 bef1  .p..........US..
        0x0010:  fcf9 796b 5214 13e9 e200 0000 0000 0000  ..ykR...........
        0x0020:  0000 0000 0000 0000 0000 0000 0000       ..............

我的路由器正在向我的网络发送这些垃圾信息,我想阻止它,因为无法禁用它。事实iptables证明,这样做比我想象的更具挑战性:

root@fw:~ # iptables -A INPUT -m mac --mac-source 98:9b:cb:: -p 0x88e1 -j DROP
iptables v1.8.2 (nf_tables): unknown protocol "0x88e1" specified
Try `iptables -h' or 'iptables --help' for more information.

有什么办法可以阻止无效的以太类型?

答案1

它似乎iptables不能用于我们的问题。我们必须使用它的改进的后继者nftables。它只有一个meta表达式,表达式类型为protocol = EtherType protocol value。感谢@Bernard谁找到了问题的答案Linux 服务器在 __netif_receive_skb_core 中丢弃 RX 数据包他给出了这个例子来删除未知的 EtherTypes,只需将其附加到/etc/nftables.conf

table netdev filter {
    chain ingress {
        type filter hook ingress device eno1 priority 0; policy accept;
        meta protocol {0x8912, 0x88e1} drop
    }
}

在我的 Raspberry Pi 上Raspberry Pi OS Buster我只是做:

rpi ~$ sudo apt install nftables

/etc/nftables.conf现在可用了,我使用正确的接口名称附加了规则,而不是eno1从例子中。

rpi ~$ sudo systemctl start nftables.service

tcpdump 显示,不再有未知的以太网类型数据包。

答案2

为什么要丢弃这些帧?这有什么区别?反正它们都会被丢弃……

iptables您的方法不起作用的原因在于您混淆了协议层。以太网类型(意思是:更高级别的协议)0x0800 是 IP(请参阅/etc/ethertypes)。换句话说:这不是 IP 数据包。直接的后果是 Netfilter 永远不会看到它,因为它只处理 IPv4 和 IPv6 数据包。因此,Netfilter 中没有匹配以太网类型的选项。

这里似乎没有ebtables帮助,因为它没有针对 ethertype 的测试。

一些希望:流量整形

或许有一个(困难的)“解决方案”(针对这个非问题)就是滥用流量整形(tc)及其中间功能块(ifb)伪网络接口。通常流量整形仅用于传出流量。有了它ifb可以对传入流量强制执行(我从未这样做过)。我认为这可能提供一种方法的原因是它tc提供了超越协议逻辑的过滤器。您可以简单地查看数据包中的某些字节。因此,也许传入数据包的 ethertype 字段可以通过这种方式访问​​。

下一个问题:流量整形不是为了过滤数据包而是为了重新排序数据包。但也许它的某些功能可能会被滥用,导致丢弃某些​​数据包/帧。

答案3

我尝试了同样的事情但也无法让它工作,尽管我认为 -p 选项应该可以工作(但也许我误读了手册页)。

然而,对我而言,有效的是明确指定允许的以太网类型,并简单地删除其他所有内容:

# ebtables -A INPUT -s XX:XX:XX:XX:XX:XX -p ip4 -j ACCEPT
# ebtables -A INPUT -s XX:XX:XX:XX:XX:XX -p ip6 -j ACCEPT
# ebtables -A INPUT -s XX:XX:XX:XX:XX:XX -p ARP -j ACCEPT
# ebtables -A INPUT -s XX:XX:XX:XX:XX:XX -j DROP

如果您使用其他以太网协议,您可能也需要添加这些协议,例如,也许 802_1Q 用于 VLAN 标记流量。

相关内容