
# 搭建FTP服务器（Linux）
#### 简介
FTP（File Transfer Protocol，文件传输协议）是一种在计算机之间通过网络传输文件的标准协议，采用客户端-服务器架构，允许用户从远程服务器上传、下载、重命名、删除、查看文件和目录结构等操作。FTP有两种传输模式，区别如下：
- 主动模式（Active Mode）
  - 客户端通过控制连接（默认端口21）向服务器发送命令，服务器随后主动通过数据连接（默认端口20）连接客户端指定的端口传输数据。
  
  - 适用于客户端网络环境无防火墙限制的场景，但可能因防火墙阻止服务器主动连接而失效。
   
- 被动模式（Passive Mode）
  - 客户端通过控制连接（端口21）发送PASV命令，服务器响应一个动态端口（如1024-65535），客户端主动连接该端口进行数据传输。
  
  - 适用于客户端位于防火墙或NAT后的场景，避免服务器主动连接被拦截。 如果华为云上的其他云服务器，需要通过公网IP地址访问本示例中L实例搭建的FTP服务器时，则需要使用被动模式。
    
   
本文介绍了如何使用Linux操作系统的L实例搭建FTP服务器。该指导具体操作以CentOS 7.2 64位操作系统为例。
#### 搭建FTP站点操作流程
Linux实例搭建FTP服务器的具体操作步骤如下：
1. [远程登录云服务器。]
2. [安装vsftpd。]
3. [配置vsftpd。]
4. [设置安全组。]
5. [客户端测试。]
 
