我在 VPS (ovh) 上安装了 pureftpd。我可以列出一个小目录(我所说的小目录是指只有一些文件的目录),但如果我尝试列出一个包含数千个文件(包括目录)的大目录,我会收到来自 filezilla 客户端的“无法检索目录列表”错误消息当我单击“ps”目录时:
Command: USER xxxxx
Response: 331 User xxxxx OK. Password required
Command: PASS ************
Response: 230 OK. Current directory is /
Command: OPTS UTF8 ON
Response: 200 OK, UTF-8 enabled
Status: Connected
Status: Retrieving directory listing...
Command: CWD /ps
Response: 250 OK. Current directory is /ps
Command: TYPE I
Response: 200 TYPE is now 8-bit binary
Command: PASV
Response: 227 Entering Passive Mode (<my_vps_ip>,156,188)
Command: MLSD
Response: 150 Accepted data connection
Response: 226-Options: -a -l
Response: 226 33 matches total
Error: Connection timed out
Error: Failed to retrieve directory listing
从命令行我只是有一个永无止境的等待:
ftp> cd ps
250 OK. Current directory is /ps
ftp> ls
200 PORT command successful
150 Connecting to port 38359
我将此规则添加到 iptables 中,因为我读到它可以解决我的服务器上的问题:
root@vpsxxx:/var/www/html# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data ctstate RELATED,ESTABLISHED /* Allow ftp connections on port 20 */
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpts:1024:65535 ctstate ESTABLISHED /* Allow passive inbound connections */
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data ctstate ESTABLISHED /* Allow ftp connections on port 20 */
ACCEPT tcp -- anywhere anywhere tcp spts:1024:65535 dpts:1024:65535 ctstate RELATED,ESTABLISHED /* Allow passive inbound connections */
我在 puretpd 中添加了被动模式的修复端口范围:
root@xxx:/var/www/html# cat /etc/pure-ftpd/conf/PassivePortRange
40110 40210
root@xxx:/var/www/html#
这些是我试图列出的 ps 目录的权限:
drwxr-xr-x 25 root root 4096 May 9 08:29 ps
这是我的客户端操作系统(Debian 8)上的 iptables:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
看起来我所尝试的一切都是无用的,没有效果。我尝试使用wireshark分析流量,看起来我在FTP-DATA协议包中得到了目录列表的一部分,但随后出现了问题,但我不知道是什么......
刚刚注意到我在 proftpd 上遇到了同样的问题,我认为使用 puretpd 会更好,但没有:)
答案1
根据您的问题描述,包括您的评论,您的防火墙 ( iptables
) 会阻止来自/到 TCP 端口 20 和 21 的连接。即使您使用被动 ftp(传入 21 显然已经打开),您也需要这些连接。
为了了解更多信息,请搜索日志中的防火墙块,例如
dmesg | grep -i firewall | tail -40
在您尝试下载该文件但失败后。
此外,AppArmor 或其他安全功能也可能会阻止您pureftpd
提供这些文件的进程。所以,如果上面没有显示端口阻塞,可以通过解除阻塞来解决问题,还请查看您的日志文件(尝试ls -ltr /var/log
对候选日志文件进行检查,除了dmesg
不带 s 的输出grep
)。