我有一台运行 Ubuntu Server 的服务器,在单个 NIC 上具有四个 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 处理的公共 IP 地址范围)
我们的一位客户通过 FTP 发布他们的库存,因此我们每晚登录以从他们的服务器下载一个大文件。他们的防火墙希望我们的(被动)FTP 连接从 192.168.1.100 建立。
鉴于我的服务器逻辑上在单个适配器上有四个 IP 地址,操作系统如何确定哪个 IP 地址用作出站 TCP/IP 连接的源?
假设我通过 ssh 连接到 192.168.1.101 上的服务器并以交互方式运行 FTP。出站 TCP/IP 连接是否会使用 192.168.1.101,因为操作系统知道这是我的 shell 连接的接口?
如果 FTP 任务通过没有 shell 的 cron 作业以非交互方式运行怎么办?
你可能会说,这让我很困惑,所以我希望我的问题至少是有意义的。
编辑
为了澄清我问的原因——我没有对路由表进行任何更改,它实际上将“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 上,如果一个接口具有位于不同子网上的多个地址,则发往各个子网的流量将具有正确的源 IP。也就是说,如果 eth0 有两个地址 192.168.1.1/24 和 10.1.1.1/8,那么到 10.0.0.0 子网上的任何东西的流量都会有源 10.1.1.1,而到 192.168.1.0 子网上的任何东西的流量都会有源192.168.1.1。在这种情况下,您还可以通过将“src 1.2.3.4”选项用于“ip route”来显式分配源地址。
但是,在您的情况下,您的所有地址都在同一个子网上,因此“主要”地址(如“ip addr list dev eth0”所示)用作该接口上退出的流量的源 IP。我认为在这种情况下,仅使用“ip route”就可以控制源 IP,但我发现使用 iptables 为感兴趣的流量重写源地址更容易。
如果要强制将特定源地址用于特定目标,可以使用 SNAT 规则:
因此,如果您的“主要”eth0 IP 是 192.168.100.1,但您希望到 1.2.3.4 的流量具有 192.168.100.2 的来源,请执行以下操作:
请注意,“-s 192.168.100.1”很重要:它可以防止转发流量的源地址被此规则重写。
如果你打算在 Linux 上实现复杂的网络配置,你应该阅读 Linux 高级路由和流量控制文档, http: //lartc.org
它使用路由表中的任何默认网关,除非有特定路由告诉它使用另一个:
route -n
编辑:我读你的问题似乎太快了......
由于您使用的是被动模式并且客户端将始终启动连接,因此我认为 IP 标头中的 src ip 字段将始终显示为客户端连接的任何 IP。如果它是服务器正在启动连接的活动模式,我认为它始终是“主要”IP。如果您的地址在同一个子网中,Linux 会将您添加的第一个地址设为“主要”,而其他地址则为次要地址。
不过我不完全确定,我会运行 tcpdump -n 并查看它所看到的 src IP。
EDIT2:好的,我从您正在运行服务器的角度编写了上述内容,所以由于您是客户端并启动连接,我认为它似乎总是来自主 IP 地址,但再次尝试看看与 tcpdump。
我在您的示例中看到所有 ip 都太近而不能不在同一个网络中
你确定你实际上是多宿主而不是简单地有 4 个 IP 别名?
如果是后者,那么您可以将源 ip 设置在与此类似的路由上
请参阅有关如何使其在重新启动之间保持持久性的手册界面
除非您的 FTP 作业可以指定用于连接的接口,否则我相信它默认为相关子网上的第一个物理接口(在本例中为 eth0)。如果您的服务器在不同的子网上有两个 NIC,它会根据路由表确定要使用的接口。
由于系统上只有一个物理接口 (eth0) 和四个虚拟/别名(eth0:0 到 eth0:2)在同一子网上,因此出站流量将使用 eth0 IP 地址作为源,除非应用程序足够智能声明出站接口。
您可以看到 ip route get 命令将使用哪个设备和 src ip 地址,如下所示:
我没有在别名环境中尝试过这个,但希望这会有所帮助。
建立出站连接时,您的服务器将查看其路由表以确定要使用的四个接口中的哪一个;您的 TCP 连接将具有退出接口的源 IP。
将为您提供路由表的输出;查找与您尝试连接的客户端 IP 匹配的任何特定条目。如果不存在,那么您将使用默认路由(0.0.0.0,掩码 0.0.0.0)。如果您有多个默认路由,则使用成本最低的一个。