好的,我使用简单的 Linux FTP 客户端从 FTP 服务器下载/上传文件。我有一个 iptables 防火墙,它阻止了大多数端口,我必须关闭防火墙才能使其工作。虽然端口 21 是开放的,但我想这解释了为什么下载有效而上传无效。以下命令在防火墙开启的情况下完美运行:
wget ftp://user:[email protected]
当我实际连接到服务器并尝试将文件“上传”到服务器时,我遇到了问题。这是当时使用的端口的示例 netstat 输出,但它总是不同的。
netstat -a | grep ServerIP
tcp 0 197520 myIP.:59622 ServerIP:ftp-data ESTABLISHED
tcp 0 0 myIP.:40341 ServerIP:ftp ESTABLISHED
myIP 范围内的两个端口都被阻止了,我无法猜测我必须打开哪些端口。谷歌搜索也失败了。其次,如果我在 iptables 上尝试类似这样的操作,它会给我一个错误:
-A INPUT -p tcp --match multiport --dport 40000:40500 -j ACCEPT
iptables-restore v1.4.8: too many ports specified
其次,为什么我需要打开端口,而配置文件中在端口被阻止之前有以下一行:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
答案1
一个可能的原因是您使用了主动 FTP。
FTP 有主动模式和被动模式。
积极的:
在主动模式 FTP 中,客户端从随机的非特权端口 (N > 1023) 连接到 FTP 服务器的命令端口,即端口 21。然后,客户端开始监听端口 N+1,并将 FTP 命令 PORT N+1 发送到 FTP 服务器。然后,服务器将从其本地数据端口(即端口 20)连接回客户端指定的数据端口。
被动的:
为了解决服务器发起与客户端连接的问题,开发了一种不同的 FTP 连接方法。这种方法被称为被动模式 (PASV),它以客户端用来告诉服务器它处于被动模式的命令命名。在被动模式 FTP 中,客户端发起与服务器的两个连接,解决了防火墙过滤从服务器到客户端的传入数据端口连接的问题。打开 FTP 连接时,客户端会在本地打开两个随机的非特权端口 (N > 1023 和 N+1)。第一个端口在端口 21 上联系服务器,但客户端不会发出 PORT 命令并允许服务器重新连接到其数据端口,而是会发出 PASV 命令。结果是服务器随后打开一个随机的非特权端口 (P > 1023) 并将 P 发送回客户端以响应 PASV 命令。然后,客户端发起从端口 N+1 到服务器上的端口 P 的连接以传输数据。
这意味着您有两个选择:
- 简单选项:使用被动模式
- 硬选项:允许从端口 20 传入连接,来自任何已经建立连接的主机。
我会选择选项 1
答案2
要实现选项 2Christopher Perrin 的回答,您可以使用recent
匹配扩展。它将源 IP 地址添加到列表中,您可以在后续规则中检查该列表。对于这些规则,我假设eth0
是您的 WAN 接口。
iptables -A FORWARD -o eth0 -p tcp --dport 21 -m state --state ESTABLISHED -m recent --name trustedftp --set
iptables -A FORWARD -i eth0 -p tcp --sport 20 -m recent --name trustedftp --seconds 30 --rcheck -j ACCEPT
我还没有测试过,但我认为它应该可行。