OpenWrt 彻底关闭 IPv6 教程
适用版本:OpenWrt 21.02 / 22.03 / 23.05 / 24.10(含 OpenClash 等代理插件的环境)
操作方式:SSH 登录路由器执行命令,或在 LuCI 网页界面中操作
目录
- 为什么要分层关闭
- 第 1 步:关闭 WAN/LAN 接口的 IPv6
- 第 2 步:关闭 RA / DHCPv6 / NDP 并停用 odhcpd
- 第 3 步:DNS 过滤 AAAA 记录
- 第 4 步:内核层面禁用 IPv6
- 第 5 步:代理插件中关闭 IPv6(OpenClash)
- 第 6 步:重启服务并验证
- LuCI 网页操作对照
- 常见输出说明
- 如何恢复 IPv6
为什么要分层关闭
OpenWrt 中的 IPv6 涉及多个环节,只关其中一个往往不彻底:
| 层面 | 负责的事 | 不关的后果 |
|---|---|---|
| WAN 接口 | 从运营商获取 IPv6 地址/前缀 | 路由器仍拿到公网 IPv6 |
| LAN 接口 + odhcpd | 向局域网设备下发 IPv6 地址 | 客户端仍获得 240x: / fdxx: 地址 |
| 内核协议栈 | IPv6 本身的运行 | 接口仍可自动生成 IPv6 地址 |
| DNS | 返回 AAAA(IPv6)记录 | 客户端尝试 IPv6 连接,导致网页卡顿 |
| 代理插件 | 插件自身的 IPv6 代理/解析 | 插件绕过上述设置重新引入 IPv6 |
第 1 步:关闭 WAN/LAN 接口的 IPv6
uci delete network.wan6 # 删除 WAN6 接口(不存在会提示 Entry not found,可忽略)
uci set network.wan.ipv6='0' # PPPoE 拨号时阻止自动获取 IPv6
uci set network.lan.ipv6='0'
uci delete network.lan.ip6assign # 取消 LAN 的 IPv6 前缀分配
uci delete network.globals.ula_prefix # 删除 ULA 前缀(fdxx::/48)
uci commit network第 2 步:关闭 RA / DHCPv6 / NDP 并停用 odhcpd
uci set dhcp.lan.ra='disabled'
uci set dhcp.lan.dhcpv6='disabled'
uci set dhcp.lan.ndp='disabled'
uci delete dhcp.wan6 2>/dev/null
uci commit dhcp
/etc/init.d/odhcpd stop
/etc/init.d/odhcpd disable第 3 步:DNS 过滤 AAAA 记录
uci set dhcp.@dnsmasq[0].filter_aaaa='1' # 23.05 及以上版本支持
uci commit dhcp旧版本若无此选项,可在/etc/dnsmasq.conf中加入filter-AAAA(需 dnsmasq 2.87+)。
第 4 步:内核层面禁用 IPv6
cat >> /etc/sysctl.conf <<'EOF'
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
EOF
sysctl -p⚠️ 这里没有禁用lo(回环接口)的 IPv6。部分服务(如 uhttpd 及某些插件)会监听::1,禁用后可能导致异常。
第 5 步:代理插件中关闭 IPv6(OpenClash)
如果路由器装了 OpenClash 等代理插件,DNS 会被插件接管(Fake-IP 模式下解析结果为 198.18.x.x),必须在插件中同步关闭 IPv6。
进入 服务 → OpenClash → 插件设置:
IPv6 设置 标签页
- ☐ IPv6 流量代理 —— 取消勾选
- ☐ 允许 IPv6 类型 DNS 解析 —— 取消勾选
DNS 设置 标签页
- 本地 DNS 劫持:保持 使用 Dnsmasq 转发(这样第 3 步的 AAAA 过滤与插件设置同时生效)
- 点击 保存配置 → 应用配置
如直接编辑 mihomo(Clash Meta)配置文件,设置顶层ipv6: false以及dns:下的ipv6: false。
第 6 步:重启服务并验证
/etc/init.d/network restart
/etc/init.d/dnsmasq restart
# 建议最后执行一次 reboot,确认设置重启后依然生效验证 1:路由器无 IPv6 地址
ip -6 addr期望输出(只剩回环地址):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever验证 2:路由器可正常上网
ping -c 3 223.5.5.5验证 3:DNS 只返回 IPv4
nslookup www.qq.com 127.0.0.1结果中只应出现 IPv4 地址(使用 OpenClash Fake-IP 时为 198.18.x.x),不应出现 IPv6 地址。
验证 4:客户端无 IPv6 地址
客户端先断开网络再重连,然后检查:
| 系统 | 命令 |
|---|---|
| Windows | ipconfig /all |
| macOS | ifconfig |
| Linux | ip -6 addr |
- ✅ 只有
fe80::开头的地址 —— 正常(链路本地地址,系统自动生成,无法上网) - ❌ 出现
240x:或fdxx:开头的地址 —— IPv6 仍未关干净
macOS 上utun*、awdl0、llw0等接口的fe80::地址属于系统服务(iCloud、AirDrop、VPN 等),与路由器无关,忽略即可。
LuCI 网页操作对照
| 位置 | 操作 |
|---|---|
| 网络 → 接口 | 删除 WAN6 |
| 网络 → 接口 → WAN → 高级设置 | “获取 IPv6 地址”设为 禁用 |
| 网络 → 接口 → LAN → 高级设置 | “IPv6 分配长度”设为 禁用 |
| 网络 → 接口 → 全局网络选项 | 清空 IPv6 ULA 前缀 |
| LAN → DHCP 服务器 → IPv6 设置 | RA 服务 / DHCPv6 服务 / NDP 代理 全部 禁用 |
| 网络 → DHCP/DNS → 高级设置 | 勾选 过滤 IPv6 AAAA 记录 |
| 服务 → OpenClash → 插件设置 → IPv6 设置 | 取消两个 IPv6 选项 |
常见输出说明
| 输出 | 含义 |
|---|---|
uci: Entry not found | 要删除的配置项本来就不存在,可忽略 |
udhcpc: no lease, failing | dnsmasq 启动时检测局域网是否有其他 DHCP 服务器,没找到是正常情况 |
198.18.x.x | OpenClash / mihomo 的 Fake-IP 地址,属正常 |
如何恢复 IPv6
# 1. 恢复内核 IPv6
sed -i '/disable_ipv6/d' /etc/sysctl.conf
sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0
# 2. 恢复接口
uci set network.wan6=interface
uci set network.wan6.device='@wan'
uci set network.wan6.proto='dhcpv6'
uci delete network.wan.ipv6
uci delete network.lan.ipv6
uci set network.lan.ip6assign='60'
uci commit network
# 3. 恢复 RA / DHCPv6
uci set dhcp.lan.ra='server'
uci set dhcp.lan.dhcpv6='server'
uci delete dhcp.lan.ndp
uci set dhcp.@dnsmasq[0].filter_aaaa='0'
uci commit dhcp
/etc/init.d/odhcpd enable
/etc/init.d/odhcpd start
# 4. 重启
reboot最后在 OpenClash 中重新勾选 IPv6 流量代理 和 允许 IPv6 类型 DNS 解析。
标签:无