Joe*_*way 16 linux tcpip ssh ftp ip-aliasing
我有一台运行 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
Run Code Online (Sandbox Code Playgroud)
(以 192.168.xx 为例,假设这些是 NAT-ed 到一系列公共 IP 地址)
我们的一个客户通过 FTP 发布他们的库存,因此我们每晚登录以从他们的服务器下载一个大文件。他们的防火墙希望我们的(被动)FTP 连接从 192.168.1.100 建立。
鉴于我的服务器在一个适配器上逻辑上有四个 IP 地址,操作系统如何确定哪个 IP 地址用作出站 TCP/IP 连接的源?
假设我在 192.168.1.101 上通过 ssh 进入我的服务器并以交互方式运行 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
Run Code Online (Sandbox Code Playgroud)
我可以摆弄路由表或让我们的客户更改他们的防火墙规则以获得我需要的行为,但我试图深入了解这是如何工作的,以了解操作系统中是否存在错误或只是我的天真理解所有部分如何组合在一起。
谢谢
use*_*017 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
Run Code Online (Sandbox Code Playgroud)
因此,如果您的“主要”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
Run Code Online (Sandbox Code Playgroud)
请注意,“-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
/sbin/ip route show 192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link default via 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 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link default via 192.168.222.1 dev eth0.1222.1729
请参阅有关如何在重新启动之间保持持久性的手册界面
| 归档时间: |
|
| 查看次数: |
31801 次 |
| 最近记录: |