在配置多IP的操作系统上选择出站IP

发布于2019/12/30更新于2024/7/5

当操作系统配置了多个IP(IPv4或IPv6地址),可能在一个或多个适配器(adapter)或网络接口(interface)上,操作系统对外连接时会涉及到:

  • 接口(interface)选择
  • 接口选定之后,可能会涉及到出站IP选择

按照我的理解,这两个选择都会涉及到路由;当路由选择了一个接口之后,如果该接口上还配置了多个IP,出站IP可能会根据路由来选择;当路由没有指定该选择哪个IP时,操作系统可能会根据一些规则来选择出站IP。这篇日志会积累记录与出站IP选择有关的内容。

IPv6

针对默认IPv6地址的选择,RFC3483 – Default Address Selection for Internet Protocol version 6 (IPv6)制定了一系列规则(IPv6地址选择算法):

  • (待补充)

在单接口配置多IP的Linux上选择出站IP

当操作系统使用了以上的IPv6地址选择算法,仍然没有确定出站IP后,似乎则应该由操作系统自行解决。而Linux则会选择在某个接口上最新添加的IP地址。

感谢RamNode Discord#community-support中网友的提示,参考IPv6 Source Address Selection on Linux,把某个IPv6地址属性preferred_lft设置为0可标记该地址为deprecated;而标记为deprecated的IPv6地址不会作为出站IP而使用(违反IPv6地址选择算法第3条)。下面摘几个例子。

在Linux的dev0设备上添加一个标记为deprecated的IPv6地址:

ip addr add 2a01:550:8000::11 dev eth0 preferred_lft 0

直接在Ubuntu/Debian的interfaces文件中添加:

iface eth0 inet6 static
        address 2a01:550:8000:10a::1
        netmask 64
        gateway 2a01:550:8000:10a::ff
        up ip addr add 2a01:550:8000::11 dev eth0 preferred_lft 0

虽然这种方法意义上并不是很好(比如对于某个IPv6地址,preferreddeprecatedinvalid还是有具体意义的),但是这种方法看起来还是最简单的一个(比起设置路由来说),暂时先这么用着好了!

测试IPv6连通性

测试IPv4地址的服务还是很多了,摘两个IPv6地址测试的在线工具:

Leave a Reply

Your email address will not be published. Required fields are marked *