在Windows实例上无法连接搭建在Linux实例上的VSFTP站点,如何处理?

更新时间:
复制为 MD 格式

本文介绍在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),导致VSFTPvsftpd.conf文件中的pasv_address配置无法生效,出现该问题。

说明

FTP(File Transfer Protocol)是一种文件传输协议,工作模式支持主动模式和被动模式,更多工作模式信息,请参见搭建FTP站点(Linux)

解决方案

Linux实例上关闭IPv6功能并重启服务后即可重新连接FTP服务,操作步骤如下:

  1. 远程连接Linux实例。

    具体操作,请参见连接方式概述

  2. 执行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
  3. 执行如下命令,重启FTP服务。

    systemctl restart vsftpd
  4. 执行如下命令,查看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.
  5. 重新访问FTP。

    如果成功访问FTP,该问题解决。