我阅读了手册页,ip
但仍然不明白它src
是什么,而且我找不到太多文档。
请您详细解释一下或者指出一些链接,这样会是一个好的答案。
答案1
在向多宿主主机添加路由时,您可能希望在使用此路由开始通信时控制主机发送的源 IP 地址。这就是源码是为了。
举个简单的例子:您有一个主机,它有两个接口,IP 地址分别为 192.168.1.123/24 和 10.45.22.12/24。您正在通过 10.45.22.1 添加到 78.22.45.0/24 的路由,并希望确保您不会使用 192.168.1.123 地址发送到 78.22.45.0/24(可能是因为网络 78.22.45.0/24 没有返回 192.168.1.0/24 的路由,或者因为出于某种原因您不希望您的流量采用此路由):
ip route add 78.22.45.0/24 via 10.45.22.1 src 10.45.22.12
请注意源码您给出的设置只会影响源自您主机的流量。如果路由的是外部数据包,它显然已经有一个源 IP 地址,因此它将不加改变地传递下去(当然,除非您使用 NAT,但这是完全不同的事情)。此外,此设置可能会被一个进程覆盖,该进程专门选择绑定到特定地址,而不是在启动连接时使用默认值(这种情况相当罕见)。
答案2
该src
属性是地址选择算法。当主机有多个 IP 地址时,这一点很重要,通常,但并非总是,当主机有多个接口时。虽然还有其他规则会影响地址选择,并且网络应用程序也可以通过使用系统调用(例如)来覆盖选择算法bind()
,但该src
属性是一种使用路由表查找来回答以下问题的方法:“如果我想启动与主机 X 的连接,我应该使用哪个地址?”
以下示例说明了该src
属性的使用和效果。为了说明这与地址和路由有关,而不是严格与接口有关,此示例主机只有一个网络接口,但有两个地址。此外,两个地址都位于同一子网,以强调没有其他明显的方式来选择使用哪一个。
$ ip -4 addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.1.0.2/24 brd 10.1.0.255 scope global eth0
inet 10.1.0.16/24 scope global secondary eth0
$ ip route list dev eth0
10.1.0.32/27 scope link src 10.1.0.16
10.1.0.0/24 proto kernel scope link src 10.1.0.2
该主机可以从任一地址与此 /24 子网上的其他 252 个地址进行通信,但是默认情况下它将会在与 10.1.0.32 至 10.1.0.63 建立连接时使用 10.1.0.16,其余连接则使用 10.1.0.2。
如果主机正在响应,而不是发起,那么它将从请求的目标地址进行响应。例如,如果位于 10.1.0.32 的另一台主机连接到位于 10.1.0.2 的此主机,则响应将来自 10.1.0.2,即使这与src
返回路由的属性不匹配。