可能重复:
使用 IPTables 允许 FTP
我有一组非常严格的 iptables 规则,其中以下规则允许我通过 ftp 进行连接
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
客户端可以正常连接,但仅此而已,在出现问题之前,来自 ftp 客户端的以下输出可能会有所帮助:
Command: MLSD
Error: Connection timed out
Error: Failed to retrieve directory listing
当我停止 IP 表时一切都按预期工作
CentOS 版本 5.5(最终版)
proftpd-1.3.3c-3
答案1
您需要一条附加规则来允许“相关”连接。这是因为 FTP 协议使用一个端口来传输命令,另一个端口来传输数据。
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
此外,您还需要加载一个内核模块来跟踪相关连接。它被称为 ip_conntrack_ftp,但如何加载它取决于您的发行版。
在 hedrat-ish 系统上,看看/etc/sysconfig/iptables-config
答案2
只是为了打破差异:
主动 FTP:客户端连接到服务器上的端口 21。这是控制通道。获取文件或目录列表是数据传输,然后服务器尝试连接回客户端以发送它。考虑到大多数客户端都经过 NAT 和防火墙保护,这在当今几乎行不通。
被动 FTP:仍然需要有数据通道,但这一次,服务器将端口号发送回客户端,客户端发起其他通过该端口重新连接回服务器。
被动模式下数据连接超时的原因是数据端口仍被阻止。根据您的 FTP 服务器软件,您通常可以指定服务器发送的端口范围(例如:50000-50010)。然后,您还需要接受该端口范围内的入站连接。(请确保您还将同时连接的数量限制为与可用端口数量相同。)
我不熟悉 proftpd,但我认为它可以让你做你需要做的事情。
编辑Noodl 的答案是允许数据连接通过的最佳选择,但为了便于跟踪,您可能还是想具体说明端口范围。
答案3
尝试将您的客户端设置为使用被动 FTP,假设您正在使用 NAT,那么这应该可以工作。
在 filezilla 中的连接设置中,在命令行上我认为“被动”应该将其打开,在 ls/dir 命令之前执行该操作。
答案4
您可以使用 netfilter conntrack 模块:
modprobe nf_conntrack_ftp
并在启动时加载,在 /etc/sysconfig/iptables-config 中:
IPTABLES_MODULES="nf_conntrack_ftp"