OpenWrt 关闭 IPv6:先想清楚要不要关,再按层级关干净
网上不少教程把「关掉 IPv6」写成装完 OpenWrt 的默认动作,仿佛不开双栈就亏了。实际上对绝大多数家庭网络来说,IPv4 与 IPv6 双栈并行才是常态,路由器出厂默认开启也是这个道理。真正值得动手关闭的,是下面几种能明确认定问题出在 IPv6 身上的场景。先对号入座,再决定要不要往下做;如果只是听说关了能「提速」,这篇文章更建议你先跳到验证一节,量一下自己的网络到底有没有 IPv6 相关的问题。
什么情况下关,什么情况下别关
关了有实际收益的场景:
- 代理流量被 IPv6 绕过去。 这是最常见、也最正当的理由。旁路由或网关上跑了分流代理,只处理了 IPv4 流量,终端却优先用 IPv6 直连出去,结果该走代理的流量全部裸奔,表现为解锁失效、区域判断错误,甚至在你以为受保护时暴露真实出口。分流规则只覆盖一栈,另一栈就是缺口。
- 双栈分流行为不一致。 同一域名,A 记录走代理、AAAA 记录走直连,应用自己挑哪个用哪个,故障现象飘忽不定,今天正常明天抽风,排查成本极高。先关掉一栈把变量减半,是合理的排障手段。
- 运营商 IPv6 质量确实差。 有的地区 IPv6 前缀下发不稳定、隔几天变一次,或者 v6 线路绕路严重,终端又偏偏优先选 v6,于是出现间歇性卡顿、部分网站打开一半。这种锅在运营商一侧,本地能做的止损就是暂时回到纯 IPv4。
- 隔离变量做诊断。 怀疑某个问题与 IPv6 有关时,临时关闭来对照,是标准的排除法。前提是关之前留好备份,测完能原样恢复。
不该关、或者关了也没用的场景:
- 网络一切正常,只是想「优化」。双栈的额外开销在现代路由器上小到可以忽略,为了想象中的性能去动协议栈,收益约等于零,还平白丢掉 IPv6-only 资源的可达性。
- 你需要访问纯 IPv6 的服务或设备,比如某些校园网、科研网资源,或者家里有依赖 IPv6 的物联网设备。
- 问题其实不在路由器这一层。比如客户端的地址是光猫下发的,你在 OpenWrt 上关得再干净也没用,该先处理的是上级设备或改桥接。
动手前,先确认问题真出在 IPv6 上
关 IPv6 是手段不是目的,误诊的代价是问题没解决、双栈倒丢了。花五分钟做三个对照测试,能确认大半:第一,在出问题的终端上临时禁用 IPv6(系统网络设置里关掉即可),故障消失再恢复后又出现,基本可以锁定;第二,同一台终端,分别用 IPv4 与 IPv6 去 ping 同一个双栈站点的两个地址,对比延迟与丢包,哪一栈明显更差一目了然;第三,如果是代理场景,直接查代理服务端的连接日志,看问题连接的出口地址是 v4 还是 v6,泄露路径往往当场现形。三个测试都指向 IPv6,再往下走;若结果互相矛盾,先按普通网络故障排查,别急着动协议栈。
结论先行:关闭 IPv6 是一种特定场景下的取舍,不是普适优化。下面按层级给出完整操作,每一层都说清它管什么、漏掉会怎样,方便你只关自己需要的那几层。
先分清四个层级:IPv6 是从哪几条路进来的
很多人「关了又没关干净」,根源是把 IPv6 当成一个总开关,其实它至少从四条路径进入你的网络,互不隶属:
| 层级 | 管什么 | 关不干净的表现 |
|---|---|---|
| WAN 获取层 | 路由器自己向运营商要不要 IPv6 地址和前缀(DHCPv6 客户端、wan6 接口) | 路由器自身还有公网 v6 地址,上游照样能进来 |
| LAN 分发层 | 路由器给内网设备发地址和路由(RA 通告、DHCPv6 服务、NDP) | 终端仍能拿到 v6 地址并自行出网 |
| DNS 层 | 解析时返不返回 AAAA 记录 | 地址没了,但应用仍在尝试 v6、连接前先超时一轮 |
| 内核层 | 系统协议栈本身启不启用 IPv6 | 最彻底的一层,前三层没处理干净时兜底 |
四层的关系是:WAN 层决定「有没有货进来」,LAN 层决定「分不分给终端」,DNS 层决定「终端知不知道有这条路」,内核层是总闸。想实现代理不泄露,关键在 LAN 层加 DNS 层;想彻底纯 IPv4 运行,四层都要处理。下面主线两个层级都覆盖到,并标注每步属于哪一层。
另外两个容易被单独遗漏的点:ULA 前缀是路由器给内网预留的本地 v6 地址段,清掉它内网才不会再冒出 fd00:: 开头的地址;防火墙里的 IPv6 规则在协议栈关闭后其实已无流量可管,逐条禁用属于洁癖而非必需,本文只在最后提一句,不列为必做项。
四层不必总是全关,按你的场景对照着选,改动越小越好恢复:
| 你的场景 | 关哪几层 | 说明 |
|---|---|---|
| 只防代理泄露 | LAN 分发层 + DNS 层 | 终端拿不到 v6、解析不到 AAAA,流量自然全走 v4 代理;路由器自身保留 v6 不影响内网 |
| 分流规则打架、先减半变量排障 | LAN 分发层 + DNS 层 | 同上,查清问题后再决定恢复还是长期保持 |
| 运营商 v6 线路质量差 | WAN 获取层 + LAN 分发层 | 源头不再引入劣质 v6,DNS 层可留着,省得日后恢复时多改一处 |
| 要纯 IPv4 环境做测试 | 四层全关 | 内核层兜底,验证标准也最严,测完按恢复步骤整包还原 |
拿不准就从改动最小的组合开始,验证有效再考虑要不要扩大范围;一上来四层全关,出了问题反而说不清是哪一层的事。
操作前检查清单
动手前花两分钟过一遍,能避免绝大多数「关完断网来求救」:
操作主线
路线一:Web 界面(适合只关分发、不碰内核)
如果你的目的只是让内网终端不再拿到 IPv6(防泄露场景最常用),界面操作处理 WAN 与 LAN 两层就够了:
- 网络 → 接口,删除 wan6 接口。这是 WAN 获取层:删掉后路由器不再向运营商请求 v6 地址与前缀委派。
- 编辑 WAN 接口,在高级设置里把 IPv6 分配长度 设为禁用、取消勾选 使用内置的 IPv6 管理。
- 编辑 LAN 接口,进入 DHCP 服务器 → IPv6 设置,把 RA 服务、DHCPv6 服务、NDP 代理 三项全部设为已禁用。这是 LAN 分发层,三项分别管路由通告、地址分配和邻居发现代理,缺关一项,终端都可能从另一条路拿到地址。
- 同一页面的高级设置里,同样禁用 IPv6 分配长度 并取消 使用内置的 IPv6 管理,保存。
- 回到 网络 → 接口,点顶部的 全局网络选项,清空 IPv6 ULA 前缀,保存并应用。这一步最常被漏掉,漏掉的结果是内网设备继续领到
fd00::开头的本地地址,看上去像没关干净。
- 防火墙里的 IPv6 规则可关可不关:协议栈和分发都停了之后,这些规则已经没有对应的流量。追求整洁可以到 网络 → 防火墙 → 通信规则 把带 IPv6 字样的规则停用,但别误删 IPv4 规则。
部分衍生固件在 网络 → DHCP/DNS → 高级设置 里提供 禁止解析 IPv6 DNS 记录 的勾选项,有就勾上,相当于把 DNS 层一并处理;原版 OpenWrt 没有这个图形选项,用下一节的一条命令代替。

