我正在设置使用 TLS/SSL 加密的 FTP 服务器(FTPS,不是SFTP)。服务器将被放置在 DMZ 中。这意味着它有两个接口:一个用于来自公司网络的连接,另一个(在边界路由器上静态 NAT 为有效的 Internet IP 地址)用于来自 Internet 的连接。
一个小的 ASCII 艺术来说明设置:
|<----------------------------- DMZ --------------------->|
Inet <---------> | border router | <-------> FTPS server <-------> Internal network
1.2.3.4 | 1.2.3.4 <NAT> 10.0.1.1 | 10.0.1.1 10.0.2.2
主动模式运行良好。但对于被动模式,FTP 服务器必须将其 IP 地址发送给客户端。第一个问题是服务器不知道其外部的地址(1.2.3.4),仅限DMZ-外部(10.0.1.1)。FTP 服务器软件允许设置此地址(pure-ftpd 中的 ForceIpAddress),但在这种情况下,内部网络的用户将无法使用此 FTP(因为它将向他们发送 1.2.3.4 而不是 10.0.2.2)
那么,问题是是否有一种方法可以根据客户端 IP 地址或请求到达的接口来选择要发送的 IP?请注意,如果客户端从 Internet 连接,他应该获得 Internet 有效的 IP 地址 (1.2.3.4),而不是服务器的内部 IP 地址 (10.0.1.1)。我正在使用 pure-ftpd,但可以更改为其他任何地址。
我使用了两个不同端口的 FTP 服务器,并使用 iptables 重定向请求,但我认为这不是最好的方法。一些 FTP 客户端(例如 WinSCP)也允许强制使用服务器的地址,但并非所有客户端都允许。
有什么办法可以解决这种情况吗?
答案1
FTP 协议是在互联网上的所有机器都具有唯一的 IP 地址时创建的。现在 NAT 设备后面的 FTP 能够正常工作的唯一原因是 NAT 设备会过滤 FTP 流量并更正 FTP 命令连接(端口 21)的明文,以允许所涉及的不可路由地址。
由于您将 FTP 流量包装在 SSL 中,NAT 设备无法读取此流量,因此无法纠正不合规的 IP 寻址。您的解决方案将来自您的 FTP 服务器。
pure-ftpd 有一个 -N 标志,它强制使用“主动”模式,这意味着 FTP 服务器将启动数据传输(端口 20)并拒绝“被动”模式。被动模式是 NAT 后面的 FTP 客户端必须使用才能从公共 FTP 站点下载的模式,您将不再兼容该模式。
proftpd(我使用过的所有 FTP 服务器中最好的)有一个配置 hack 可以解决这个问题。您可以将“MasqueradeAddress xxx.xxx.xxx.xxx”指令添加到配置文件中,这将使 proftpd 告诉所有客户端 MasqueradeAddress 是 FTP 服务器的 IP 地址。确保您已将此地址上的端口 20 通过 NAT 转发到您的 FTP 服务器。
根据您的说明:“MasqueradeAddress”指令可以在“VirtualHost”指令的范围内使用,允许您提供内部访问以及外部 NAT 访问。