IPv6仅用服务器上ip6tables ACCEPT规则不生效问题求助
IPv6仅用服务器上ip6tables ACCEPT规则不生效问题求助
嗨,我来帮你捋捋这个问题——你遇到的其实是IPv6防火墙里很容易踩的一个坑,和IPv4的逻辑不太一样哦。
先看你的规则,表面上顺序没问题:先放行了回环接口,接着允许已建立/相关的连接,然后开放了http、https和ssh,最后DROP所有剩余包。但问题出在IPv6对ICMPv6协议的依赖程度远高于IPv4对ICMP的依赖,很多关键的网络操作(比如邻居发现、路径MTU探测、地址自动配置)都得靠ICMPv6包才能正常运行,你最后那条DROP规则把这些必要的ICMPv6包也给拦截了,导致哪怕你开放了TCP端口,连接也没法正常建立起来。
给你两个关键的修复方向:
1. 必须放行必要的ICMPv6报文
在你那条DROP规则之前,添加放行关键ICMPv6类型的规则,比如:
# 放行IPv6邻居发现相关报文(链路层必备,不能少) ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT # 放行连接过程中必需的ICMPv6错误报文 ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
这些规则能保证IPv6的基础网络交互正常,不会因为缺少ICMPv6包导致连接失败。
2. 优化你的SSH规则(可选,但更规范)
你当前的SSH规则里写了ctstate NEW,ESTABLISHED,但其实第二条规则已经放行所有RELATED,ESTABLISHED状态的包了,所以SSH规则只需要处理NEW连接就行,简化后是:
ip6tables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j ACCEPT
把上述ICMPv6规则加到你的第5条(SSH规则)和第6条(DROP规则)之间,再测试下,应该就能正常访问web服务和SSH登录了。
备注:内容来源于stack exchange,提问作者Bad_Panda




