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

Modified on: Fri, 23 Aug 2019 09:00:02 +0800

我有一台运行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.x.x,假设它们被NAT转换为一系列公共IP地址)

我们的一位客户通过FTP发布他们的库存,因此我们每晚登录以从他们的服务器下载一个大文件。他们的防火墙希望我们的(被动)FTP连接来自192.168.1.100。

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

假设我在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

我可以摆弄路由表或让我们的客户更改他们的防火墙规则以获得我需要的行为,但我正在尝试深入了解这是如何工作的,以了解操作系统中是否存在错误或只是我对所有部分如何融合在一起的天真理解。

由于

作者:,Joe Holloway

最佳答案

默认情况下,在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。在这种情况下,您还可以使用“ip route”的“src 1.2.3.4”选项显式分配源地址。

但是,在您的情况下,您的所有地址都在同一个子网上,因此“主要”地址(由“ip addr list dev eth0”显示)将用作该接口上流量的源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的源为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”非常重要:它可以防止转发流量的源地址被此规则重写。

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

作者:,user14017

相关问答

添加新评论