1. NAT66 是什么
NAT66 也常被称为 NAT6 或 IPv6 Masquerading,作用是把内网 IPv6 地址转换成路由器上游接口的 IPv6 地址再访问外网。它和 IPv4 NAT 的思路相似,但在 IPv6 网络里,优先方案通常不是 NAT,而是让运营商下发可路由前缀,再把前缀分配给 LAN 侧客户端。
因此,能不用 NAT66 时尽量不用。更推荐的方案是:
- 运营商能下发足够的 IPv6 Prefix Delegation 时,直接使用前缀委派。
- 上级只给一个
/64前缀时,优先考虑 OpenWrt 的 IPv6 relay 模式。 - 只有在前缀不足、没有前缀委派、动态前缀导致内网地址不稳定,或者需要多上游但没有 BGP 等场景下,再考虑 NAT66。

2. 适用场景
NAT66 常见于下面几类环境:
- 上游只有单个 IPv6 地址,或者没有给 LAN 侧可用的 GUA 前缀。
- 上游只给很小的前缀,无法继续给多个子网做标准 IPv6 地址规划。
- ISP 前缀经常变化,但希望内网客户端使用稳定地址。
- 需要临时把 ULA 内网接入 IPv6 Internet。
- 多 WAN IPv6 场景下,需要在没有 BGP 的情况下做地址转换。
这里的典型模型是:
LAN 客户端 fdxx:xxxx:xxxx::/64
|
| SLAAC / DHCPv6
v
OpenWrt 路由器
|
| NAT66 / IPv6 masquerading
v
上游 IPv6 网络 / ISP

3. 前置条件
开始前确认以下条件已经满足:
- OpenWrt 路由器自身已经能通过
wan6或其他上游 IPv6 接口访问 IPv6 网络。 - LAN 侧已有 ULA 前缀,例如
fdxx:xxxx:xxxx::/48,客户端能拿到 IPv6 地址。 - LAN 侧的 SLAAC / DHCPv6 工作正常。
- 你能通过 SSH 登录 OpenWrt,或者在 LuCI 的终端中执行命令。
- 默认防火墙区域仍是常见结构:
lan为内网 zone,wan为上游 zone。
可以先在 OpenWrt 上检查基础状态:
ifstatus wan6
uci get network.globals.ula_prefix
ip -6 address show
ip -6 route show
如果 wan6 没有 IPv6 地址或默认路由,NAT66 配好以后也无法正常出站。
4. 启用 WAN 区域的 IPv6 Masquerading
官方示例假设默认防火墙配置中 @zone[1] 是 wan 区域。大多数 OpenWrt 默认配置都是这样,但修改过防火墙的设备建议先确认:
uci show firewall.@zone[1].name
如果输出是:
firewall.cfgXXXXXX.name='wan'
就可以启用 IPv6 masquerading:
uci set firewall.@zone[1].masq6="1"
uci commit firewall
service firewall restart
如果你的 WAN 区域不是 @zone[1],请把命令里的 @zone[1] 改成实际的 zone 索引。
5. 关闭上游接口的 IPv6 Source Filter
NAT66 会让 LAN 侧 ULA 地址通过上游接口出站。OpenWrt 的 IPv6 源地址过滤可能会拦截这类流量,所以需要在上游 IPv6 接口关闭 sourcefilter。
如果你的上游接口叫 wan6,执行:
uci set network.wan6.sourcefilter="0"
uci commit network
service network restart
如果你的接口名不是 wan6,例如 vps6、wwan6 或某个隧道接口,请把 network.wan6 替换成实际接口名。
6. 必要时向 LAN 宣告 IPv6 默认路由
当 LAN 客户端只拿到 ULA 地址时,OpenWrt 可能不会默认告诉客户端“我可以作为 IPv6 默认网关”。如果客户端有 IPv6 地址但没有默认路由,可以开启 LAN 侧 RA 默认路由通告:
uci set dhcp.lan.ra_default="1"
uci commit dhcp
service odhcpd restart
配置后,客户端可以重新连接网络,或手动刷新 IPv6 地址与路由。
7. 客户端仍优先走 IPv4 时的处理
部分操作系统看到自己只有 ULA 源地址时,会按地址选择策略优先使用 IPv4,即使 DNS 已经返回 AAAA 记录。OpenWrt 官方 IPv6 extras 文档给出过一个让客户端更倾向 IPv6 的办法:把本机 ULA 前缀改成未分配的 IPv6 前缀段。
这个做法不属于标准 IPv6 地址规划,建议只在明确知道影响后再用:
NET_ULA="$(uci get network.globals.ula_prefix)"
uci set network.globals.ula_prefix="d${NET_ULA:1}"
uci commit network
service network restart
更稳妥的做法是:先确认业务是否真的需要客户端优先走 IPv6。如果只是为了“IPv6 可用”,通常不需要调整这个前缀。
8. 验证配置
在 OpenWrt 路由器上测试:
ping -6 openwrt.org
ip -6 route show table all
nft list ruleset | grep -i masq
在 LAN 客户端上测试:
ping -6 2606:4700:4700::1111
nslookup openwrt.org
也可以访问支持 IPv6 检测的网站,确认客户端是否已经具备 IPv6 出站能力。
9. 排错命令
如果 NAT66 不生效,建议按下面顺序收集信息:
service firewall restart
ip -6 address show
ip -6 route show table all
ip -6 rule show
nft list ruleset
uci show network
uci show firewall
uci show dhcp

重点检查:
wan6是否有可用的 IPv6 地址和默认路由。firewall.@zone[x].masq6是否确实配置在上游wanzone 上。network.wan6.sourcefilter是否已经是0。- LAN 客户端是否拿到了 IPv6 地址。
- LAN 客户端是否有指向 OpenWrt 的 IPv6 默认路由。
- DNS 是否能返回 AAAA 记录。
- 防火墙是否允许 LAN 到 WAN 的转发。

10. 常见问题
NAT66 会不会替代防火墙?
不会。NAT66 只是地址转换,不能替代防火墙策略。OpenWrt 默认 WAN 入站是拒绝的,LAN 到 WAN 是允许的。需要开放 IPv6 入站服务时,应单独配置防火墙规则或端口转发。
有公网 IPv6 前缀时还需要 NAT66 吗?
通常不需要。IPv6 的推荐做法是给 LAN 客户端分配可路由地址,再通过防火墙控制访问权限。NAT66 主要是前缀不足或前缀不可控时的折中方案。
上级只给 /64 怎么办?
优先尝试 IPv6 relay 模式,让 OpenWrt 把上级网络的 IPv6 通告转发到 LAN 侧。只有 relay 不适合你的拓扑时,再考虑 NAT66。
老教程里的 kmod-ipt-nat6 和自定义脚本还需要吗?
新版本 OpenWrt 使用 fw4/nftables,官方 NAT 示例已经可以通过 masq6 直接启用 IPv6 masquerading。除非你维护的是很老的 OpenWrt 版本,否则不建议照搬旧式 iptables NAT6 脚本。
11. 一键配置示例
如果你的设备使用默认接口名和默认防火墙 zone 顺序,可以直接执行下面命令:
uci set firewall.@zone[1].masq6="1"
uci commit firewall
service firewall restart
uci set network.wan6.sourcefilter="0"
uci commit network
service network restart
uci set dhcp.lan.ra_default="1"
uci commit dhcp
service odhcpd restart
执行前请确认:
uci show firewall.@zone[1].name
只有当 @zone[1] 是 wan 时,才建议直接使用上面的一键配置。






