我目前运行的是 Ubuntu 19:10 作为我的主要操作系统。我需要连接到 FTP 服务器,该连接需要处于主动模式。我已尝试使用 Filezilla 启用主动 ftp 并通过命令行进行此操作。
我可以连接到 FTP 服务器,但是,当通过将标志传递-d
给ftp
命令以调试模式运行它时,尝试列出文件时遇到错误。
这是我的终端窗口的屏幕截图:
可能值得一提的是,我可以成功运行pwd
,并且可以更改目录,cd
因为我已经知道两个目录的名称。
我看到的第一个错误是:
ftp: setsockopt: Bad file descriptor
其次是:
ftp: setsockopt (ignored): Permission denied
500 Illegal PORT command
ftp: bind: Address already in use
通过大量谷歌搜索,我看到了各种建议,例如启用被动模式和检查防火墙。然而,当启用被动模式时,我遇到了以下问题:
同样,我已经验证了UFW
运行状态为非活动状态:
sudo ufw status
我还检查了 中没有被阻止的内容iptables
。我可以在被动模式下毫无问题地连接到常规 FTP 服务器。这是我第一次被要求在连接时使用主动模式。
因此,我的问题分为两部分:
1.这可能是我这边(客户端)或 FTP 服务器的问题吗?
2.如果这是我的问题,我该尝试如何解决?
任何帮助都感激不尽!
答案1
FTP 协议是在当今防火墙概念出现之前编写的,它相当复杂:客户端连接到服务器执行命令,进行数据传输(包括命令的输出LIST
,但不是直接在命令连接中的命令的输出PWD
),处于所谓的主动模式,即服务器发起连接(通常从端口 20,到客户端选择的随机端口)。
所有这些都使得“愚蠢”的防火墙难以让 FTP 与 PORT 命令配合使用。PASV 命令反而使客户端向服务器发起两次连接:一次用于命令,一次用于每次数据传输。但现在困难已经逆转:服务器的防火墙端必须应对服务器在传输PASV
包含 IP 和端口的命令答案时选择的随机端口。
您的结果如何?
您说过不能使用被动模式:这通常意味着 FTP 的服务器端位于限制性(本地或网络路径上)防火墙后面,该防火墙没有配置允许 FTP 服务器打开与命令输出相对应的临时随机监听端口
PASV
。对于主动模式:
我注意到PORT
您使用的命令的地址位于 100.64.0.0/10 网络中,该网络位于RFC 6598:
本文档请求分配 IPv4 /10 地址块作为共享地址空间,以满足运营商级 NAT(CGN)设备的需求。
和
o 共享地址空间网络的路由信息不得跨服务提供商边界传播。服务提供商必须过滤有关共享地址空间的传入广告。
o 具有共享地址空间源或目标地址的数据包不得跨服务提供商边界转发。服务提供商必须在入口链路上过滤此类数据包。
这可能是服务器返回的原因500 Illegal PORT command.
。由于客户端位于 CGN 后面,因此不可能(除非遇到一些困难,涉及尝试此类连接的双方的完全控制)从外部访问客户端。可能没有任何地方(通过执行 NAT 的设备)提供转换和处理此 FTP PORT 命令的传入连接,并且服务器拒绝了它,因为它是一个不可路由的地址(但更直接的原因是 FTP 服务器将只接受命令连接中使用的相同地址,以避免所谓的FXP 转账,并且 FTP 服务器看到的地址不是您的地址)。
简而言之:
- 您连接的 FTP 服务器无法使用被动模式
- 你的 ISP 不允许你使用主动模式
如果不投资其他东西,就没有解决方案:
如果您能够利用合适的人员让 FTP 服务器接受被动模式,请尝试一下。
更换 ISP
PORT
找一个不提供运营商级 NAT 地址的 ISP。然后任何随机家用路由器(可能包括 ISP 提供的路由器)都将正确处理主动 FTP 中的命令转换。
- 使用 VPN
这不应该是一个简单的商业 VPN,用于匿名使用其的客户。它应该是一个完整的 VPN,您可以完全控制它以允许传入流量并正确处理 FTP 协议。它可能是一个有限的 VPN,允许端口转发某些端口,这还需要在客户端进行配置以匹配相同的地址和端口,或者它可以是 Linux VPS,您可以在其中加载内核模块(如nf_conntrack_ftp
/ )nf_nat_ftp
并使用iptables或者nftables,自动转换来自客户端的 PORT 命令(只要 FTP 中没有使用加密)。
- 不要使用 FTP 来获取你寻找的资源
使其在 HTTP、HTTPS、SFTP(与 SSH 有关,与 FTP 无关)上可用...