我尝试了以下规则来允许 FTP:
# The following two rules allow the inbound FTP connection
iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# The next 2 lines allow active ftp connections
iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
# These last two rules allow for passive transfers
iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
尽管事实上,我允许被动 ftp 连接,但当我尝试连接到服务器时,ftp 客户端挂起并显示以下字样:“进入被动模式”。
在我允许所有出站连接后:
iptables -P OUTPUT ACCEPT
它开始起作用了。
怎么了?
答案1
在被动模式下,您只知道将使用的端口之一。连接建立后,服务器告诉客户端要使用哪个其他端口,然后客户端必须打开第二个端口。我相信只有当您知道服务器只会告诉客户端使用 1024 时,您的 1024 规则才有效。
更准确地说:http://slacksite.com/other/ftp.html
在被动模式 FTP 中,客户端发起到服务器的两个连接,解决了防火墙过滤从服务器到客户端的传入数据端口连接的问题。打开 FTP 连接时,客户端会在本地打开两个随机非特权端口(N > 1023 和 N+1)。第一个端口通过端口 21 联系服务器,但客户端不会发出 PORT 命令并允许服务器连接回其数据端口,而是发出 PASV 命令。这样做的结果是服务器随后打开一个随机非特权端口(P > 1023)并将 P 发送回客户端以响应 PASV 命令。然后客户端发起从端口N+1到服务器端口P的连接以传输数据。