我有一台运行 Centos 7 和 vsftpd-3.0.3 的服务器(从源代码安装以获取最新版本,尽管我描述的所有内容也适用于之前安装的 vsftpd-3.0.2 版本)。
vsftpd 配置为使用范围为 10100-10500 的被动端口,防火墙允许所有必要的端口。服务器位于我无法控制的某些路由/NAT 后面,但似乎运行正常。
从 Fedora 30 机器远程连接:
$ curlftp://ftp.domain.com # works - 显示目录列表
$ wgetftp://ftp.domain.com # 失败
==> PASV ... couldn't connect to 10.xx.xx.xx port 45027: Connection refused
$ lftp ftp.domain.com # 有效 - 以匿名身份登录并且“ls”返回目录列表
$ ftp ftp.domain.com # 失败 - 使用匿名用户登录,ls 返回
ftp> ls
227 Entering Passive Mode (10,xx,xx,xx,176,231).
ftp: connect: Connection refused
由于 curl 和 lftp 可以工作,我不明白它怎么能成为服务器设置,但我不知道为什么 wget 和 ftp 不工作。
答案1
...防火墙允许所有必要的端口。
这表明服务器和客户端不在同一网络中。我猜服务器在某个内部网络中,而客户端在互联网上的某个地方。
227 进入被动模式(10,xx,xx,xx,176,231)。
服务器提供一个私有的不可路由地址(即 10.xx.xx.xx)作为客户端应连接的目标。鉴于上述假设,即客户端位于互联网上的其他地方,这种连接是不可能的。
这实际上是 FTP 服务器位于内部网络的防火墙后面时出现的典型错误。由于这种情况很常见,一些客户端会通过忽略服务器提供的 IP 地址来解决此问题,只使用端口并将其与用于 FTP 控制连接的 IP 地址相结合。其他客户端不会解决这个问题。
无论如何 - 服务器设置是罪魁祸首,应该修复。如何修复取决于具体服务器,但对于 proftp 有一个MasqueradeAddress
设置,其他一些 FTP 服务器也有类似的设置。另请参阅防火墙后面的 ProFTPd 服务器返回内部 IP 地址。