Linux下多IPv6地址接口的源地址选择:如何弃用指定地址?
解决Linux IPv6出站源地址排除指定地址的问题
要让内核避免将某个特定IPv6地址用作出站数据包的源地址,核心是给这个地址打上**deprecated(已废弃)**标志——这会告诉内核优先选择其他可用的非废弃地址,只有当没有其他可选地址时才会 fallback 到这个废弃地址。下面是具体的操作步骤和相关细节:
1. 临时修改(立即生效,重启后失效)
假设你的目标接口是eth0,要标记的IPv6地址是2001:db8::1/64,执行以下命令:
# 给已存在的地址添加deprecated标志 ip addr change 2001:db8::1/64 dev eth0 deprecated # 如果是新添加地址时直接设置,还可以加上noprefixroute避免自动生成前缀路由(可选) ip addr add 2001:db8::1/64 dev eth0 deprecated noprefixroute
执行后可以用ip addr show dev eth0验证,目标地址后面会显示deprecated字样,说明设置成功。
2. 永久生效配置
根据你使用的网络管理工具不同,配置方式略有差异:
- systemd-networkd:在接口配置文件(比如
/etc/systemd/network/eth0.network)的[Address]段添加:Address=2001:db8::1/64 Deprecated=true NoPrefixRoute=true # 可选,不需要前缀路由的话加上 - NetworkManager:用nmcli命令修改对应连接:
或者编辑NetworkManager的连接配置文件,在nmcli connection modify <连接名> ipv6.addresses "2001:db8::1/64,deprecated,noprefixroute"ipv6.addresses字段末尾追加,deprecated,noprefixroute。 - 传统ifupdown(/etc/network/interfaces):在接口配置块里添加:
iface eth0 inet6 static address 2001:db8::1/64 deprecated yes noprefixroute yes
关键标志说明
deprecated:这是核心标志,遵循RFC 6724的源地址选择规则,内核会将废弃地址的优先级设为最低,优先选择其他正常状态的地址作为源地址。noprefixroute(可选):阻止系统为该地址自动生成前缀路由,避免这个地址影响路由表,但它本身不会直接影响源地址选择,只是辅助优化路由配置。
验证效果
你可以用ping6指定目标地址,然后用tcpdump或者ip -6 route get <目标IPv6地址>查看内核选择的源地址,确认是否避开了标记为deprecated的地址。
内容的提问来源于stack exchange,提问作者Skip Lester
相关产品推荐
相关产品推荐

