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

前端之家收集整理的这篇文章主要介绍了linux – 当IP别名时,操作系统如何确定哪个IP地址将用作出站TCP / IP连接的源?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一台运行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

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

谢谢

解决方法

默认情况下,在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

猜你在找的Linux相关文章