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


15

我有一台运行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连接的源?

假设我在192.168.1.101上进入服务器并以交互方式运行FTP。TCP / IP出站连接是否将使用192.168.1.101,因为操作系统知道那是我的Shell连接的接口?

如果FTP任务通过无外壳的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

我可以摆弄路由表,或者让我们的客户端更改其防火墙规则以获取所需的行为,但是我试图对它的工作方式有一些了解,以了解操作系统中是否存在错误或者仅仅是我的天真理解所有零件如何组合在一起。

谢谢

Answers:


12

默认情况下,在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规则进行操作:

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 Advanced Routing and Traffic Control文档,http://lartc.org


在示例中,可能用“ -d 1.2.3.4/332”或“ -d 1.2.3.4”替换“ -d 1.2.3.4/0”
Christian Christian 2010年

5

我在您的示例中看到,所有ip距离太近,无法位于同一网络中

您确定您实际上是多宿主的,而不只是拥有4个IP别名吗?

如果是后者,则可以在路由上设置与以下内容类似的源ip

/ sbin / ip route show 192.168.222.0/24 dev eth0原型内核作用域链接src 192.168.222.178 169.254.0.0/16 dev eth0作用域链接默认通过192.168.222.1 dev eth0

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

/ sbin / ip route show
192.168.222.0/24 dev eth0原型内核作用域链接src 192.168.222.178 169.254.0.0/16 dev eth0作用域链接默认通过192.168.222.1 dev eth0 src 192.168.222.178

有关如何使其在两次重启之间保持一致的信息,请参见人机界面


你是对的。也许我在滥用多宿主。我们的数据中心为我们提供了四个IP地址,它们都位于同一子网上。
乔·霍洛威

您知道您可以编辑问题,对吗?
hayalci,2009年

5

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

编辑:我看你的问题似乎太快了...

因为您使用的是被动模式,并且客户端将始终启动连接,所以我认为IP标头中的src ip字段将始终显示为客户端连接的任何IP。如果它是活动模式,则服务器正在启动连接,我认为它将始终是“主” IP。如果您的地址在同一个子网中,则Linux会将您添加的第一个地址设为“主要”,其他地址设为次要。

但是我不确定,我将运行tcpdump -n并查看其作为src IP的含义。

EDIT2:好的,我是从运行服务器的角度编写的,因此,由于您是客户端并正在启动连接,因此我认为它似乎总是来自主IP地址,但再次尝试一下,看看与tcpdump。


路由表只是默认表,并且只有一个子网。另一位张贴者表示我误用了多宿主。但是,我仍然希望它使用eth0别名。我使用wget下载whatsmyip.net,它向我显示我以某种方式使用eth0:0。
乔·霍洛威

这对我来说真的没有意义,whatsmyip.net应该向您显示公共IP ...
Kyle Brandt

更明确地说,它显示了经过NAT处理的与eth0:0关联的私有IP的公共IP地址,而我希望它显示经过NAT处理的与eth0相关联的私有IP的公共IP地址
Joe Holloway

1
这里的答案太高了,包含许多编辑内容,使许多事情变得混乱,无济于事。tbman和jknapka的答案非常好,对我很有帮助。
基督教徒

4

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

由于系统上只有一个物理接口(eth0),并且同一子网上有四个虚拟/别名(eth0:0到eth0:2),因此除非应用程序足够智能,否则出站流量将使用eth0 IP地址作为源。声明出站接口。


2
这是我的假设,但是所有测试均表明它使用eth0:0作为源。
乔·霍洛威

然后,可能会将默认路由配置为使用eth0:0接口。我有一个使用以太网桥的安装,并且已将其配置为对默认路由使用虚拟桥接口。
sysadmin1138

我在另一台计算机上设置了一个简单程序,以打印从其接收连接的IP。连接到nc -s <ip of eth0:2>或始终显示源地址的任何内容实际上是eth0:0的ip,即使netcat做了一个bind(2)before connect(2)。因此,别名似乎无法使计算机具有从多个源地址建立连接的能力。
彼得·科德斯

4

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

$ /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

我没有在别名环境中尝试过此方法,但希望对您有所帮助。


1

建立出站连接时,服务器将在其路由表中查找以确定要使用的四个接口中的哪一个;您的TCP连接将具有退出接口的源IP。

netstat -rn

将为您提供路由表的输出;查找与您要连接的客户端IP匹配的所有特定条目。如果不存在,则将使用默认路由(0.0.0.0,掩码0.0.0.0)。如果您有多个默认路由,则成本最低的将是使用的路由。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.