远程访问 FTP 服务器时无法列出目录

远程访问 FTP 服务器时无法列出目录

我安装了 vsftpd,在本地访问时一切正常,但远程访问时无法查看文件夹。

在我的远程电脑上使用 FileZilla,我得到了以下信息:

status: connecting to 192.x.x.x
status: connection established, waiting for welcome message
response: welcome 
command: user admin
response: specify pass
command: pass ****
response: 230 login successful
command: opts utf8 on
response: 200 always in utf8 mode
status: connected
status: retrieving directory listing..
command: pwd
response: 257 "/var/ftp"
command: type I
response: 200 switching to binary mode
command: PASV
response: 227 entering passive mode (192.168.8.5,59,0).
command: list

然后就停在那里,然后连接超时。我无法查看 FTP 服务器上的文件夹或目录。

在我的iptables -L -n

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:21  
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:20

我的/etc/vsftp/vsftp.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
#chown_username=whoever
#xferlog_file=/var/log/xferlog
xferlog_std_format=YES
idle_session_timeout=120
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
ftpd_banner= Welcome 
#deny_email_enable=YES
#chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
#ls_recurse_enable=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES 

答案1

问题很可能在于您请求了被动模式 - 客户端需要在指定端口上打开与服务器的新数据连接 - 但您没有允许这些端口通过防火墙。例如,上面的数据连接应在端口 TCP/15104 (59*256+0) 上,但您只允许入站 TCP/21 和 TCP/20(或者,至少,您告诉我们的只是这些)。

在我们看到整个防火墙规则集之前,我们无法确定这一点;你能否修改问题以包括全部的的输出iptables -L -n -v

答案2

此时,FTP 服务器希望客户端通过端口 15014(59*256+0)上的 TCP 连接打开一个新连接来传输数据 - 服务器或客户端(或两者之间)上的防火墙可能会拒绝此连接。

IIRC wsftp 有几个配置设置,用于控制可能期望数据连接的端口范围。检查它们是什么(或将它们明确设置为您选择的范围),然后在防火墙规则中打开这些端口,就像您已经为 FTP 控制连接所做的那样。

如果您没有使用被动模式,那么在另一个方向上也会有类似的问题:服务器需要能够在先前的命令指定的端口上打开与客户端的连接。

控制和数据连接的这种分离通常会导致防火墙问题。如果您对 FTP 没有特定要求(与您无法更改的现有服务的兼容性,或只能访问 FTP 客户端的用户,或类似情况),我强烈建议使用大多数 SSH 守护程序提供的 SFTP/SCP - 这消除了多个任意连接问题(所有操作都通过一个双工 TCP 连接完成,通常在端口 22 上),并且也更加安全。

更新

控制数据连接端口的设置是pasv_min_portpasv_max_port,尽管这可能不是必需的。如果您加载 ip_conntrack_ftp 模块,那么它可能会跟踪 FTP 控制连接并将传入的数据连接标记为“相关” - 因此您可以添加 iptables 规则以允许来自端口 1024 或更高端口上的“相关”连接的数据包以及接受“已建立”连接的数据包。请参阅http://www.cyberciti.biz/faq/iptables-passive-ftp-is-not-working/#comments举个例子。

我仍然推荐通过 OpenSSH 或类似方式进行 SFPT/SCP - 它更安全且更易于管理。

答案3

如果本地一切正常,则网络连接似乎已中止。尝试在连接的两端使用数据包嗅探器检查,每一端是否都收到了发送给它的所有数据包。

还尝试在服务器上启用详细日志记录并检查发生了什么。

答案4

我在使用 winscp 时也遇到了同样的问题。这是由防火墙规则阻止 winscp 的入站流量引起的。请检查远程计算机上 FTP 客户端的防火墙入站规则。

相关内容