跳转到内容

OpenWrt 关闭 IPv6 完全指南:从 Web 配置到 SSH 命令行

IPv6(Internet Protocol version 6)是下一代互联网协议,旨在解决 IPv4 地址枯竭问题。然而,在实际使用中,由于各种原因(如运营商支持不完善、部分应用兼容性问题、网络调试需求等),用户可能需要在 OpenWrt 软路由系统中彻底关闭 IPv6 功能。

本文将为您提供从图形界面到命令行的完整 IPv6 关闭方案,确保您的网络环境完全运行在纯 IPv4 模式下。无论您是初学者还是高级用户,都能通过本文找到适合自己的配置方法。

为什么要关闭 IPv6?

虽然 IPv6 是未来趋势,但在以下场景中,关闭 IPv6 可能是更好的选择:

常见原因

  1. 兼容性问题

    • 某些老旧设备或应用程序不支持 IPv6
    • 部分游戏服务器对 IPv6 支持不佳
    • 智能家居设备可能存在 IPv6 连接问题
  2. 网络稳定性

    • 运营商 IPv6 部署不完善导致间歇性断网
    • DNS 解析混乱(同时返回 IPv4 和 IPv6 地址)
    • 双重协议栈增加网络复杂度
  3. 性能优化

    • 减少路由表大小,提升查找效率
    • 降低系统资源占用(内存、CPU)
    • 简化防火墙规则,提高安全性
  4. 调试需求

    • 排查网络问题时排除 IPv6 干扰
    • 测试纯 IPv4 环境下的应用表现
    • 学习网络基础知识

IPv6 vs 纯 IPv4 对比

特性IPv6 启用IPv6 禁用
地址空间几乎无限有限(需 NAT)
配置复杂度较高简单
兼容性部分旧设备不支持广泛兼容
性能开销略高较低
安全性需额外配置防火墙相对简单
适用场景未来主流当前稳定方案

前置准备

在开始配置之前,请做好以下准备:

1. 备份当前配置

bash
# 通过 Web 界面备份
# 系统 → 备份/升级 → 生成备份

# 或通过命令行备份
sysupgrade -b /tmp/config_backup.tar.gz

