我通过 ssh 连接到我的 Google Compute Engine 的虚拟机。并想从那里 ftp 到另一台服务器。它询问我的用户名和密码,我可以毫无问题地登录。但是当我做 ls
或 get
时,我收到这个错误:
500 I won't open a connection to 10.240.XX.XX (only to XX.XX.XX.XX)
ftp: bind: Address already in use
那 10.240.XX.XX 是我在 ifconfig
结果中看到的内部 IP 地址。
如何使用 FTP 从另一台服务器传输文件?系统:Debian7
原文由 Nur Pinar 发布,翻译遵循 CC BY-SA 4.0 许可协议
您正在使用 FTP 的主动模式连接到运行 Pure-FTPd 的服务器。在主动模式下,服务器必须连接回客户端才能打开数据传输连接(用于文件传输或目录列表)。为此,客户端在
PORT
命令中将其 IP 地址发送到 FTP 服务器。如果 FTP 服务器在 GCE 专用网络之外,它显然无法连接回客户端机器,因为机器位于防火墙和 NAT 后面。
实际上,Pure-FTPd 明确检查
PORT
命令中的 IP 地址是否与 FTP 控制连接的客户端 IP 地址匹配。如果客户端在 GCE 网络中发送其内部 IP 地址,它将不匹配。如果在这种情况下,Pure-FTPd 服务器直接拒绝传输(甚至不尝试连接)并显示错误消息,您将获得:(其中第一个
...
是客户端在PORT
命令中提供的IP地址【GCE私网内的本地地址),第二个...
是客户端的外部 [NATed] IP 地址,如服务器所知)。即使客户端在
PORT
命令中报告了外部 [NATed] 地址,它仍然无法工作,因为连接尝试不会通过 NAT 和防火墙。为此,存在被动FTP模式,即客户端连接到服务器以打开数据传输连接。实际上,现在没有人使用主动模式。
有关这些模式的详细信息,请参阅(我的文章) FTP 连接 模式。
所以,切换到被动模式。如何完成是特定于客户的。
ftp
命令行客户端中,使用-p
命令行开关,尽管无论如何默认使用被动模式:部分客户端还支持
passive
命令。如果您在 Windows 上,则无法使用内置命令行
ftp.exe
客户端,因为它根本不支持被动模式。您必须安装第三方客户端。请参阅 如何在 Windows 命令提示符下使用被动 FTP 模式?