我有一个linux机器,出于奇怪的原因,它在同一个物理网络接口上有两个IP地址,并且两个IP都在同一个子网中。该机器可通过两个 IP 访问,一切似乎都正常。
直到我发现这台机器需要消耗NAS服务。并且这个NAS已经基于IP进行了锁定。由于添加了第二个 IP,似乎无法再挂载 NAS 共享。一种明显的解决方法是删除 IP 限制或添加第二个 IP。
我的问题是:如果一台机器有多个IP,它将使用哪一个来发送流量?或者换句话说,如果这台双 IP 机器充当客户端,服务器将看到的客户端 IP 是什么?
编辑:我现在了解到一些客户端应用程序可以指定用于传出流量的接口。这对我来说是新的。所以我的客户会是
- NFS 挂载 (
mount -t nfs ...
) - 平
如何指定传出流量的 IP?如果客户端应用程序没有指定,操作系统如何选择?传出流量的操作系统选择是否会偏向一个、另一个或两个接口?
答案1
当任何客户端尝试启动连接时,它可以指定自己的客户端 IP,也可以使用该地址INADDR_ANY
(AKA 0.0.0.0
:)作为源地址。如果使用INADDR_ANY,那么当客户端调用时Linux会自动选择一个地址连接()- 看人 7 ip。
最简单的修复就是告诉你的客户选择哪个IP。
当您安装时,mount -t nfs ...
您只需设置clientaddr
选项即可(请参阅人 5 NFS)。如果您想要的 IP 是 10.20.30.41,您只需添加以下选项:
... -o clientaddr=10.20.30.41 ...`
或者,如果您已经有那么-o
您只需用逗号分隔其他选项。改变
... -o foo=bar
到
... -o foo=bar,clientaddr=10.20.30.41
如果您无法使用 INADDR_ANY 停止您的客户端然后 ...
据我所知,源地址是由src
路由表上的地址设置的。看人8 IP路由
因此,Linux 检查您尝试连接的远程 (NAS) IP,然后在其路由表中查找该地址。它选择src
在那里指定的地址。
在终端上,您可以查看路由表ip route
并得到如下内容:
default via 192.168.1.254 dev wlan0 proto dhcp src 192.168.1.143 metric 600
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.19.0.0/16 dev br-ff4f53a0f3b5 proto kernel scope link src 172.19.0.1
172.22.0.0/16 dev br-66358811b693 proto kernel scope link src 172.22.0.1 linkdown
172.29.0.0/16 dev br-ce3d9cbbad0b proto kernel scope link src 172.29.0.1 linkdown
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.143
192.168.1.254 dev wlan0 proto dhcp scope link src 192.168.1.143 metric 600
在这里你可以看到,如果你尝试连接到任何东西,172.17.x.x
Linux 都会选择172.17.0.1
作为源地址。同样,公共互联网上的任何内容都将通过“默认路由”,因此它会选择192.168.1.143
.
ip route add ...
您可以使用、ip route change ...
和修改路由表ip route del ...
。
我建议您对路由表进行尽可能小的更改,以避免其他问题。您为单个 IP 创建路由,它将优先于整个子网的路由。例如,如果 LAN 为 10.20.30.0/24,则系统的辅助 IP 地址也在接口上为 10.20.30.22以太网0并且该 LAN 中的 NAS 也使用 10.20.30.31:
ip route add 10.20.30.31/32 dev eth0 src 10.20.30.22
或者如果 NAS 位于可通过网关 10.20.30.1 访问地址 172.20.30.31 的另一个网络中:
ip route add 172.20.30.31/32 via 10.20.30.1 src 10.20.30.22
警告:我还没有机会测试上述内容。