Linux ip6tables 学习

起因

自前几天改造了自己的光猫后,无意中发现为了访问,配的防火墙给的允许范围很大,这样的风险较高。经分析,只要允许ping及WireGuard的UDP流量通过即可满足我当前所有需求。于是将ip6tables -A FORWARD_CUSTOM-j ACCEPT修改为了具体协议支持ip6tables -A FORWARD_CUSTOM -p icmpv6 --icmpv6-type echo-request -j ACCEPTip6tables -A FORWARD_CUSTOM -p udp --dport 10000 -j ACCEPT。但是前期因为忘记配置的是IPv6的防火墙,所以将ICMPv6协议写成了ICMP协议,可意外该命令被成功执行了。虽然因为协议错误导致没有达到放行目的,但是该错误却引起了我的好奇。为什么在IPv6的防火墙中,ICMP协议可以被成功执行?IPv6上运行的是ICMPv6协议,如果配置ICMP协议应该会被参数校验的时候校验出来的吧?

分析

经过一番查找,发现网上并没有相关问题的直接回答,通过问文心一言Gemini等,也得不到什么有用的信息。无奈,只能去翻了下iptables的源码,发现针对协议-p这一参数的处理,IPv4和IPv6的处理是基本相同的,都是基于同一份协议列表。接着又去看了下IPv4和IPv6的协议定义,其中说明IPv4中的协议(Protocol)字段、IPv6中的下一报头(Next Header)字段(在无后续扩展头时)指明了IP报文所承载的协议,二者定义的协议域值相同,即可承载同样的协议。

结论

IPv4和IPv6的IP报文理论上可以承载协议规定的各种协议,即IPv4的IP报文承载ICMPv6协议或IPv6的IP报文承载ICMP协议,尽管这样做在大多数情况下没有什么意义,对应的包常规情况下也会被操作系统在进一步处理时所丢弃。所以基于这一点,防火墙的规则配置上,只要协议正确,就可以放行,即会出现我在起因一节中出现的奇怪现象。

参考