IPv6 透传与内网访问

国内家庭宽带如今普遍下发 IPv6 公网地址,但很多 OpenWrt 用户对 IPv6 的态度是又爱又怕:不开吧,部分服务和应用访问受限;开吧,配置不对就容易遇到只有 IPv4 能用、IPv6 时通时断的尴尬。本篇把 IPv6 的地址分配机制、OpenWrt 上的三种部署形态和内网访问配置讲清楚。

先理解 IPv6 的分配方式

IPv6 与 IPv4 最大的不同是地址充足,设备直接拿到公网地址,不再依赖 NAT 转换。家庭场景下,运营商通过 WAN 口下发一个 60 位或 56 位的前缀(PD,Prefix Delegation),主路由再把这个前缀切分给内网,每个设备自动获得全球唯一地址,这就是 SLAAC(无状态地址自动配置)。另外还有 DHCPv6 有状态分配和最后一种 NDP 代理模式,各自适用场景不同。

分配方式 地址来源 特点
SLAAC 路由器通告(RA) 最常用,设备自动配
DHCPv6 有状态 DHCPv6 服务器 可控但兼容性差
NDP 代理/中继 代理邻居发现 用于旁路由等复杂拓扑
ULA 本地地址 f 开头保留段 内网通信,不可上外网

关键认知:IPv6 时代 NAT66 仍然存在,但不是默认选项。透传模式最简单——主路由只负责转发 IPv6 流量,内网设备直连外网,彼此地址互通,调试也比想象中容易。与此同时,IPv6 也让端到端连接重新变得可行:以前IPv4 时代靠端口转发才能从外面访问家里 NAS,IPv6 下每台设备都有公网地址,内网访问的概念需要重新理解——它的重点不再是穿透 NAT,而是防火墙策略是否放行。这部分思路转变,在 家庭网络公网访问 一章里有对应的实践讲解。

先自查运营商是否真的下发了 IPv6,再折腾 OpenWrt 配置,能省下大量冤枉时间。一个简单的判断方法:光猫直连电脑拨号,看能否获取 IPv6 地址;电信和移动近年新装宽带默认开启,老旧光猫可能需要客服后台开启才有。确认前端支持之后,再进入 OpenWrt 的配置环节。

WAN 侧:获取前缀

OpenWrt 默认会创建一个 wan6 接口处理 IPv6 拨号。查看状态的命令是:

ifstatus wan6
ip -6 addr show

正常情况会看到 WAN 拿到一个公网 IPv6 地址,以及被委托下发的前缀(如 2408:xxxx::/60)。如果为空,依次检查:光猫是否开启了 IPv6 透传(桥接模式下需要运营商支持)、OpenWrt 的 wan6 接口协议是否为 DHCPv6、防火墙是否放行了 IPv6 的关键报文。

IPv6 依赖一系列 ICMPv6 报文工作——地址分配的 RA、邻居发现的 NS/NA、错误回报的不可达通知,防火墙必须放行这些包,否则 IPv6 半死不活。OpenWrt 默认规则集里 Allow-ICMPv6-Input 和 Allow-ICMPv6-Forward 两条规则就是干这个的,检查它们是否被误删或禁用。这些底层机制和 IPv6 基础 里的协议讲解互为表里,值得对照着看。

LAN 侧:下发与中继

拿到前缀后,下一步是下发给内网。最常见的是服务器模式:LAN 接口的 DHCP 设置里,路由器通告(Router Advertisement)选服务器模式,并设置 master 标记。odhcpd 服务负责在 LAN 上发 RA,让设备自动生成公网 IPv6 地址。

# 常用的 LAN 侧 IPv6 配置
uci set network.wan6.reqprefix='auto'
uci set network.wan6.delegate='1'
uci set dhcp.lan.ra='server'
uci set dhcp.lan.dhcpv6='server'
uci set dhcp.lan.ra_management='1'
uci set dhcp.lan.ra_flags='managed-config other-config'
uci commit
ifup wan6
/etc/init.d/odhcpd restart

改完之后重启 odhcpd 服务,用电脑就能看到自己拿到了 2408 开头的公网 IPv6 地址。如果此时 LAN 里还挂着旁路由,或者拓扑更复杂,就要改用 relay 中继模式:RA、DHCPv6、NDP 三个开关都设为 relay,上级接口设 master。中继模式下地址由更上层分配,适合不改变现有网络结构的场景。中继模式排障较难,非必要不首选。服务器模式返回错误时,先看 LAN 接口的 IPv6 设置里 master 标记是否带上,以及 odhcpd 服务是否正常运行。

