Linux防火墙如何支持IPv6
导读:Linux 防火墙对 IPv6 的支持与配置要点 一、前置检查与启用 确认内核与网卡已启用 IPv6:执行 cat /proc/net/if_inet6 或 ip addr 查看是否存在 inet6 地址;如无,需在网卡配置中开启 IPv...
Linux 防火墙对 IPv6 的支持与配置要点
一、前置检查与启用
- 确认内核与网卡已启用 IPv6:执行
cat /proc/net/if_inet6或ip addr查看是否存在 inet6 地址;如无,需在网卡配置中开启 IPv6 并重启网络。 - 测试连通性:使用
ping6 ipv6.google.com验证外部 IPv6 可达。 - 防火墙框架选型:主流有 firewalld(CentOS/RHEL/Fedora)、ufw(Ubuntu/Debian)、以及底层的 iptables/ip6tables 与新一代 nftables。IPv6 规则需使用对应 IPv6 工具(如 ip6tables、nftables 的 inet 家族)或在 firewalld 中显式指定 family=ipv6。
二、按工具的配置方法
- firewalld(CentOS/RHEL/Fedora)
- 启动服务:
systemctl start firewalld & & systemctl enable firewalld。 - 放行 IPv6 管理:可添加
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(Ubuntu/Debian)
- 启用与端口:
ufw enable、ufw allow 80,443/tcp;UFW 同时管理 IPv4/IPv6,规则写法与 IPv4 一致。
- 启用与端口:
- ip6tables(传统方式)
- 基本放行示例:
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPTip6tables -A INPUT -p tcp --dport 443 -j ACCEPTip6tables -A INPUT -s 2001:db8::/32 -j ACCEPT
- 查看与持久化:
ip6tables -L -n -v、service ip6tables save(发行版不同,保存方式可能为iptables-save/ip6tables-save写入规则文件)。
- 基本放行示例:
- nftables(新一代)
- 示例(inet 家族同时覆盖 v4/v6):
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并启用服务持久化。
- 示例(inet 家族同时覆盖 v4/v6):
三、IPv6 必需放行与安全要点
- 必须放行的 ICMPv6 类型(保证邻居发现、路径 MTU、自动配置等正常工作):
- echo-request/echo-reply(ping)
- destination-unreachable、packet-too-big、time-exceeded、parameter-problem(差错与分片)
- router-solicitation、router-advertisement(路由通告/请求)
- neighbour-solicitation、neighbour-advertisement(邻居请求/通告)
- 建议对 link-local(fe80::/10) 的相应报文放行(RS/RA/NS/NA 等)。
- 示例(ip6tables):
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 ACCEPT
- 安全建议:默认策略可设为 DROP,仅对明确放行的服务与必要 ICMPv6 开放;对丢弃报文可先
LOG再DROP便于排障。
四、路由转发与端口转发的 IPv6 配置
- 启用内核转发:
- 临时:
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding - 永久:在
/etc/sysctl.conf设置net.ipv6.conf.all.forwarding=1并执行sysctl -p。
- 临时:
- firewalld 做 NAT 伪装(masquerade)与端口转发(示例将 [2001:db8::1]:5999 转发到 [2702:a7c0:8180]:60000):
- 伪装:
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.com - 外部:在支持 IPv6 的网络访问
http://[你的IPv6地址]/,或使用在线 IPv6 测试工具。
- 本机:
- 规则核对:
- firewalld:
firewall-cmd --list-all(必要时加--zone=public) - ip6tables:
ip6tables -L -n -v - nftables:
nft list ruleset
- firewalld:
- 常见问题:
- 未放行必要 ICMPv6 导致 ping、邻居发现、地址自动配置异常。
- 做 IPv6 转发/NAT 却未开启
net.ipv6.conf.all.forwarding=1或未配置 masquerade。 - 云厂商侧未分配 IPv6 地址/路由或未在安全组放行对应端口。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux防火墙如何支持IPv6
本文地址: https://pptw.com/jishu/773230.html
