我们如何访问 ip6tables 中的“icmp”协议?

我们如何访问 ip6tables 中的“icmp”协议?

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

答案1

协议只是一个数字:

$ 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(又名 ipv6-icmp)类型的 IPv4 数据包(值 58)。也许某些环境使用NAT64可能会完全泄漏此类数据包(基于 IPv6 的 ICMP 或基于 IPv4 的 ICMPv6)。

同时ip6表仅处理 IPv6:它不会过滤所有 IPv4 类型的数据包,同样的方式iptables仅处理 IPv4,不会过滤 IPv6 类型的数据包。

因此,过滤(或此处计数)两者的正确方法是拥有一条 IPv4 规则和一条 IPv6 规则,每个规则都有其正确的上层协议。

sudo iptables -A INPUT -p icmp -j ACCEPT
sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT

相关内容