Linux 防火墙对 IPv6 的支持与配置要点
一、前置检查与启用
cat /proc/net/if_inet6 或 ip addr 查看是否存在 inet6 地址;如无,需在网卡配置中开启 IPv6 并重启网络。ping6 ipv6.google.com 验证外部 IPv6 可达。二、按工具的配置方法
systemctl start firewalld && systemctl enable firewalld。firewall-cmd --permanent --add-family=ipv6 并 firewall-cmd --reload(取决于版本与配置,部分环境默认已启用双栈)。firewall-cmd --permanent --add-port=80/tcp、--add-port=443/tcp;或按需开启 dhcpv6-client、ssh 等服务。firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="2001:db8::/32" accept'。firewall-cmd --list-all 与 firewall-cmd --list-all --zone=public。ufw enable、ufw allow 80,443/tcp;UFW 同时管理 IPv4/IPv6,规则写法与 IPv4 一致。ip6tables -A INPUT -p tcp --dport 80 -j ACCEPTip6tables -A INPUT -p tcp --dport 443 -j ACCEPTip6tables -A INPUT -s 2001:db8::/32 -j ACCEPTip6tables -L -n -v、service ip6tables save(发行版不同,保存方式可能为 iptables-save/ip6tables-save 写入规则文件)。nft add table inet filternft add chain inet filter input { type filter hook input priority 0; }nft add rule inet filter input tcp dport {80,443} acceptnft add rule inet filter input icmp type echo-request acceptnft list > /etc/nftables.conf 并启用服务持久化。三、IPv6 必需放行与安全要点
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPTip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPTip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPTip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPTip6tables -A INPUT -p icmpv6 --icmpv6-type parameter-problem -j ACCEPTip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPTip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPTip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPTip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPTLOG 再 DROP 便于排障。四、路由转发与端口转发的 IPv6 配置
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding/etc/sysctl.conf 设置 net.ipv6.conf.all.forwarding=1 并执行 sysctl -p。firewall-cmd --permanent --add-rich-rule='rule family=ipv6 masquerade'firewall-cmd --permanent --add-rich-rule='rule family="ipv6" forward-port port="5999" protocol="tcp" to-port="60000" to-addr="2702:a7c0:8180"'firewall-cmd --permanent --add-rich-rule='rule family="ipv6" forward-port port="5999" protocol="udp" to-port="60000" to-addr="2702:a7c0:8180"'firewall-cmd --reload。五、验证与常见问题
ping6 ipv6.google.comhttp://[你的IPv6地址]/,或使用在线 IPv6 测试工具。firewall-cmd --list-all(必要时加 --zone=public)ip6tables -L -n -vnft list rulesetnet.ipv6.conf.all.forwarding=1 或未配置 masquerade。