#### 前提条件
已购买Linux操作系统的L实例，且L实例为"运行中"状态。
#### 操作步骤
1. 远程登录L实例。 
   1. 登录[Flexus应用服务器L实例控制台](https://console.huaweicloud.com/smb/?/resource/list)。
   
   2. 在资源卡片上，单击![](https://support.huaweicloud.com/bestpractice-flexusl/zh-cn_image_0000002673398289.png)图标，单击"重置密码"，根据界面提示设置L实例的密码。
      L实例无初始密码，创建L实例后，如需登录云主机，请先设置L实例的密码。如果已经设置过密码，请跳过此步骤。
      更多详情请参见[重置Flexus L实例密码](https://support.huaweicloud.com/usermanual-flexusl/instance_admin_0002.html)。
      
   
   3. 单击资源卡片上的"远程登录"按钮，在弹出的登录窗口中，单击"VNC登录"，根据界面提示输入用户名密码登录Flexus L实例。用户名为root，密码为上一步设置的密码。 更多登录方式请参见[登录方式概述](https://support.huaweicloud.com/usermanual-flexusl/server_login_0001.html)。
      
   
   
   
   
2. 安装vsftpd。vsftpd全称是"very secure FTP daemon"，是一款在Linux发行版中使用较多的FTP服务器软件。
   
   1. 执行以下命令安装vsftpd。
      ```
      yum install -y vsftpd
      ```
      回显如下类似信息时，表示软件安装成功。
      ![](https://support.huaweicloud.com/bestpractice-flexusl/zh-cn_image_0221473401.jpg "点击放大")
      
   
   2. 执行以下命令设置FTP服务开机自启动。
      ```
      systemctl enable vsftpd.service
      ```
      
   
   3. 执行以下命令启动FTP服务。
      ```
      systemctl start vsftpd.service
      ```
      
   
   4. 执行以下命令查看FTP服务端口。
      ```
      netstat -antup | grep ftp
      ```
      回显如下类似信息。
      ![](https://support.huaweicloud.com/bestpractice-flexusl/zh-cn_image_0221473402.jpg "点击放大")
      
   
   
   
   
3. 配置vsftpd。
   
   vsftpd安装后默认开启了匿名FTP的功能，使用匿名FTP，用户无需输入用户名密码即可登录FTP服务器，但没有权限修改或上传文件。用户如果试图使用Linux操作系统中的账号登录服务器，将会被vsftpd拒绝，但可以在vsftpd里配置用户账号和密码登录。以下操作以在vsftpd 里配置用户账号和密码登录FTP服务器为例。
   1. 执行以下命令创建"ftpadmin"用户。 此处"ftpadmin"用户为示例，可根据实际情况创建相应的用户。
      ```
      useradd ftpadmin
      ```
      
   
   2. 执行以下命令并按照提示设置"ftpadmin"用户密码。
      ```
      passwd ftpadmin
      ```
      
   
   3. 执行以下命令创建供FTP使用的文件目录，此处以"/var/ftp/work01"为例。
      ```
      mkdir /var/ftp/work01
      ```
      
   
   4. 执行以下命令将创建的文件目录所有者改为用于登录FTP的本地用户。
      ```
      chown -R ftpadmin:ftpadmin /var/ftp/work01
      ```
      
   
   5. 修改"vsftpd.conf"配置文件。
      1. 执行以下命令打开配置文件"vsftpd.conf"。
         ```
         vi /etc/vsftpd/vsftpd.conf
         ```
         
      
      2. 按**i**键进入编辑模式。
      
      3. 修改打开的"vsftpd.conf"文件。 可根据实际需求选择将FTP配置为主动模式或者被动模式。如果华为云上的服务器需要通过公网IP地址访问华为云上的实例搭建的FTP服务器时，需要将FTP服务器配置为被动模式。
         - 主动模式需要配置的参数如下：
           ```
           #设置以下参数，不允许匿名登录FTP服务器，允许本地用户登录FTP服务器，并指定FTP本地用户使用的文件目录。
           anonymous_enable=NO              #不允许匿名登录FTP服务器
           local_enable=YES                 #允许本地用户登录FTP服务器
           local_root=/var/ftp/work01       #FTP本地用户使用的文件目录
           #设置以下参数，限制用户只能访问自身的主目录。
           chroot_local_user=YES                      #所有用户都被限制在其主目录
           chroot_list_enable=YES                     #启用例外用户名单
           chroot_list_file=/etc/vsftpd/chroot_list   #例外用户名单
           allow_writeable_chroot=YES
           ```
           
         
         - 被动模式除了需要配置主动模式所需的所有参数外，还需要配置的参数如下：
           ```
           #设置以下参数，配置FTP支持被动模式。并指定FTP服务器的公网IP地址，以及可供访问的端口范围，端口范围请根据实际环境进行设置。
           listen=YES                    
           listen_ipv6=NO                
           pasv_address=xx.xx.xx.xx      #FTP服务器的公网IP地址
                      
           pasv_min_port=3000            #被动模式下的最小端口
           pasv_max_port=3100            #被动模式下的最大端口
           ```
           
          
      
      4. 按**Esc** 键退出编辑模式，并输入**:wq**保存后退出。
      
      5. 在"/etc/vsftpd/"目录下创建"chroot_list"文件。
         ```
         touch chroot_list
         ```
         "chroot_list"文件是限制在主目录下的例外用户名单。如果需要设置某个用户不受只可以访问其主目录的限制，可将对应的用户名写入该文件。如果没有例外也必须要有"chroot_list"文件，内容可为空。
         
       
   
   6. 执行以下命令重启vsftpd服务使配置生效。
      ```
      systemctl restart vsftpd.service
      ```
      
   
   
   
   
4. 设置安全组。
   
   搭建好FTP站点后，需要在L实例安全组的入方向添加放行FTP端口的规则，具体步骤参见[配置Flexus L实例安全组规则](https://support.huaweicloud.com/usermanual-flexusl/security_admin_0004.html)。放通的端口请参考[表1]。
   - 如果使用主动模式，需要在安全组中放行FTP站点使用的端口（默认为21）。
   
   - 如果使用被动模式，需要在安全组中同时放行FTP站点使用的端口（默认为21）和vsftpd.conf"文件设置的 pasv_min_port 到 pasv_max_port 之间的所有端口（本示例放通端口为3000-3100）。
   
   
    表1设置安全组规则 
   | 优先级 | 策略 | 类型   | 协议端口                               | 源地址       |
   |:---|:---|:---|:---|:---|
   | 1   | 允许 | IPv4 | 自定义TCP：20-21端口                     | 0.0.0.0/0 |
   | 1   | 允许 | IPv4 | 自定义TCP：1024-65535间的端口（例如3000-3100） | 0.0.0.0/0 |
      
   ![](https://support.huaweicloud.com/bestpractice-flexusl/public_sys-resources/note_3.0-zh-cn.png)
   安全组入方向规则的源地址设置为0.0.0.0/0或::/0，表示允许或拒绝所有外部IP地址访问您的实例，如果端口暴露到公网，可能导致网络入侵，造成业务中断、数据泄露或数据勒索等严重后果。**建议您将安全组规则设置为仅允许已知的IP地址访问，如下一步骤中要访问FTP服务器的客户端的IP地址。**
   
   
5. 客户端测试。
   
   打开客户端的计算机，可以是本地Windows计算机或者其他Windows系统的云服务器，在路径栏输入 "ftp://*FTP服务器公网IP地址* :*FTP端口*"，其中FTP服务器公网IP地址即本示例中的L实例公网IP地址，FTP端口不填则默认访问21端口。
   弹出输入用户名和密码的对话框表示配置成功，正确的输入用户名和密码后，即可对 FTP 文件进行相应权限的操作。
   ![](https://support.huaweicloud.com/bestpractice-flexusl/public_sys-resources/note_3.0-zh-cn.png)
   - 如果FTP服务器配置为主动模式，客户端使用此方法访问FTP站点时，需要对IE浏览器进行设置，才能打开FTP的文件夹。打开IE浏览器，选择"工具 \> Internet 选项 \> 高级"。勾选"启用FTP文件夹视图"，取消勾选"使用被动FTP"。
   
   - 使用浏览器访问FTP服务器出错时，建议您清除浏览器缓存后再尝试。
    
   您也可以在客户端上[下载FileZilla](https://filezilla-project.org/)进行文件传输等操作。
   
   
 