验证内网 IPv6 是否真的通了,用这两条命令:

ping -6 2400:3200::1
ping -6 你的另一台设备IPv6地址

前一条验证外网连通性,后一条验证内网互通,能通说明整个链路工作正常。排查时注意 odhcpd 的日志信息量很大,logread 配合 grep odhcpd 过滤,通常能在里面直接看到 RA 报文发送失败的原因——八成是接口没正确关联或者权限问题,而不是什么玄学故障。

防火墙与内网访问

IPv6 设备拿到的是公网地址,意味着理论上外网可以直接访问它们——这既是 IPv6 的魅力,也是安全隐患。家庭网络里,你需要主动决定放行哪些入站流量。

最常见的做法分两类。一类是只放行 ICMPv6 基础报文(这是 IPv6 正常工作必需的),其余入站连接默认拒绝,家庭设备主动出网不受影响。另一类是给 NAS、智能家居中枢这类需要外部访问的设备配置精确的放行规则:指定源接口为 wan、目标地址为该设备的 IPv6(建议用动态 DNS 配合前缀通配,具体见《DDNS 动态域名》)、端口精确到具体服务。记住一条铁律:外网可达的每一台设备、每一个端口,都要有明确的理由,不知道用途的放行规则宁可不开。

顺带提醒一个 IPv4 时代没有的问题:IPv6 的邻居发现(NDP)报文也必须放行,否则设备之间无法建立通信。表现是地址都配好了、防火墙一个包都不拦,就是互相 ping 不通——拦它们的往往是默认规则集之外你自己加的严格规则。另外,很多网站的 IPv6 双栈策略是IPv6 优先,IPv6 配坏了反而拖慢整体上网速度,所以上线后务必双栈对比测速,不是配通就算完事。

临时排查工具

调 IPv6 时手头要备好三个命令行工具,都不需要额外安装。ip -6 addr 看地址分配结果,确认每台设备是否拿到预期前缀;ip -6 route 看路由表,默认路由和前缀路由是否正确生成;ping -6 分别测内网设备和公网 IPv6 地址,分段定位断点位置。Windows 客户端对应的是 ipconfig 和 ping -6,macOS 是 ifconfig 和 ping6。

一个高频疑问值得单独回答:为什么有的 App 在 IPv6 下反而打不开?多半是该应用的服务端没做好 IPv6 支持,或者客户端的 Happy Eyeballs 机制(IPv6 和 IPv4 并发连接取快的那个)在你 DNS 配置干扰下行为异常。逐 App 排查太费劲,简单的判断方法是禁用客户端 IPv6 再试,恢复就说明问题在这。关于 DNS 在 IPv6 体系里的配合角色,企业级 DNS 实践 有更完整的讨论。

IPv6 地址分配层级

IPv6 前缀下发链路

常见症状速查

症状 可能原因
设备拿到 IPv6 但打不开网站 防火墙拦了 ICMPv6 转发
只有部分设备有 IPv6 RA 配置问题或客户端屏蔽
前缀经常变化 运营商下发生存时间短,配合 DDNS
旁路由下 IPv6 不通 未用中继方式接管前缀

前缀变化是家庭 IPv6 的常态,运营商一般几小时到几天换一次。如果你的服务依赖固定地址访问,必须搭配 DDNS 的 IPv6 模式使用,单独记 IP 是行不通的。前缀变化的另一个副作用是防火墙里的设备地址规则会失效,所以规则不要写死地址,而是用 hex 前缀通配或 DDNS 关联,这部分写法见《防火墙进阶与端口转发》。

再给一个完整上线后的自查清单:设备拿到的地址是否属于运营商下发前缀、ping 公网 IPv6 是否通、IPv4 和 IPv6 双栈对比延迟差别大不大、防火墙默认对入站 IPv6 的策略是什么。四项都清了,你的 IPv6 基建才算真正扎实,后面 DDNS、远程访问这些上层应用才有可靠的地基。

IPv6 两种部署思路;透传模式简单直接;中继模式适配复杂拓扑

延伸阅读

  • 《DDNS 动态域名》:IPv6 前缀变化场景下的固定访问入口方案。
  • 《防火墙进阶与端口转发》:IPv6 环境下的放行规则写法。
  • 《旁路由:网关与 DNS 分流配置》:IPv6 与旁路由结合的进阶玩法。