这里确实有些地方出了问题。我使用 FileZilla 连接到正在运行的远程计算机时出现以下错误vsftpd
:
Command: LIST
Error: Connection timed out
Error: Failed to retrieve directory listing
我正在尝试在住宅 ISP 防火墙后面的 3 台机器上设置 FTP 服务。所有机器都是 Ubuntu 12.04 Server LTS,并且我被限制在远程站点外部使用端口 21。
好吧……好吧,我承认,是我在施加限制。我只是想让自己听起来像是在为一家真正的公司工作。无论如何,3 个系统中只有 1 个可以分配给 21,所以这仍然是一个问题。
我已尝试添加“pasv_...”行的解决方案,但仍然无法通过连接的 LIST 阶段。
- https://stackoverflow.com/questions/4723023/vsftpd-error-listing-directories
- http://www.linuxquestions.org/questions/linux-server-73/vsftpd-error-failed-to-retrieve-directory-listing-878838/
- https://serverfault.com/questions/421161/how-to-configure-vsftpd-to-work-with-passive-mode
- http://www.linuxquestions.org/questions/linux-networking-3/vsftpd-cannot-list-files-but-can-change-dirs-519340/
那么,如果失败了,问题可能出在哪里?
我继续阅读本网站我需要转发端口 20 和 21。目前,远程站点有端口 10000、11000、12000 转发到每个系统的内部端口 21。我是否应该将一些其他端口转发到 20?这没有意义,因为该端口甚至没有打开,vsftpd 只在监听 21。
我想要的只是通过这些转发端口成功建立 ftp 连接,但我感到沮丧,因为我已经成功转发了 SSH、apache2 等服务,但我不知道这里出了什么问题。
感谢 Joren 纠正我的格式!
编辑:我一直在摆弄直接暴露在互联网上的测试 VPS,我安装了 vsftpd 只是为了看看会发生什么,'netstat -tuna' 的输出显示来自我的 filezilla 客户端的成功连接如下所示:
tcp 0 0 vps.vps.vps.vps:21 fi.le.zil.la:54288 ESTABLISHED
tcp 0 0 vps.vps.vps.vps:46403 fi.le.zil.la:54289 TIME_WAIT
注意:由于涉及虚拟化环境的完全不相关的问题(“500 OOPS:priv_sock_get_cmd”),我的 VPS 上的 FTP 服务器一开始也无法工作。 读:我开始发现 Ubuntu 的 vsftpd 不能像 apache2 和 sshd 那样“开箱即用”,对于任何感到沮丧的新手系统管理员来说,如果它一开始就不能工作,不要以为你很愚蠢...
我的测试 VPS 没有防火墙,因此所有端口都可直接供 FTP 守护程序访问。运行此测试后,我发现此辅助连接可能在出现问题的远程站点被阻止(随机端口,例如 46403)。
至少现在我已经确认我的 Filezilla 没有 NAT 问题,因为显然 filezilla 正在打开随机端口并且可以与我的 VPS 进行通信。
唯一不合理的是,我的 VPS FTP 配置上设置了“connect_from_port_20=YES”,但我看不到任何使用端口 20 的连接!!! 这就是为什么我甚至不知道这个端口是否需要在防火墙后面转发。
我的一个知识缺陷是,我甚至不知道端口 20 是做什么的,而且我无法通过经验学习,因为我从未看到任何迹象表明该端口在连接、下载或上传过程中被使用过。
好的,我发现了一些问题(显然不止一个问题)——这与端口转发有关。
怀疑原来的问题(自定义 vsftpd.conf 之前)
- Filezilla 最初连接到远程端口 10000,==> 在内部 FTP 服务器上转到 21(正常)
- FTP 服务器打开一个随机端口(不是 20),例如 45678,但路由器显然没有针对此随机分配端口的规则。它发送一条消息告诉 filezilla 也连接到 45678。
- Filezilla 客户端在我的终端上通过 NAT 打开了自己的端口(正常)
- Filezilla 向 45678 发送连接请求,但远程路由器不接受该连接,因为该端口没有转发规则。
现在,我创建的问题:
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10000
- Filezilla 连接到远程端口 10000,==> 在内部 FTP 服务器上转到 21(正常)
- FTP 服务器打开它唯一可以打开的端口 10000,[愚蠢的时刻] 因为我脑子里有与该系统关联的端口。但 10000 实际上是该系统上 21 的 WAN 端对应端口。服务器发送一条消息让 FileZilla 连接到 10000,然后听内部 10000
- Filezilla 客户端在我的终端上打开了自己的随机端口(正常)
- Filezilla 尝试在端口 10000 建立辅助连接,远程路由器再次将其转移到端口 21,在该端口上该连接必须被忽略或丢失,而 FTP 服务器则等待永远不会到达的内部端口 10000 的连接。(失败)
我创建的第二个问题:这次我尝试绑定端口 21,但是我认为这搞乱了 filezilla。
pasv_enable=YES
pasv_min_port=21
pasv_max_port=21
- Filezilla 连接到远程端口 10000,==> 在内部 FTP 服务器上转到 21(正常)
- FTP 服务器打开端口 21(或者可能失败,因为 21 已经被使用)如果成功,它会发送一条消息让 filezilla 连接到端口 21。
- Filezilla 客户端在我的终端上打开了自己的随机端口(正常)
- Filezilla 向 21 发送 LIST 请求,但路由器不会接受...(失败)
结论:只要路由器更改端口,FTP 服务器就永远无法告诉客户端连接到正确的端口。如果您尝试使用内部端口,客户端将遇到路由器。如果您尝试指定外部端口,路由器会将传入连接转移到不同的号码——这是服务器所没有预料到的。
我将测试一个解决方案并在此报告结果。
我认为,由于 FTP 服务器协议似乎告诉客户端连接到哪个端口,所以辅助连接必须具有与内部相同的外部端口号。
我将其称为“二次连接”,我认为它与我不理解的端口 20 有关。
因此,我将联系远程站点并转发额外的端口直接地,因此 FTP 服务器可以在内部打开一个连接,并且客户端将能够向该精确的端口号发送连接请求。
新计划:
(注意:'%'表示远程路由器正在更改端口。)
服务器 #1 主连接:21 <--%--> 10000 次要连接 10001 <-----> 10001 vsftp.conf: pasv_min_port=10001 pasv_max_port=10001 服务器 #2 主连接 21 <--%--> 11000 次要连接 11001 <-----> 11001 vsftp.conf: pasv_min_port=11001 pasv_max_port=11001 服务器 #3 主连接 21 <--%--> 12000 次要连接 12001 <-----> 12001 vsftp.conf: pasv_min_port=12001 pasv_max_port=12001
答案1
我的路由器(fritz.box,德国)必须配置为以相同的方式解锁更高的端口,传出和进入!(上面:此“pasv_min.. 和 ...max”由 debian-vsftpd 插入/规定):
使用相应的按钮在 Fritz!Box-Router 中添加一系列未阻止的端口:
“其他应用程序”->“Portokoll”:TCP,来自端口:13450,bis 端口:13500(或范围内的高端口~50),“一台计算机”:RasPi,“一个 IP 地址”:(灰色,fritz.box-router 为我的“RasPi”提供的内部 LAN-IP 地址)-> 它来了:“一个端口”(= 相同范围!):13450,“bis 端口”:13450,并且它可以与 vsftpd 和 FTPS 配合使用(使用 OpenSSL + 强 DES-CBC3-SHA 密码的 AUTH TLS / SSL-Tranfer)...
这会将正确的端口和连接请求从我的小 RasPi-“服务器”(在 FB-NAT 后面)转发到相同范围的高(ER)端口上的传入/传出外部 IP 请求,就像正确连接的“电缆”到内部部分的相同端口一样...
可能的 vsftp 配置文件“/etc/vsftpd.conf”:
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
force_dot_files=YES
ssl_enable=YES
force_local_data_ssl=NO
force_local_logins_ssl=NO
allow_anon_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# rsa_cert_file=/etc/ssl/private/vsftpd.pem # not working alright, so single-lined:
rsa_cert_file=/etc/ssl/private/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key
pasv_enable=YES
# pasv_promiscuous=YES
# port_promiscuous=YES
pasv_addr_resolve=YES
pasv_address=[yourDNSadress.no-ip.com] # for Dynamic-DNS the routers daily changing IP.
# port_enable=YES
pasv_min_port=13450
pasv_max_port=13500
file_open_mode=0755
答案2
在我的例子中,我们的防火墙阻止了所有被动 FTP 端口,当我们尝试使用主动模式进行 FTP 时,它成功了。我们只打开了端口21在我们的防火墙上。
请检查您是否遇到这种情况,将您的 FTP 客户端设置更改为transfer mode
,active
然后尝试连接。
当我们的 FTP 客户端处于开启automatic
或模式时,它会在发送请求后passive
更改为模式,这会导致连接中断。passive
LIST
答案3
在 /etc/vsftpd.conf 中,您应该使用 pasv_min_port 和 pasv_max_port 设置提供一个端口范围,至少 2 或 3 个。
当您使用 FileZilla 客户端以被动模式连接到 vsftpd 时,vsftpd 将在 pasv_min_port 和 pasv_max_port 给出的范围内随机选择的另一个端口上回复数据连接。如果您试图在一个端口上执行所有操作,这可能会造成麻烦。
如果您使用端口 12001,请尝试:
pasv_min_port=12001
pasv_max_port=12005
答案4
步骤 1 - 关闭 Windows 防火墙(必须重启)
步骤 2 - 打开 Filezilla Clent 并更改加密类型文件 -> 站点管理器 -> 加密 -> 仅使用普通 FTP