在活动 ftp 中使用 FTPS(通过显式 TLS/SSL 的 FTP)?

use*_*952 4 iptables ftp vsftpd

我正在使用带有活动 ftp 的 vsftpd。我打开了模块“ip_conntrack_ftp”(在 /etc/sysconfig/iptables-config 中)并且端口 21 已打开。使用 FTP 连接有效,但 FTPS 无效。我可以登录但没有列表:

227 Entering Passive Mode
LIST -a
Run Code Online (Sandbox Code Playgroud)

停止防火墙时它可以工作(我的意思是 ftp 服务器本身上的 iptables)。我在http://www.experts-exchange.com/Software/Server_Software/File_Servers/FTP/Q_22418222.html中读到,无法将 FTPS 与活动 FTP 一起使用。这是真的?

我的 iptables 配置:

*filter
:INPUT DROP [15:2752]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [132:159725]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/255.0.0.0 -i ! lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 990 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 989 -j ACCEPT
COMMIT
Run Code Online (Sandbox Code Playgroud)

小智 5

我遇到了这个问题。使用带有显式 TLS/SSL 的 FTP 时,您似乎需要打开端口的 ftp 数据传输范围。请尝试以下操作:

iptables -A INPUT -p tcp --sport 1024: --dport 64000:65535 -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 64000:65535 --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

  • 我现在有“227 进入被动模式”,然后是“LIST -a”。一样。在您参考的文档中,在文件 vsftpd_virtual_config_withTLS.sh 中,我看到他们使用“pasv_max_port”和“pasv_min_port”。我认为这些选项仅适用于被动 ftp 连接。我应该发送 vsftpd.conf 配置文件。它现在有效。谢谢! (4认同)

mmo*_*oya 5

您需要明确允许访问ftp-data传入端口范围。Nic 的回答建议静态打开全范围,但这可能开放了。此外,RELATED在这种情况下是无用的,因为conntrack_ftp模块无法窥探加密的控制连接。

我的建议是使用最近的比赛。请尝试以下操作:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state NEW -j in_new
iptables -A in_new -p tcp --sport 1024: --syn --dport 64000:65535 -m recent --name ftpdata --update --seconds 1800 --reap -j ACCEPT
iptables -A in_new -p tcp               --syn --dport ftp         -m recent --name ftpdata --set -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

--set规则将通过控制连接进行匹配,并将源 ip 添加到ftpdata最近的列表中。该--update规则将完成大部分有趣的工作:

  • 如果数据包的源地址在ftpdata列表 ( --update) 中并且源地址在过去 1800 秒 ( --seconds 1800)内出现,则将匹配。
  • 如果匹配,将更新源地址的“上次看到”时间戳 ( --update)。
  • ftpdata过去 1800 年中未出现的列表中的条目将被删除 ( --reap)。

因此,在控制连接被ACCEPT编辑后,您有 1800 秒的时间来启动数据连接。在那之后,您将需要重新打开控制连接以将源地址重新添加到ftpdata列表中。

如果 ftp 客户端在上次控制连接建立时间的 1800 秒后无法启动数据连接,则此解决方案会带来不便。如果愿意,您可以使用 24 小时,无论如何,它比永久打开完整端口范围要。您还可以有一个序列,如:

iptables -A INPUT -m state --state ESTABLISHED -p tcp --dport ftp -m recent --set
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

每当建立的控制连接数据包进入时刷新源地址,但我更喜欢将--state RELATED,ESTABLISHED规则放在顶部附近。

还要检查accept_timeoutdata_connection_timeoutidle_session_timeout的PARAMS的vsftpd.conf