该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
协议只是一个数字:
这些数字共享相同的“命名空间”: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 规则,每个规则都有其正确的上层协议。