当主机作为客户端时,接口使用哪个IP?
假设我已经为 eth0 配置了 2 个 IP 地址:192.168.1.7 和 192.168.1.8
路线命令显示如下:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.240.0 0.0.0.0 255.255.240.0 U 256 0 0 eth0
...
这基本上意味着当我尝试从192.168.240.0
网络连接到任何主机时,它使用 eth0 接口。好的,但是...该接口的 IP 地址是哪个?
如果主机充当服务器并且客户端使用 IP 地址连接到我的计算机,192.168.1.7
我知道 eth0 将用于192.168.1.7
与客户端通信,但如果我是客户端怎么办?
编辑
IP 地址已组成,我无法将另一个 IP 地址添加到 Ubuntu WSL 中的接口,因为出现以下错误:
$ ip address add 192.168.1.7/24 dev eth0
RTNETLINK answers: Permission denied
的输出ip r s
是这样的:
$ ip r s
none 224.0.0.0/4 dev eth0 proto unspec metric 256
none 255.255.255.255 dev eth0 proto unspec metric 256
none 224.0.0.0/4 dev eth1 proto unspec metric 256
none 255.255.255.255 dev eth1 proto unspec metric 256
...
编辑2
我升级到 WSL2,现在添加 IP 地址的命令可以工作(使用 sudo)。
$ ip -4 a s dev eth0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.249.181/20 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.7/24 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.8/24 scope global secondary eth0
valid_lft forever preferred_lft forever
答案1
对于 Linux,你的问题的答案是在这里给出:
出站数据包的初始源地址是根据以下一系列规则选择的。
应用程序可以请求特定的 IP,内核将使用所选路由路径中的 src 提示,或者,如果缺少此提示,内核将选择接口上配置的第一个地址,该地址与目标地址或目标地址位于同一网络中。下一跳路由器。
答案2
客户端将查找与其尝试连接的地址匹配的路由。如您的示例所示,如果有多个匹配路由,它将选择度量值最高的路由条目,并使用该接口的 IP 地址将数据包从路由表中找到的接口发送出去。
您已经截断了路线的输出,并且没有说明您要连接的内容 - 所以我无法告诉您那将是哪个接口。
在服务器上……事情变得有点复杂。我的 Centos 和 Redhat 主机在同一子网上有多个接口。这些将在数据包发送到的同一地址/接口上进行回复。但我最近也有 Ubuntu 和 Debian 系统,它们会重新访问路由表以查找要使用的接口和地址,而忽略客户端数据包上的寻址。客户端将忽略从不与之通信的 IP 地址返回的数据包。