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
,并且您允许 ESTABLISHED
或 RELATED
连接的数据包进入您的机器,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
加载模块可能就足够了,因为允许传入 RELATED
和 ESTABLISHED
流量。这种方法更可取,因为它更安全。
启用 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
,并且您允许 ESTABLISHED
或 RELATED
连接的数据包进入您的机器,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
加载模块可能就足够了,因为允许传入 RELATED
和 ESTABLISHED
流量。这种方法更可取,因为它更安全。