随着 IPv4 资源枯竭和 IPv6 的发展,越来越多的人开始为自己的网络部署 IPv6,本文章总结一下自己和朋友踩过的坑。

本文章仅提及标准 Linux 和 OpenWrt 上的 IPv6 配置 ,不包含 Android 等特殊操作系统。其他操作系统的配置我后续将在其他文章单独讨论。

ndisc_router_discovery failed to add default route

是一个内核报错信息,完整的是 ICMPv6: RA: ndisc_router_discovery failed to add default route

一般此问题多在配置静态 IPv6 的机器出现。

错误的原因是:已经设置了静态网关,但是 RA 没有关闭。

解决方案

1
net.ipv6.conf.INTERFACE.accept_ra=0

INTERFACE 替换为网络接口,也可以使用 all 和 default 设置所有接口或默认值
添加至 /etc/sysctl.conf,运行 sysctl -p 保存


开启 IP 转发后 IPv6 地址丢失

开启 IP 转发后默认禁止接收 RA,可以通过以下方式恢复

解决方案

1
2
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_ra=2

添加至 /etc/sysctl.conf,运行 sysctl -p 保存


IPv6 DUID 不固定

路由器上已经为 Linux 主机设置了静态 DHCPv6 分配,但是主机重启后无法获取 IPv6 或获取的地址不一致,检查发现是 DUID 改变。

大概率是 ifupdown2 的问题,检查一下系统是不是在用 ifupdown2(一般来说,Proxmox 的系统默认就使用 ifupdown2,其他情况可以通过检测系统是否有 ifreload 命令来判断)

解决方案

CumulusNetworks/ifupdown2 #326

尝试打我写的这个 Patch


RA hop limit 过低

具体表现有:ping IPv6 提示 Time exceeded: Hop limit,curl 等网络工具直接提示 Couldn't connect to serverNo route to host

原因是 IPv6 RA 中的 hop limit 过低。

有朋友向我反馈:他家的某(通信设备大厂)品牌路由器有这个问题,在抓包分析下发现路由器随机发送 hop limit 为 5-12 的 RA,导致网络故障

RA with hop limit 5

截至 2025,大多数路由器(尤其是家用路由器)的 IPv6 配置功能不全,功能相对全的大概只有新版本的 OpenWrt 和 ROS 了。大多数路由器无法手动设置 IPv6 的 hop limit,所以我们通过设置 Linux 最低接受的 hop limit 来解决问题。

解决方案

1
net.ipv6.conf.INTERFACE.accept_ra_min_hop_limit=64

INTERFACE 替换为网络接口,也可以使用 all 和 default 设置所有接口或默认值
最后的数字即为最小 hop limit。一般设置为 64 即可

添加至 /etc/sysctl.conf,运行 sysctl -p 保存

反对盲目蛮干!
ra min hop limit not set


IPv6 配置中继后 LAN 设备还是没有地址

检查下 wan6 口的 master 有没有勾上(部分老版本 wrt 可能使用 wan 而不是 wan6 作为接口名)

IPv6 relay master

解决方案

  • 勾上主接口
    部分老版本 wrt 图形化找不到这个设置,修改 /etc/config/dhcp
    1
    2
    3
    4
    5
    config dhcp wan6
    option dhcpv6 relay
    option ra relay
    option ndp relay
    option master 1
    在 wan6 添加 master 配置
  • 另外,如果你的 OpenWrt 有 ULA 前缀 这个设置,把他清空并保存。