当IP别名如何确定哪个IP地址将用作出站TCP / IP连接的源?

我有一台运行Ubuntu服务器的服务器,有四个IP地址在一个网卡上。

eth0 192.168.1.100 eth0:0 192.168.1.101 eth0:1 192.168.1.102 eth0:2 192.168.1.103 

(举例来说,使用192.168.xx,假设这些是NAT-ed到一系列公有IP地址)

我们的一个客户通过FTP发布他们的库存,所以我们每天login从服务器下载一个大文件。 他们的防火墙期望我们的(被动)FTP连接从192.168.1.100。

鉴于我的服务器逻辑上在一个适配器上有四个IP地址,操作系统如何确定哪个IP地址用作出站TCP / IP连接的源?

比方说,我在192.168.1.101 SSH我的服务器并交互运行FTP。 出站TCP / IP连接使用192.168.1.101,因为操作系统知道我的shell连接的接口?

如果FTP任务是通过没有shell的cron作业非交互式运行的呢?

你可能会说,这让我很困惑,所以我希望我的问题至less有意义。

编辑

为了澄清为什么我问 – 我没有做任何改变的路由表,它实际上列出了“eth0”作为0.0.0.0路由IFace。 但是,所有的迹象表明,它实际上使用eth0:0作为源。

 Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0 

我可以摆弄路由表,或让我们的客户端改变他们的防火墙规则,以获得我所需要的行为,但是我想了解一下这是如何工作的,以了解在操作系统中是否存在错误,或只是我幼稚的理解所有的东西如何融合在一起

谢谢

默认情况下,在Linux上,如果一个接口有多个地址在不同的子网上,则发往各个子网的stream量将具有适当的源IP。 也就是说,如果eth0有两个地址192.168.1.1/24和10.1.1.1/8,那么在10.0.0.0子网上的任何stream量将具有源10.1.1.1,并且stream向192.168.1.0子网上任何东西的stream量将具有源192.168.1.1。 在这种情况下,您也可以使用“src 1.2.3.4”选项“ip route”来显式指定源地址。

在你的情况下,所有的地址都在同一个子网上,所以“主要的”地址(如“ip addr list dev eth0”所示)被用作在该接口上退出的stream量的源IP。 我认为在这种情况下可以使用“ip route”来控制源IP,但是我发现使用iptables来重写感兴趣的源地址更容易。

如果你想强制一个特定的源地址用于特定的目的地,你可以用SNAT规则来做:

 iptables -t nat -I POSTROUTING -o eth0 -d dest-IP-or-net/mask -s primary-IP-of-eth0 -j SNAT --to-source desired-source-IP 

所以,如果你的“主”eth0 IP是192.168.100.1,但你想要1.2.3.4的stream量有一个源192.168.100.2,那么这样做:

 iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2 

请注意,“-s 192.168.100.1”非常重要:它可以防止转发stream量的源地址被此规则重写。

如果您要在Linux上实现复杂的networkingconfiguration,则应阅读Linux高级路由和stream量控制文档http://lartc.org

我看你的例子中所有的ips都太靠近了,不在同一个networking中

你确定你实际上是多宿主,而不是简单地有4个IP别名?

如果后者是这种情况,那么你可以在类似于这个的路由上设置源IP

/ sbin / ip route show 192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link default 192.168.222.1 dev eth0

sudo / sbin / ip路由replace默认通过192.168.222.1 src 192.168.222.178

/ sbin / ip路由显示
192.168.222.0/24 dev eth0 proto内核作用域链接src 192.168.222.178 169.254.0.0/16 dev eth0作用域链接默认通过192.168.222.1 dev eth0 src 192.168.222.178

请参阅man界面,了解如何使其在重新启动之间持续存在

它使用任何默认网关在路由表中,除非有一个特定的路由告诉它使用另一个: route -n

编辑:我看你的问题太快,似乎…

由于您使用被动模式,客户端将始终启动连接,我认为IP标头中的src ip字段将始终显示为客户端连接到的任何IP。 如果是主动模式,服务器正在启动连接,我认为这将始终是“主要”IP。 如果你的地址在同一个子网中,Linux将使你添加的第一个地址为'Primary',其他地址为辅。

我不完全确定,但是我会运行tcpdump -n,看看它作为src IP。

编辑2:好吧,我从上面写的上述angular度来看,你是运行服务器,所以既然你是客户端,并启动连接,我认为它总是会来自主IP地址,但再次尝试,看看与tcpdump。

除非你的FTP作业有一个指定用于连接的接口的方法,否则我认为它默认为相关子网上的第一个物理接口(在这种情况下为eth0)。 如果你有一个服务器在不同的子网上有两个网卡,它会根据路由表找出使用哪个接口。

由于在同一子网上,系统上只有一个物理接口(eth0)和四个虚拟/别名(eth0:0到eth0:2),所以出站stream量将使用eth0 IP地址作为源,除非应用足够聪明声明出站接口。

你可以看到哪些设备和src ip地址将被ip route get命令使用,如下所示:

 $ /sbin/ip route get 1.1.1.1 1.1.1.1 via 2.2.2.2 dev eth0 src 2.2.2.2 cache mtu 1500 advmss 1460 hoplimit 64 

我没有在别名环境中尝试过,但希望这有助于。

当build立一个出站连接时,你的服务器将查找它的路由表来确定你要使用哪个接口。 您的TCP连接将具有您的出口界面的源IP。

 netstat -rn 

会给你你的路由表的输出; 查找与您尝试连接的客户端IP相匹配的任何特定条目。 如果不存在,则将使用默认路由(0.0.0.0,掩码0.0.0.0)。 如果您有多个默认路由,则使用成本最低的路由。