IPv6接口地址分配问题:使用via选项报错及配置方法咨询
via选项的正确用法与排坑 嘿,这个问题我之前帮不少同行排查过,先给你吃个定心丸:IPv6地址分配完全可以用via选项,但它的逻辑和IPv4差异不小,你踩的坑大概率是没摸透这些区别。
为什么用via会报错?常见原因
via地址类型错了:IPv6里,addr add命令的via必须指定链路本地地址(fe80::/10开头),而且必须带上接口后缀(比如%eth0)。链路本地地址是和物理接口绑定的,系统靠它来定位下一跳的链路层设备;要是你填了全局单播地址,系统根本找不到对应的邻居,自然报错。
错误示例:ip -6 addr add 2001:db8::1/64 dev eth0 via 2001:db8::2这里用全局地址当
via,完全不符合IPv6的邻居发现机制,肯定失败。混淆了地址分配和路由配置:很多人误以为给地址加
via是设置网关,但实际上,ip addr add里的via是用来配置源路由——也就是当使用这个IP作为源地址发数据包时,强制走指定的下一跳。如果你的需求只是给整个接口加默认网关,根本不该在addr add里加via,而是要单独配置路由。
什么时候该用via?正确配置方法
只有当你需要给单个IPv6地址绑定专属下一跳时(比如多ISP线路分流,特定IP走特定链路),才需要在addr add里用via。正确步骤如下:
获取下一跳的链路本地地址:
用邻居列表命令查看:ip -6 neigh show dev eth0或者直接查路由器的IPv6管理界面,通常路由器的链路本地地址会明确标注。
添加带
via的IPv6地址:
注意必须带上接口后缀,示例:ip -6 addr add 2001:db8::100/64 dev eth0 via fe80::1%eth0验证配置:
查看地址是否生效:ip -6 addr show dev eth0查看自动生成的源路由条目:
ip -6 route show table local
额外提醒:配置文件里的写法
如果是在持久化配置文件里(比如netplan或/etc/network/interfaces),要对应正确的语法:
以netplan为例,给单个IP配置源路由的写法:
network: ethernets: eth0: addresses: - 2001:db8::100/64 routing-policy: - from: 2001:db8::100/64 via: fe80::2%eth0 # 全局默认网关单独配置 routes: - to: ::/0 via: fe80::1%eth0
总结
你现在的报错,先检查这两点:是不是用了全局地址当via?有没有加接口后缀?如果只是要设置网关,那别在addr add里加via,单独配置路由就行。按这个思路排查,应该能快速解决问题。
内容的提问来源于stack exchange,提问作者Invictus

