如果没有 SSL,FTP 在状态防火墙上可以正常工作,例如 netfilter ( iptables
) +nf_conntrack_ftp
内核模块,如下所示:
# modprobe nf_conntrack_ftp
# iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
问题是,当使用 SSL 时,FTP 连接跟踪模块无法工作,因为它无法监视会话以发现选择用于数据交换的会话端口。因此无法动态打开该端口。
有没有一种正确的方法可以在不禁用防火墙的情况下使启用 SSL 的 FTP 服务器正常工作?
有关信息,我vsftpd
与ssl_enable=YES
配置选项一起使用。
答案1
SSL 和 FTP 有多种模式:
- 隐式 SSL,即从一开始就使用 SSL(通常是端口 990),并且绝不是纯文本。在这种情况下,您在防火墙上无法获得有关动态数据端口的明文信息,因此无法将通信限制为仅与这些端口进行通信。
- 登录前使用“AUTH TLS”命令显式 SSL 来启用 SSL,但登录后不使用 CCC 来禁用 SSL。这里您遇到与隐式 SSL 相同的问题,即您无法读取正在使用的数据端口。
- 与以前一样显式 SSL,但登录后使用 CCC 命令。在这种情况下,登录受 SSL 保护,但控制连接的其余部分使用纯文本。数据传输仍可受到 SSL 保护。您必须在客户端启用此模式,就像
ftp:ssl-use-ccc
with一样lftp
。无法在 ftp 服务器上强制执行此模式。
如果由于相关命令已加密而无法获取确切的数据端口,您至少可以减少防火墙的限制:
- 在主动模式 ftp 中,服务器将从端口 20 发起数据连接,因此您可以拥有允许这些连接的 iptables 规则,即类似于
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
并另外接受已建立的连接。 vsftpd
在被动模式 ftp 中,您可以限制和设置提供的端口范围pasv_max_port
,pasv_min_port
并添加匹配规则,例如iptables -A INPUT -p tcp --dport min_port:max_port -j ACCEPT
.这不是非常严格,但至少比禁用防火墙更具限制性。