在Linux系统配置静态IPv6路由时,许多用户常遇到一个令人困惑的问题:命令执行后毫无报错,但 ping6 却无法连通,ip -6 route show 也查询不到新增路由。究竟是什么原因?本文将带你彻底解决这个难题。
ip -6 route add 添加静态路由未生效,其根本原因在于目标接口未启用IPv6或网关不可达。需要确认接口拥有scope global地址、网关位于直连子网且能够响应邻居发现协议,同时永久配置必须根据系统规范写入Netplan YAML或route6-文件中。

ip -6 route add 添加静态路由为何没生效
命令执行没有报错,但路由却没有出现?不必急于否定自己,首先检查目标接口是否正确启用了IPv6,以及网关是否可达。这两个条件是底层硬性要求,缺一不可。
具体而言,需要核实以下三个关键点:
- 接口状态:执行
ip -6 addr show dev eth0检查,确保存在一个scope global的地址(例如2001:db8::100/64)。若仅看到link地址,则表明IPv6网络层尚未就绪。 - 网关连通性:使用
ping6 -c 2 2001:db8::ff测试,如果对方无响应,路由无法找到下一跳,自然无法生效。 - 前缀格式要正确:添加默认路由时,应使用
default via 2001:db8::ff dev eth0,切勿写成0.0.0.0/0——那是IPv4的写法。
总而言之,路由能否成功加载,取决于接口的IPv6地址是否生效,以及网关是否位于同一链路内并能正常通信。
永久保存IPv6静态路由(Netplan系统配置方法)
Ubuntu等采用Netplan的系统,无法依赖ip -6 route命令自动持久化——重启后路由便会消失。必须将配置写入YAML文件。
关键在于:路由条目必须绑定到具体接口,并且如果网关不在直连子网内,则需要显式添加 on-link: true 参数(大多数情况下网关均在直连子网,此参数可省略)。
例如,为 eth0 添加前往 2001:db8:100::/64 的静态路由,下一跳为 2001:db8::1:
network:
version: 2
ethernets:
eth0:
routes:
- to: 2001:db8:100::/64
via: 2001:db8::1
on-link: true # 仅当网关非直连时必须设为 true
addresses: [2001:db8::100/64]
保存后执行 sudo netplan apply,路由便会自动加载,并且重启系统后仍然有效。
永久保存IPv6静态路由(RHEL/CentOS系统配置方法)
Red Hat系列系统的做法略有不同,使用 /etc/sysconfig/network-scripts/route6- 文件。其格式与IPv4的 route- 类似,但每一行只写一条路由。
例如,在 /etc/sysconfig/network-scripts/route6-eth0 文件中写入:
2001:db8:200::/64 via 2001:db8::2 dev eth0 default via 2001:db8::ff dev eth0
以下几点容易出错,需特别注意:
- 文件名必须严格命名为
route6-eth0,若接口名写错,系统将不会加载该文件。 via后面只能填写IPv6地址,不得使用主机名。- 修改完文件后,需执行
sudo systemctl restart network才能使其生效。
删除或修改已有IPv6路由的常见陷阱与注意事项
使用 ip -6 route del 删除路由时,参数必须与添加时完全一致,稍有差异便会报错 RTNETLINK answers: No such process。
例如,如果你当初是通过以下命令添加的:
sudo ip -6 route add 2001:db8:300::/64 via 2001:db8::3 dev eth0
那么删除时必须原样照写:
sudo ip -6 route del 2001:db8:300::/64 via 2001:db8::3 dev eth0
遗漏 dev eth0 或将接口名写为 dev ens33(接口名发生变更)都会导致删除失败。更令人困扰的是,如果你之前已经写入了持久化配置(例如 Netplan 或 route6 文件),即使临时用命令删除了路由,下次重启网络服务或重启系统时,旧路由又会重新添加回来。因此,修改时必须进行“双向操作”:既要在运行态删除,又要同步更新配置文件,才能彻底解决问题。
