我遵循了每个指南,但就是无法通过 ftp 登录。
...
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: 21 remote: 21
229 Entering Extended Passive Mode (|||12028|)
550 Failed to open file.
221 Goodbye.
甚至在 iptables 中也有它:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpts:12000:12100
我已将min
和max
端口设置vsftpd.conf
为12000-12100
,并通过 AWS 控制台启用了相同的端口。
答案1
在您的具体情况下,我发现您有一个错误 550,这让我认为存在文件权限问题。
一般来说,当 vsftpd 在 EC2 上运行时,PASV 模式失败的最常见原因是 vsftpd 告诉客户端连接到私有 IP 地址并且客户端无法连接到它,原因很明显。
一种可能的解决方案是向该实例分配一个弹性 IP 地址,然后通过在 vsftpd.conf 中添加以下行来告诉 vsftpd 使用该公共 IP 地址(例如 1.2.3.4)宣布自己:
pasv_address=1.2.3.4
让我们回顾一下并看看 PASV 模式是如何工作的:
- 客户端通过连接 EC2 实例的公网 IP 上的 21 端口来开辟一个命令通道,该端口由 AWS 自身映射到该实例的私有 IP。
- 客户端通过打开的通道向 EC2 实例发送 PASV 命令
- vsftpd 知道它正在监听 EC2 实例的私有 IP 地址(实例的公共 IP 由 AWS 管理,在实例内部不可见),并向客户端发送响应,其中包含实例的私有 IP 地址和 12000 到 12100 之间的随机端口
- 客户端尝试连接 vsftpd 提供的 IP 和端口失败
当收到 PASV 命令时,强制pasv_address
vsftpd 返回指定的 IP 地址,而不是尝试猜测 IP 地址。
答案2
正如@Luca Gibelli 所说,这主要是文件权限问题。
如果您发布文件列表并检查具有哪些权限,可能会更好。
但我回答这个问题是为了提供有关pasv_address
EC2 上使用情况的一个小细节
如果您使用弹性 IP
pasv_address={your public IP address}
否则,也许最好使用
pasv_addr_resolve={your public domain or DNS}
看看这里:https://www.gosquared.com/blog/fix-ftp-passive-mode-problems-on-amazon-ec2-instances
答案3
有些路由器会阻止通过标准端口进行的常规 FTP。切换到非标准端口可以解决这个问题。