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 标记流量。