尝试连接到 vsftpd,无法检索目录列表

ajh*_*ual 5 vsftpd

有些东西在这里真的不起作用。使用 FileZilla 连接到运行的远程机器时出现以下错误vsftpd

Command:    LIST
Error:  Connection timed out
Error:  Failed to retrieve directory listing
Run Code Online (Sandbox Code Playgroud)

我正在尝试在住宅 ISP 防火墙后面的 3 台机器上设置 FTP 服务。都是 Ubuntu 12.04 Server LTS,我被限制在远程站点外部使用端口 21。

好吧.. 好吧,我承认,是我自己施加了限制。我只是想听起来像是在为一家真正的公司工作。无论如何,3个系统中只有1个可以分配给21个,所以这仍然是一个问题。

我已经尝试了添加“pasv_...”行的解决方案,但我仍然无法通过连接的 LIST 阶段。

那么,失败了,问题是什么?

我在这个站点上读到我需要转发端口 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
Run Code Online (Sandbox Code Playgroud)

注意:由于涉及虚拟化环境(“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之前)

  1. Filezilla 最初连接到远程端口 10000,==> 在内部 FTP 服务器上转到 21 (ok)
  2. FTP 服务器打开一个随机端口(不是 20),如 45678,但路由器显然没有针对这个随机分配的端口的规则。它发送一条消息告诉 filezilla 也连接到 45678。
  3. Filezilla 客户端在我的 NAT 后面打开了自己的端口(ok)
  4. Filezilla 向 45678 发送连接请求,但远程路由器不接受该连接,因为该端口没有转发规则。

现在,我创建的问题:

pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10000
Run Code Online (Sandbox Code Playgroud)
  1. Filezilla 连接到远程端口 10000,==> 在内部 FTP 服务器上转到 21 (ok)
  2. FTP 服务器打开它唯一可以打开的端口 10000,[愚蠢的时刻] 因为我脑子里有那个与该系统相关联的端口。但 10000 实际上是该系统上 21 的 WAN 侧对应。Server发送消息让FileZilla连接10000,内部监听10000
  3. Filezilla 客户端在我这边打开了它自己的随机端口(好的)
  4. Filezilla 在端口 10000 尝试辅助连接,远程路由器再次将其偏转到端口 21,在那里它必须被忽略或丢失,而 FTP 服务器等待从未到达的内部端口 10000 的连接。(失败)

我创建的第二个问题:这次我尝试绑定端口 21,但我认为这搞砸了 filezilla。

pasv_enable=YES
pasv_min_port=21
pasv_max_port=21
Run Code Online (Sandbox Code Playgroud)
  1. Filezilla 连接到远程端口 10000,==> 在内部 FTP 服务器上转到 21 (ok)
  2. FTP 服务器打开端口 21(或者可能失败,因为 21 已被使用)如果成功,它会发送一条消息让 filezilla 连接到端口 21。
  3. Filezilla 客户端在我这边打开了它自己的随机端口(好的)
  4. 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

小智 2

我的路由器(fritz.box,德国)必须配置为在传出和传入相同的情况下解锁较高的端口!(上图:这里的“pasv_min.. and ...max”由 debian-vsftpd 插入/规定):

使用相应按钮在 Fritz!Box-Router 中添加一系列未阻止的端口:
“其他应用程序”->“Portokoll”:TCP、von 端口:13450、bis 端口:13500(或 ~50 范围内的高端口) ,“一台计算机”:RasPi,“一个 IP_Adresse”:(灰显,由 fritz.box-router 给出的“RasPi”的内部 LAN-IP 地址)-> 来了:“一个端口”(=相同的范围!):13450,“bis 端口”:13450,这与 vsftpd 和 FTPS 配合得很好(使用 OpenSSL 进行 AUTH TLS / SSL 传输 + 强大的 DES-CBC3-SHA 密码)...

这将转发正确的端口并将来自和到我的小 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
Run Code Online (Sandbox Code Playgroud)


小智 1

在 /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