DMZ中的FTPS服务器。 为被动模式强制使用不同的IP地址

我正在build立一个TLS / SSLencryption(FTPS, 而不是 SFTP)的FTP服务器。 服务器将被放置在DMZ中。 这意味着它有一个接口:一个用于连接来自公司的networking和另一个(在边界路由器上静态NAT到Internet有效的IP地址)用于来自因特网的连接。

一个小的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-external (10.0.1.1)。 FTP服务器软件允许设置这个地址(在纯ftpd中的ForceIpAddress),但是在这种情况下,来自内部networking的用户将无法使用这个FTP(因为它会将它们发送到1.2.3.4而不是10.0.2.2)

那么问题是,如果根据客户端IP地址或接口有selectIP发送的方法,请求来了? 请注意,如果客户端从Internet连接,他应该获得互联网有效的IP地址(1.2.3.4)在服务器的内部(10.0.1.1)。 我使用纯粹的ftpd,但可以改变为其他任何东西。

我在不同的端口上使用了两台FTP服务器,并使用iptablesredirect了请求,但这不是最好的方式。 一些FTP客户端(例如WinSCP)也允许强制服务器的地址,但不是全部。

任何选项来解决这种情况?

FTP协议是在互联网上的所有计算机都可用全球唯一的IP地址寻址时创build的。 现在,NAT设备背后的FTP工作的唯一原因是,NAT设备会过滤FTPstream量并更正FTP命令连接(端口21)的明文以允许涉及不可路由的地址。

由于您使用SSL封装FTPstream量,因此NAT设备无法读取此stream量,因此无法更正您的不合规的IP地址。 您的解决scheme将来自您的FTP服务器。

pure-ftpd有一个-N标志,强制“主动”模式,即FTP服务器启动数据传输(端口20),并拒绝“被动”模式。 被动模式是NAT背后的FTP客户端必须使用从公共FTP站点下载的文件,这将不再兼容。

proftpd(所有可用的FTP服务器中我最擅长的)都有一个configuration文件来解决这个问题。 您可以将“MasqueradeAddress xxx.xxx.xxx.xxx”指令添加到configuration文件中,这将使proftpd告诉所有客户端,MasqueradeAddress是FTP服务器的IP地址。 确保您将此地址上的端口20与NAT一起转发到您的FTP服务器。

根据您的说明:“MasqueradeAddress”指令可以在“VirtualHost”指令的范围内使用,允许您提供内部访问以及外部NAT访问。