Linux
我們如何訪問 ip6tables 中的“icmp”協議?
該
ip6tables
命令接受icmp
和icmpv6
協議:$ sudo ip6tables -A INPUT -p icmp -j ACCEPT $ sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
但是,當我使用
ping
命令進行測試時:$ ping6 fe80::a00:1234:1234:1234%eth1
我從來沒有
icmp
違反規則:Chain INPUT (policy ACCEPT 133 packets, 13501 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT icmp * * ::/0 ::/0 112 11488 ACCEPT icmpv6 * * ::/0 ::/0
如果無法達到協議,為什麼
icmp
協議會被接受?ip6tables
協議只是一個數字:
$ grep icmp /etc/protocols icmp 1 ICMP # internet control message protocol ipv6-icmp 58 IPv6-ICMP # ICMP for IPv6
這些數字共享相同的“命名空間”:Internet Procol,一些協議很常見,例如:UDP (17)、TCP (6)、SCTP (132),但其他的則不是,尤其是在 IPv4 和 IPv6 之間的差異很重要時。ICMP 就是這種情況:兩種不同的協議。
在正常環境設置中,永遠不會在其上層協議標頭中包含帶有 ICMP(值 1)的 IPv6 數據包。同樣,在 IPv4 上,永遠不應該有 ICMPv6 類型的 IPv4 數據包(又名 ipv6-icmp)(值 58)。也許某些使用NAT64的環境可能會不完美地洩漏此類數據包(ICMP over IPv6 或 ICMPv6 over IPv4)。
同時ip6tables只處理 IPv6:它不會過濾所有 IPv4 類型的數據包,就像iptables只處理 IPv4 並且不會過濾 IPv6 類型的數據包一樣。
因此,過濾(或計算)兩者的正確方法是擁有一個 IPv4 規則和一個 IPv6 規則,每個規則都有其正確的上層協議。
sudo iptables -A INPUT -p icmp -j ACCEPT sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT