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
我可以摆弄路由表或让我们的客户更改他们的防火墙规则以获得我需要的行为,但我正在尝试深入了解这是如何工作的,以了解操作系统中是否存在错误或仅仅是我天真的理解所有部分如何组合在一起.
谢谢
解决方法
但是,在您的情况下,您的所有地址都在同一个子网上,因此“主要”地址(由“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