本文介绍在Windows实例上,无法连接搭建在Linux实例上VSFTP(Very Secure FTP)服务问题的问题原因和解决方案。
问题描述
在Windows操作系统资源管理器的文件夹路径中,通过输入ftp://FTP站点所在的ECS实例公网IP地址:21方式,访问搭建在Linux实例上的VSFTP服务,出现无法连接或无法登录FTP站点的情况。产生类似报错:打开FTP服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹。
此时,使用抓包工具(例如Wireshark)抓取数据包进行分析,可以看到 PASV 命令的响应返回了 (0,0,0,0,126,7),说明服务端被动模式回传的是内网地址,导致客户端无法建立数据连接。关键抓包记录如下:
No. Time Source Destination Protocol Length Info
6722 32.375736 192.xxx 121.xxx FTP 60 Request: noop
6727 32.412040 121.xxx 192.xxx FTP 68 Response: 200 NOOP ok.
6728 32.412086 192.xxx 121.xxx TCP 54 55453 → 21 [ACK] Seq=7 Ack=15 Win=1023 Len=0
6729 32.412167 192.xxx 121.xxx FTP 74 Request: CWD /var/ftp/test/
6734 32.448657 121.xxx 192.xxx FTP 91 Response: 250 Directory successfully changed.
6735 32.448706 192.xxx 121.xxx TCP 54 55453 → 21 [ACK] Seq=27 Ack=52 Win=1022 Len=0
6736 32.448784 192.xxx 121.xxx FTP 62 Request: TYPE A
6748 32.485746 121.xxx 192.xxx FTP 84 Response: 200 Switching to ASCII mode.
6749 32.485788 192.xxx 121.xxx TCP 54 55453 → 21 [ACK] Seq=35 Ack=82 Win=1022 Len=0
6752 32.486040 192.xxx 121.xxx FTP 60 Request: PASV
6763 32.522403 121.xxx 192.xxx FTP 100 Response: 227 Entering Passive Mode (xxx).
6764 32.522449 192.xxx 121.xxx TCP 54 55453 → 21 [ACK] Seq=41 Ack=128 Win=1022 Len=0
24363 158.125984 192.xxx 121.xxx FTP 60 Request: noop
24372 158.162278 121.xxx 192.xxx FTP 68 Response: 200 NOOP ok.
24373 158.162327 192.xxx 121.xxx TCP 54 55453 → 21 [ACK] Seq=47 Ack=142 Win=1022 Len=0
24374 158.162385 192.xxx 121.xxx FTP 74 Request: CWD /var/ftp/test/
24386 158.198694 121.xxx 192.xxx FTP 91 Response: 250 Directory successfully changed.
24387 158.198732 192.xxx 121.xxx TCP 54 55453 → 21 [ACK] Seq=67 Ack=179 Win=1022 Len=0
24388 158.198881 192.xxx 121.xxx FTP 62 Request: TYPE A
24397 158.235159 121.xxx 192.xxx FTP 84 Response: 200 Switching to ASCII mode.
24398 158.235200 192.xxx 121.xxx TCP 54 55453 → 21 [ACK] Seq=75 Ack=209 Win=1022 Len=0
24401 158.235416 192.xxx 121.xxx FTP 60 Request: PASV
24423 158.271800 121.xxx.122 192.168.86.217 FTP 98 Response: 227 Entering Passive Mode (0,0,0,0,126,7).
24424 158.271831 192.xxx 121.xxx TCP 54 55453 → 21 [ACK] Seq=81 Ack=253 Win=1022 Len=0
问题原因
Windows操作系统资源管理器连接FTP时的默认连接模式为被动模式,因此在Linux实例上搭建VSFTP时需要开启被动模式。由于VSFTP默认监听IPv6地址,无法将FTP站点所在的Linux实例的IPv4地址通过被动模式返回给客户端(即返回地址会变成0.0.0.0),导致VSFTP的vsftpd.conf文件中的pasv_address配置无法生效,出现该问题。
FTP(File Transfer Protocol)是一种文件传输协议,工作模式支持主动模式和被动模式,更多工作模式信息,请参见搭建FTP站点(Linux)。
解决方案
在Linux实例上关闭IPv6功能并重启服务后即可重新连接FTP服务,操作步骤如下:
-
远程连接Linux实例。
具体操作,请参见连接方式概述。
-
执行
vim vsftpd.conf命令,修改vsftpd.conf文件,将listen_ipv6=YES参数替换为listen_ipv6=NO。listen=YES listen_ipv6=NO local_root=/var/ftp/test chroot_local_user=YES pasv_enable=YES allow_writeable_chroot=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES pasv_address=<ECS公网IP地址> pasv_min_port=50000 pasv_max_port=50100 -
执行如下命令,重启FTP服务。
systemctl restart vsftpd -
执行如下命令,查看FTP服务状态,确保FTP服务处于运行状态。
systemctl status vsftpd当FTP服务状态为running状态时,表示FTP服务已启动成功并正常运行。
[root@xxx ~]# systemctl restart vsftpd [root@xxx ~]# systemctl status vsftpd ● vsftpd.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled) Active: active (running) since Tue 2023-02-14 14:39:19 CST; 1s ago Process: 20375 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS) Main PID: 20376 (vsftpd) Tasks: 1 Memory: 692.0K CGroup: /system.slice/vsftpd.service └─20376 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf Feb 14 14:39:19 liuyi systemd[1]: Starting Vsftpd ftp daemon... Feb 14 14:39:19 liuyi systemd[1]: Started Vsftpd ftp daemon. -
重新访问FTP。
如果成功访问FTP,该问题解决。