Linux

我們如何訪問 ip6tables 中的“icmp”協議?

  • September 23, 2022

ip6tables命令接受icmpicmpv6協議:

$ 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

引用自:https://unix.stackexchange.com/questions/718360