找出使用的客户端IP

找出使用的客户端IP

我有一个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.xLinux 都会选择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

警告:我还没有机会测试上述内容。

相关内容