IPv6 配置常见问题 Linux 篇 Ⅰ
随着 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 |
|
INTERFACE 替换为网络接口,也可以使用 all 和 default 设置所有接口或默认值
添加至 /etc/sysctl.conf
,运行 sysctl -p
保存
开启 IP 转发后 IPv6 地址丢失
开启 IP 转发后默认禁止接收 RA,可以通过以下方式恢复
解决方案
1 |
|
添加至 /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 server
和 No route to host
原因是 IPv6 RA 中的 hop limit 过低。
有朋友向我反馈:他家的某(通信设备大厂)品牌路由器有这个问题,在抓包分析下发现路由器随机发送 hop limit 为 5-12 的 RA,导致网络故障
截至 2025,大多数路由器(尤其是家用路由器)的 IPv6 配置功能不全,功能相对全的大概只有新版本的 OpenWrt 和 ROS 了。大多数路由器无法手动设置 IPv6 的 hop limit,所以我们通过设置 Linux 最低接受的 hop limit 来解决问题。
解决方案
1 |
|
INTERFACE 替换为网络接口,也可以使用 all 和 default 设置所有接口或默认值
最后的数字即为最小 hop limit。一般设置为 64 即可
添加至 /etc/sysctl.conf
,运行 sysctl -p
保存
反对盲目蛮干!
IPv6 配置中继后 LAN 设备还是没有地址
检查下 wan6 口的 master 有没有勾上(部分老版本 wrt 可能使用 wan 而不是 wan6 作为接口名)
解决方案
- 勾上主接口
部分老版本 wrt 图形化找不到这个设置,修改/etc/config/dhcp
在 wan6 添加 master 配置1
2
3
4
5config dhcp wan6
option dhcpv6 relay
option ra relay
option ndp relay
option master 1 - 另外,如果你的 OpenWrt 有 ULA 前缀 这个设置,把他清空并保存。