Answers:
在向多宿主主机添加路由时,您可能希望控制使用该路由开始通信时主机从其发送的源IP地址。这就是src的用途。
简短的示例:您有一台具有两个接口且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
请注意,您提供的src仅会影响源自您主机的流量。如果正在路由一个外部数据包,则它显然已经具有一个源IP地址,因此它将原封不动地传递(当然,除非您使用的是NAT,但这是完全不同的事情)。同样,此设置可能会被专门选择绑定到特定地址的进程覆盖,而不是在启动连接时使用默认设置(这种情况很少见)。
该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
与返回路由的属性不匹配。