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 但打不开网站 | 防火墙拦了 ICMPv6 转发 |
| 只有部分设备有 IPv6 | RA 配置问题或客户端屏蔽 |
| 前缀经常变化 | 运营商下发生存时间短,配合 DDNS |
| 旁路由下 IPv6 不通 | 未用中继方式接管前缀 |
前缀变化是家庭 IPv6 的常态,运营商一般几小时到几天换一次。如果你的服务依赖固定地址访问,必须搭配 DDNS 的 IPv6 模式使用,单独记 IP 是行不通的。前缀变化的另一个副作用是防火墙里的设备地址规则会失效,所以规则不要写死地址,而是用 hex 前缀通配或 DDNS 关联,这部分写法见《防火墙进阶与端口转发》。
再给一个完整上线后的自查清单:设备拿到的地址是否属于运营商下发前缀、ping 公网 IPv6 是否通、IPv4 和 IPv6 双栈对比延迟差别大不大、防火墙默认对入站 IPv6 的策略是什么。四项都清了,你的 IPv6 基建才算真正扎实,后面 DDNS、远程访问这些上层应用才有可靠的地基。

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