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.
有沒有辦法阻止無效的乙太類型?
似乎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 OS Buster的 Raspberry Pi 上,我只是這樣做:
rpi ~$ sudo apt install nftables
/etc/nftables.conf
現在可用,我在規則中附加了正確的介面名稱,而不是範例中的eno1。rpi ~$ sudo systemctl start nftables.service
並且 tcpdump 告訴我,沒有更多未知的 EtherType 數據包。