该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
答案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