路线二:命令行(四层一次处理完)
熟悉 SSH 的话,命令行更稳妥,因为每条命令落在哪一层一目了然。先 ssh root@192.168.1.1 登录,然后按层执行。
第一层,停掉分发服务。 odhcpd 是 OpenWrt 里同时负责 DHCPv6 与 RA 的守护进程,停掉它,LAN 分发层即刻失效:
/etc/init.d/odhcpd disable # 取消开机自启,重启后不复活
/etc/init.d/odhcpd stop # 立即停止第二层,清掉 ULA 前缀并停用 wan6。
uci delete network.globals.ula_prefix
uci set network.wan6.disabled='1'
uci commit network
/etc/init.d/network restart第三层,DNS 只回 IPv4。 给 dnsmasq 打开 AAAA 过滤后,终端解析域名只拿 A 记录,不再自己去尝试 v6 连接,这对「分流不一致」场景是关键一步:
uci set dhcp.@dnsmasq[0].filter_aaaa='1'
uci commit dhcp
/etc/init.d/dnsmasq restart第四层,内核总闸(可选,想彻底纯 IPv4 再做)。
cat >> /etc/sysctl.conf <<'EOF'
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF
sysctl -p /etc/sysctl.confall 管现有接口,default 管之后新建的接口,两个都写才不会在接口重建后漏网。注意不同固件对 sysctl 配置文件的持久化处理略有差异,以你的 OpenWrt 版本界面与文档为准;执行后用下一节的方法验证,没生效就优先怀疑这一层没被正确加载。
做完建议 reboot 一次,让所有守护进程按新配置冷启动,顺带验证重启后状态不回退。
关完怎么验证:这份清单逐项打勾
「界面上都设成禁用了」不等于终端真的没在用 IPv6。下面五项逐项确认,全过才算关干净:
只关一半:按接口区别对待
全屋一刀切并非唯一选项。OpenWrt 的 RA 与 DHCPv6 是按接口配置的,完全可以只关问题最集中的那一段:比如主网络保持双栈不动,只在给电视盒子、游戏机用的访客网络或某个独立 VLAN 里停掉分发,既止住了泄露又不影响其余设备用 v6;反过来,实验室性质的网段需要纯 v4 做对照测试,也可以只关那一段。做法就是在对应接口的 IPv6 设置里把 RA 与 DHCPv6 设为禁用,其余接口原样保留,ULA 与内核层都不要动。需要注意的是 DNS 层是全局的,filter_aaaa 一开全网生效,想按接口区别对待就别碰这一项,靠各接口的分发开关来控制即可。分段处理的好处是回滚半径小,坏处是配置心智负担更大,家里网段超过三个时,建议在笔记里记清每个网段的当前状态,免得半年后自己都对不上账。
副作用与恢复
先把丑话说在前面:关掉 IPv6 后,纯 v6 的站点和服务直接不可达;少数双栈站点的解析要等 AAAA 过滤生效才恢复利落,个别客户端缓存旧地址,重启网络或清一次 DNS 缓存即可。另外这一步并不带来可感知的性能变化,如果关完发现网速「明显变快」,多半是顺带修好了别的配置,或者只是心理作用,别把结论写成经验传播。
还有几笔账要提前算清。一是远程访问:如果你在用 DDNS 加 IPv6 直连回家里的 NAS 或软路由本身,关掉等于亲手拆了这条路,得先确认有 IPv4 公网地址加端口转发、或内网穿透这类替代通道可用。二是游戏与 P2P:部分主机游戏和下载工具在 IPv6 下的 NAT 类型更友好,关掉后可能退回严格 NAT,联机组队受影响时别往路由器性能上怀疑,先想起这一层。三是手机与物联网设备:少数设备对「Wi-Fi 有 v4 没 v6」无感,少数老设备会反复尝试 v6 而更费电,关后头几天留意一下待机异常的设备。四是前缀相关的自动化脚本:凡是写死了 v6 地址的防火墙脚本、监控探针,关之前先搜出来改掉或停掉,免得它们在关后持续报错刷日志。这四笔账都不构成「不能关」的理由,只是关之前心里要有数,免得把连带变化误判成新故障。
恢复时按层倒序往回开即可,最省事的是整包还原操作前的备份。如果只想手动恢复:
# 恢复内核层:删掉两行 disable 参数并重载
sed -i '/disable_ipv6/d' /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
# 恢复 DNS 层
uci set dhcp.@dnsmasq[0].filter_aaaa='0'
uci commit dhcp
/etc/init.d/dnsmasq restart
# 恢复分发层
/etc/init.d/odhcpd enable
/etc/init.d/odhcpd start再到界面里恢复 wan6 接口、把 LAN 的 RA 与 DHCPv6 改回服务器模式,并重启一次,最后仍用验证清单确认终端重新拿到 v6 地址。
几个高频翻车点提前说清:关完终端还有 v6 地址,先查光猫是不是源头,其次查是不是终端在用自己缓存的旧租约,断开重连一次即见分晓;关完个别网站变慢,通常是该站点 v6 优先而本地过滤没跟上,确认 filter_aaaa 已生效并重启 dnsmasq;SSH 连不上多半与 IPv6 无关,检查 dropbear 是否被限制了监听接口,用 IPv4 地址直连即可。
IPv6 是互联网的既定方向,今天关它,是为了解决代理泄露、分流打架或运营商质量这些具体问题。问题消失了,或者哪天运营商把 v6 线路修好了,照着恢复步骤开回来就是。把开关握在自己手里、知道每一层在管什么,比长期保持某个「据说更优」的配置重要得多。
延伸阅读:如果您对 OpenWrt 的其他网络配置感兴趣,可以查看我们的 PPPoE 拨号设置、DDNS 动态域名配置 以及 实时抓包诊断。