我有一台运行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)。 如果您有多个默认路由,则使用成本最低的路由。