2. 确保可以访问路由器

  • 确认可以通过 Web 界面访问(通常 192.168.1.1
  • 如果需要使用 SSH,确保已启用 SSH 服务
  • 记录当前的管理员账号密码

3. 了解网络拓扑

  • 确认 WAN 口和 LAN 口的物理连接
  • 了解是否有下游设备依赖 IPv6
  • 通知网络使用者即将进行配置变更

方法一:通过 Web 界面关闭 IPv6(推荐新手)

这是最直观的配置方式,适合不熟悉命令行的用户。

步骤一:删除 WAN6 接口

  1. 登录 OpenWrt 管理界面
  2. 进入 网络接口
  3. 找到名为 WAN6 的接口
  4. 点击右侧的 删除 按钮
  5. 确认删除操作

删除 WAN6 接口

说明:WAN6 是专门用于 IPv6 连接的广域网接口,删除它可以阻止路由器通过 PPPoE 或 DHCPv6 获取 IPv6 地址。

步骤二:配置 WAN 接口的 IPv6 设置

  1. 网络接口 页面
  2. 找到 WAN 接口,点击 修改/编辑
  3. 切换到 DHCP 服务器 标签页
  4. 点击 IPv6 设置 子标签

禁用关键服务

在 IPv6 设置中,将以下三项全部设置为 已禁用

  • RA 服务(Router Advertisement):路由器通告服务
  • DHCPv6 服务:IPv6 地址分配服务
  • NDP 代理(Neighbor Discovery Protocol):邻居发现协议代理

禁用 IPv6 服务

各项说明:

  • RA 服务:向局域网设备广播 IPv6 路由信息
  • DHCPv6 服务:为客户端分配 IPv6 地址
  • NDP 代理:处理 IPv6 邻居发现请求

步骤三:调整高级设置

继续在 WAN 接口的编辑页面中:

  1. 切换到 高级设置 标签页

  2. 禁用 IPv6 分配长度

    • 找到 IPv6 分配长度 选项
    • 选择 已禁用

禁用 IPv6 分配长度

  1. 取消内置 IPv6 管理
    • 找到 使用内置的 IPv6 管理 选项
    • 取消勾选 此选项

取消内置 IPv6 管理

  1. 点击 保存(暂不应用)

WAN 接口高级设置

步骤四:配置 LAN 接口

LAN 接口的配置步骤与 WAN 接口类似:

  1. 网络接口 页面
  2. 找到 LAN 接口,点击 修改/编辑
  3. 切换到 DHCP 服务器IPv6 设置
  4. 将以下三项设为 已禁用
    • RA 服务
    • DHCPv6 服务
    • NDP 代理
  5. 切换到 高级设置
  6. 禁用 IPv6 分配长度
  7. 取消 使用内置的 IPv6 管理
  8. 点击 保存

重要提示:LAN 接口的配置直接影响内网设备,务必确保所有 IPv6 相关服务都已禁用。

步骤五:清除全局 IPv6 ULA 前缀

ULA(Unique Local Address)是 IPv6 的唯一本地地址,类似于 IPv4 的私有地址(192.168.x.x)。

  1. 进入 网络接口
  2. 点击顶部的 全局网络选项 按钮
  3. 找到 IPv6 ULA 前缀 输入框
  4. 清空 其中的所有内容
  5. 点击 保存并应用

清除 IPv6 ULA 前缀

注意:这一步非常关键,很多用户遗漏后导致 IPv6 并未完全关闭。

步骤六:配置防火墙规则

  1. 进入 网络防火墙
  2. 切换到 通信规则(或 流量规则)标签页
  3. 查找所有包含 IPv6 的规则,包括:
    • 入站 IPv6
    • 转发 IPv6
    • 出站 IPv6
  4. 对这些规则执行以下操作:
    • 取消勾选 "启用" 复选框
    • 或者直接 删除 这些规则
  5. 滚动到页面底部
  6. 点击 保存并应用

禁用 IPv6 防火墙规则

建议操作:

  • 如果不确定哪些规则需要禁用,可以全部禁用 IPv6 相关规则
  • 保留 IPv4 规则不变
  • 应用后观察网络是否正常

步骤七:配置 DHCP/DNS

大雕/OpenWrt 衍生版本(如 LEDE)

  1. 进入 网络DHCP/DNS
  2. 切换到 高级设置 标签页
  3. 找到 禁止解析 IPv6 DNS 记录 选项
  4. 勾选 此选项
  5. 点击 保存并应用

启用 IPv6 DNS 过滤

原版 OpenWrt

原版 OpenWrt 可能没有上述图形化选项,需要通过 SSH 命令行配置(见下文方法二)。

原版 OpenWrt DHCP/DNS 设置

方法二:通过 SSH 命令行关闭 IPv6(推荐高级用户)

对于熟悉 Linux 命令的用户,SSH 方式更加高效和精确。

准备工作

  1. 启用 SSH 服务

    bash
    # 如果 SSH 未启用,先在 Web 界面开启
    # 系统 → 管理权 → SSH 访问 → 启用
  2. 连接路由器

    bash
    # macOS/Linux
    ssh root@192.168.1.1
    
    # Windows(使用 PowerShell 或 CMD)
    ssh root@192.168.1.1
    
    # 或使用 PuTTY、Tabby 等 SSH 客户端
  3. 输入密码登录

    • 默认密码通常是 password 或为空
    • 如果修改过,使用您设置的密码

命令详解

1. 禁用 AAAA 记录解析(DNS 层面)

bash
# 设置 dnsmasq 过滤 AAAA 记录(IPv6 DNS 记录)
uci set dhcp.@dnsmasq[0].filter_aaaa='1'

# 提交更改
uci commit dhcp

# 重启 DNS 服务使配置生效
/etc/init.d/dnsmasq restart

参数说明:

  • filter_aaaa='1':1 表示禁止解析 AAAA 记录,0 表示允许
  • AAAA 记录是 IPv6 的 DNS 记录类型(对应 IPv4 的 A 记录)
  • 禁用后,客户端只会收到 IPv4 地址

2. 禁用 odhcpd 服务

bash
# 禁用 odhcpd(OpenWrt 的 DHCPv6/RA 守护进程)
/etc/init.d/odhcpd disable

# 停止正在运行的服务
/etc/init.d/odhcpd stop

说明:

  • odhcpd 负责提供 DHCPv6 和 RA 服务
  • 禁用后,路由器不再响应 IPv6 地址请求
  • 使用 disable 而非 stop 可确保重启后依然生效

3. 内核层面禁用 IPv6

bash
# 在所有接口上禁用 IPv6
echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf

# 立即应用配置
sysctl -p /etc/sysctl.conf

说明:

  • /etc/sysctl.conf 是内核参数配置文件
  • net.ipv6.conf.all.disable_ipv6 = 1 禁用所有接口的 IPv6
  • sysctl -p 重新加载配置使其立即生效

4. 禁用特定接口的 IPv6(可选)

如果您只想禁用某个特定接口(如 eth0)的 IPv6:

bash
# 禁用 eth0 接口的 IPv6
echo 'net.ipv6.conf.eth0.disable_ipv6 = 1' >> /etc/sysctl.conf

# 应用配置
sysctl -p /etc/sysctl.conf

# 对其他接口重复上述操作(如 br-lan、pppoe-wan 等)
echo 'net.ipv6.conf.br-lan.disable_ipv6 = 1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

查看可用接口:

bash
# 列出所有网络接口
ip link show

# 或
ifconfig -a

5. 完整的一键禁用脚本

您可以将以下命令保存为脚本文件,一次性执行:

bash
#!/bin/sh
# disable_ipv6.sh - OpenWrt 完全禁用 IPv6 脚本

echo "开始禁用 IPv6..."

# 1. 禁用 DNS AAAA 记录解析
uci set dhcp.@dnsmasq[0].filter_aaaa='1'
uci commit dhcp
/etc/init.d/dnsmasq restart
echo "✓ DNS AAAA 过滤已启用"

# 2. 禁用 odhcpd 服务
/etc/init.d/odhcpd disable
/etc/init.d/odhcpd stop
echo "✓ odhcpd 服务已禁用"

# 3. 内核层面禁用 IPv6
grep -q "net.ipv6.conf.all.disable_ipv6" /etc/sysctl.conf || \
  echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
echo "✓ 内核 IPv6 已禁用"

# 4. 清除 ULA 前缀
uci delete network.globals.ula_prefix 2>/dev/null
uci commit network
echo "✓ ULA 前缀已清除"

echo ""
echo "IPv6 禁用完成!建议重启路由器以确保所有配置生效。"
echo "重启命令:reboot"

使用方法:

bash
# 上传脚本到路由器
scp disable_ipv6.sh root@192.168.1.1:/tmp/

# SSH 登录后执行
ssh root@192.168.1.1
chmod +x /tmp/disable_ipv6.sh
/tmp/disable_ipv6.sh

验证 IPv6 是否已完全关闭

配置完成后,请通过以下方法验证 IPv6 是否已成功禁用。

方法一:检查网络接口状态

bash
# 查看所有接口的 IPv6 地址
ip -6 addr show

# 如果输出为空或只有 ::1/128(回环地址),说明 IPv6 已禁用

预期结果:

# 成功禁用的输出(应该很少或没有)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

如果看到其他 IPv6 地址(如 fe80:: 开头的链路本地地址),说明未完全禁用。

方法二:测试 DNS 解析

bash
# 测试域名解析,确认只返回 IPv4 地址
nslookup www.baidu.com

# 或使用 dig
dig www.baidu.com AAAA

预期结果:

  • nslookup 只显示 IPv4 地址(如 14.215.177.39
  • dig AAAA 查询应返回空结果或 status: NOERROR 但无答案

方法三:在线测试工具

在连接到路由器的设备上,访问以下网站进行测试:

  1. test-ipv6.com

    • 应显示"未检测到 IPv6 地址"
    • 评分应为 0/10
  2. ipv6-test.com

    • IPv6 连接测试应失败
    • IPv4 连接应正常
  3. whatismyv6.com

    • 不应显示任何 IPv6 地址

方法四:ping 测试

bash
# ping IPv6 地址应该失败
ping6 ipv6.google.com
# 或
ping -6 ipv6.google.com

# 预期结果:Network is unreachable 或 超时

方法五:检查系统日志

bash
# 查看是否有 IPv6 相关错误
logread | grep -i ipv6

# 查看 odhcpd 是否已停止
logread | grep odhcpd

预期结果:

  • 不应有活跃的 IPv6 连接日志
  • odhcpd 应显示已停止或禁用

常见问题与故障排查

问题一:配置后仍有 IPv6 地址

现象: 执行 ip -6 addr show 仍看到 fe80:: 开头的地址

原因:fe80:: 是链路本地地址(Link-Local Address),即使禁用 IPv6 也会存在,这是正常的。

解决方案:

  • 链路本地地址仅在同一链路内有效,不会影响外网连接
  • 如果确实需要完全禁用,可以添加更严格的内核参数:
    bash
    echo 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.conf
    sysctl -p

问题二:客户端仍能获取 IPv6 地址

现象: 电脑或手机仍显示有 IPv6 地址

原因:

  • 客户端可能从上级设备(如光猫)获取 IPv6
  • 路由器缓存未清除

解决方案:

  1. 确认光猫也已禁用 IPv6 或改为桥接模式
  2. 在客户端设备上释放并更新 IP:
    bash
    # Windows
    ipconfig /release6
    ipconfig /renew6
    
    # macOS/Linux
    sudo dhclient -6 -r
    sudo dhclient -6
  3. 重启路由器:reboot

问题三:部分网站无法访问

现象: 禁用 IPv6 后,某些网站打开缓慢或无法访问

原因:

  • 某些网站优先使用 IPv6,禁用后需要等待 DNS 超时才回退到 IPv4
  • CDN 节点的 IPv4 地址可能不如 IPv6 优化

解决方案:

  1. 清除 DNS 缓存:
    bash
    /etc/init.d/dnsmasq restart
  2. 在客户端刷新 DNS:
    bash
    # Windows
    ipconfig /flushdns
    
    # macOS
    sudo dscacheutil -flushcache
  3. 如果问题持续,考虑重新启用 IPv6 并优化配置

问题四:重启后配置丢失

现象: 重启路由器后,IPv6 又恢复了

原因:

  • 某些配置未正确保存到 UCI 系统
  • /etc/sysctl.conf 未被正确加载

解决方案:

  1. 确认所有 uci commit 命令已执行
  2. 检查 /etc/sysctl.conf 内容:
    bash
    cat /etc/sysctl.conf
  3. 确保开机启动脚本中包含 sysctl -p
  4. 使用 Web 界面再次检查所有设置

问题五:无法通过 SSH 连接

现象: 禁用 IPv6 后,SSH 连接失败

原因:

  • SSH 监听在 IPv6 地址上
  • 防火墙规则误删

解决方案:

  1. 通过 Web 界面或控制台访问
  2. 检查 SSH 配置:
    bash
    cat /etc/config/dropbear
  3. 确保 SSH 监听 IPv4:
    bash
    uci set dropbear.@dropbear[0].Interface='lan'
    uci commit dropbear
    /etc/init.d/dropbear restart

进阶:选择性启用 IPv6

如果您只是想在某些场景下使用 IPv6,可以采用以下策略:

1. 仅在 WAN 口启用 IPv6

bash
# 允许 WAN 口获取 IPv6,但不在 LAN 广播
# 在 WAN 接口启用 DHCPv6 客户端
# 在 LAN 接口禁用 RA 和 DHCPv6 服务

2. 双栈模式优化

bash
# 同时启用 IPv4 和 IPv6,但优先使用 IPv4
# 在 /etc/gai.conf 中配置地址选择策略
echo 'precedence ::ffff:0:0/96  100' > /etc/gai.conf

3. 按需启用

创建脚本根据需要动态启用/禁用 IPv6:

bash
#!/bin/sh
# toggle_ipv6.sh

if [ "$1" = "on" ]; then
    echo "启用 IPv6..."
    sed -i '/disable_ipv6/d' /etc/sysctl.conf
    sysctl -p
    /etc/init.d/odhcpd enable
    /etc/init.d/odhcpd start
elif [ "$1" = "off" ]; then
    echo "禁用 IPv6..."
    echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
    sysctl -p
    /etc/init.d/odhcpd disable
    /etc/init.d/odhcpd stop
else
    echo "用法: $0 [on|off]"
fi

性能影响分析

关闭 IPv6 后,您可能观察到以下变化:

正面影响

内存占用降低

  • 减少路由表条目
  • 节省约 10-50MB 内存(取决于设备)

CPU 负载减轻

  • 无需处理 IPv6 数据包
  • 减少协议栈开销

启动速度提升

  • 减少网络初始化时间
  • 约快 5-15 秒

网络延迟稳定

  • 避免 IPv6 回退导致的延迟抖动
  • DNS 解析更可预测

潜在影响

⚠️ 未来兼容性

  • 随着 IPv6 普及,某些新服务可能仅支持 IPv6
  • 建议定期评估是否需要重新启用

⚠️ 特定应用

  • 某些 P2P 应用在 IPv6 下表现更好
  • IoT 设备可能依赖 IPv6

总结

通过本文的详细教程,您已经掌握了在 OpenWrt/LEDE 系统中彻底关闭 IPv6 的完整方法:

核心要点回顾

Web 界面配置:删除 WAN6、禁用 RA/DHCPv6/NDP、清除 ULA 前缀
防火墙设置:禁用所有 IPv6 相关的入站/转发/出站规则
DNS 过滤:启用 AAAA 记录过滤,防止返回 IPv6 地址
SSH 命令行:通过 UCI、sysctl、服务管理实现精确控制
验证方法:多种手段确认 IPv6 已完全禁用
故障排查:5 类常见问题及详细解决方案

最佳实践建议

  1. 配置前备份:始终先备份当前配置
  2. 分步验证:每完成一步就进行测试
  3. 文档记录:记录所做的更改,便于日后恢复
  4. 监控观察:配置后观察几天,确保网络稳定
  5. 保持更新:关注 OpenWrt 版本更新,可能需要重新配置

何时重新启用 IPv6

建议在以下情况考虑重新启用 IPv6:

  • 运营商 IPv6 服务质量明显改善
  • 需要使用仅支持 IPv6 的应用或服务
  • 进行网络技术学习和实验
  • 未来 IPv4 地址进一步枯竭时

关闭 IPv6 是一个权衡利弊的决定。对于大多数家庭用户,在当前阶段禁用 IPv6 可以获得更稳定的网络体验。但随着互联网的发展,建议您定期评估这一决策的合理性。

IPv6 网络协议概念图

延伸阅读:如果您对 OpenWrt 的其他网络配置感兴趣,可以查看我们的 PPPoE 拨号设置DDNS 动态域名配置 以及 实时抓包诊断