FTP iptables 问题

FTP issue with iptables

启用 iptables 后,我无法通过 FTP 进行连接。我已经尝试了 this topic 和其他一些人的所有建议,但我仍然得到:

Error:  Connection timed out
Error:  Could not connect to server

当我关闭 iptables 时连接没有问题,所以我确定这是导致问题的原因。

这是我的 iptables 文件的样子:

:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2020 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
# Allow FTP connections @ port 21
-A INPUT  -p tcp --sport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --dport 21 -m state --state ESTABLISHED -j ACCEPT
COMMIT

规则应如下所示:


$IPT -A INPUT  -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

$IPT -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

INPUT 链应该为传入连接打开目标端口 21。试用后请告诉我您的反馈。

首先,规则的顺序很重要。由于您在 FTP ACCEPT 规则之前指定了 REJECT 规则,因此 FTP 数据包在达到相关规则并有机会被接受之前被该规则拒绝。

其次,the link you've mentioned in your question 讨论了服务器要求的规则,而不是客户端要求的规则。客户端的适当规则是相反的。

由于 OUTPUT 链的默认策略是 ACCEPT,并且您允许 ESTABLISHEDRELATED 连接的数据包进入您的机器,passive-mode FTP 你的规则集应该已经支持了。

为了也支持 active-mode FTP,您需要允许来自端口 20 的服务器的传入 TCP 连接,如下所示:

iptables -A INPUT -p tcp --sport 20 -j ACCEPT

This link 简要总结了上述规则的基本原理。


由于在 active-mode FTP 中数据连接的主机和端口可以从控制连接的主机和端口可靠且容易地确定,我认为加载 nf_conntrack_ftp 模块将证明临时规则用于允许来自服务器端口 20 冗余的传入 TCP 连接。我没有检查过这个,但是用 modprobe nf_conntrack_ftp 加载模块可能就足够了,因为允许传入 RELATEDESTABLISHED 流量。这种方法更可取,因为它更安全。