有些东西在这里真的不起作用。使用 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之前)
现在,我创建的问题:
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10000
Run Code Online (Sandbox Code Playgroud)
我创建的第二个问题:这次我尝试绑定端口 21,但我认为这搞砸了 filezilla。
pasv_enable=YES
pasv_min_port=21
pasv_max_port=21
Run Code Online (Sandbox Code Playgroud)
结论:只要端口正在被路由器更改,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