运行 Google Compute 实例。由于遗留原因,我需要使用 FTP 作为客户端(而不是服务器)来访问其他人的 FTP 服务器。
我尝试过“被动”模式,但没有结果:
instance-1:~$ ftp -p 123.123.123.123 <--- note –p option for passive mode
Connected to 123.123.123.123.
220 (vsFTPd 3.0.3)
Name (123.123.123.123:user): username
FTP server
331 Please specify the password.
Password:
230 Login successful. <--- note successful login
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (123,123,123,123,21).
(system hangs at this point, for about 1-2 minutes)
ftp: connect: Connection timed out
ftp>
(IP 地址和用户名已删除)
尝试get filename.ext
已知文件也会失败。
如果我尝试使用非被动模式,我会立即收到以下错误:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
500 Illegal PORT command.
ftp: bind: Address already in use
有什么想法吗?我尝试打开端口 20 和 21 作为入口,并且我假设出口端口可用。
请不要评论安全性方面或 SFTP 等替代方案。这是一个针对数百台服务器的自动数据收集过程,因此要求旧客户切换到 SFTP 或更安全的 API 是不切实际的,而且传输的数据无论如何都不是敏感的。
提前感谢你的帮助!
答案1
对于非被动模式,您必须“重写”发送到服务器的 PORT 命令 IP 数据包(它包含内部 IP 地址,而不是公共 IP 地址)。请参阅我为 Google Cloud 提供的临时解决方案这里。
答案2
其根本原因可能与这里,如果您以被动模式连接,则应打开一系列更高的端口。