
# 搭建FTP站点（Huawei Cloud EulerOS 2.0）
#### 简介
FTP（File Transfer Protocol，文件传输协议）是一种在计算机之间通过网络传输文件的标准协议。它采用客户端-服务器架构，允许用户从远程服务器上传、下载、重命名、删除、查看文件和目录结构等。FTP有两种传输模式：
- 主动模式（Active）：服务器主动连接客户端的某个端口传输数据。
- 被动模式（Passive）：客户端主动连接服务器开放的端口，适用于防火墙限制较多的网络环境。
FTP支持以下的三种认证模式 ：
- 匿名认证
  - 无需用户名和密码，使用anonymous或ftp登录。
  
  - 通常用于公开资源下载，例如开源软件镜像站。
  
  - 安全性较低，只能访问受限目录（如 /pub），且通常只读。
   
- 本地用户认证
  - 使用Linux系统中的本地用户登录。
  
  - 通常用于内网资源共享或在开发测试环境中使用。
  
  - 用户名和密码来源于/etc/passwd和/etc/shadow。权限等同于系统用户，具有一定的操作风险。
   
- 虚拟用户认证
  - 用户不是真实的系统用户，独立建立账号数据库。通常设置统一的宿主账户（如vsftpd）进行访问控制。
  
  - 常结合gdbm或 libdb实现认证。
  
  - 更安全，权限可精细控制，不依赖系统用户。
   
vsftpd（very secure FTP daemon）是Linux下的一款小巧轻快、安全易用的FTP服务器软件。本教程介绍如何在HCE 2.0上安装并配置vsftpd，主要包括本地用户认证和虚拟用户认证两种方式。
#### 准备工作
- 准备两台ECS实例，并分配公网IP或者弹性公网IP（EIP）。一台作为服务端，一台作为客户端。

- 服务端安全组的入方向规则已放行21端口。
 
#### 前置条件
已完成yum源的配置，可参考[HCE的REPO源配置与软件安装](https://support.huaweicloud.com/usermanual-hce/hce_repo.html)进行公网yum源的配置。
#### 安装vsftpd软件
1. 执行如下命令安装vsftpd： 
   ```
   dnf install vsftpd
   ```
   
   
2. 执行如下命令启动vsftpd服务： 
   ```
   systemctl start vsftpd
   ```
   
   
3. 执行如下命令查看服务状态： 
   ```
   systemctl status vsftpd
   ```
   如果显示**active (running)** 则表示启动成功，示例如[图1]。
   图1vsftpd状态示例   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002304909218.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   如果需要将vsftpd设置为开机自启动，则需要再执行如下命令：
   ```
   systemctl enable vsftpd
   ```
   
   
 
#### 配置FTP服务器为本地用户认证方式
1. 为FTP服务添加用户 
   1. 执行如下命令为FTP服务创建一个用户：
      ```
      adduser ftpuser
      ```
      
   
   2. 执行如下命令为ftp用户设置密码：
      ```
      passwd ftpuser
      ```
      
   
   
   
   
2. 配置vsftpd服务 
   1. 执行如下命令为FTP服务创建目录和文件（可根据个人需要修改目录）：
      ```
      mkdir -p /data/ftp/
      touch /data/ftp/test.txt
      ```
      
   
   2. 执行如下命令将上述目录的拥有者设置为新用户：
      ```
      chown -R ftpuser:ftpuser /data/ftp/
      ```
      
   
   3. 打开"/etc/vsftpd/vsftpd.conf"文件，找到如下参数进行配置：
      ```
      # 监听IPv4 sockets。
      listen=YES
      # 根据需要选择是否配置监听IPv6
      listen_ipv6=NO
      ```
      在该配置文件的末尾添加下列参数，其中"pasv_address"参数为"准备工作"中的公网IP或者弹性公网IP（EIP）：
      ```
      # 设置本地用户登录后所在目录。
      local_root=/data/ftp
      #全部用户被限制在主目录。
      chroot_local_user=YES
      #开启被动模式。
      pasv_enable=YES
      pasv_address=<FTP服务器公网IP地址>
      # 是否允许用户访问其他目录
      chroot_list_enable=NO
      allow_writeable_chroot=YES
      # 如果chroot_list_enable配置为YES，则需要配置该选项；该配置为一个文件，包含哪些用户可以访问其他目录
      # chroot_list_file=/etc/vsftpd/chroot_list
      # 设置被动模式下，可使用的端口范围，建议把端口范围设置在一段比较高的范围内，有助于提高访问FTP服务器的安全性。
      # 可使用的端口范围的最小值，此例中是5000，请根据实际情况修改。
      pasv_min_port=5000
      # 可使用的端口范围的最大值，此例中是5010，请根据实际情况修改。
      pasv_max_port=5010
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      除上述提及的参数，其他参数保持默认值即可。
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/caution_3.0-zh-cn.png)
      无论是否配置chroot_list_enable，都需要创建"/etc/vsftpd/chroot_list"文件。
      
   
   4. 执行如下命令重启vsftpd服务：
      ```
      systemctl restart vsftpd
      ```
      
   
   
   
   
3. 验证 
   1. 执行如下命令查看vsftpd服务所使用的端口：
      ```
      netstat -natp | grep vsftpd
      ```
      默认情况下所使用的端口是21。
      
   
   2. 在安全组界面，入方向放开21端口和5000\~5010端口。
   
   3. 在客户端执行以下命令安装ftp客户端：
      ```
      yum install ftp
      ```
      
   
   4. 在客户端执行以下命令：
      ```
      ftp <FTP服务器公网IP地址>
      ```
      
   
   5. 按照提示输入账号和密码。
   
   6. 登录成功后，执行"ls"命令后可以看到test.txt文件表示配置成功。
      图2验证示例   
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002312874768.png "点击放大") 
   
   
   
   
 
#### 配置FTP服务器为虚拟用户认证方式
1. 创建虚拟用户账号并禁用shell登录 
   ```
   useradd vsftpd -s /bin/false
   ```
   这是虚拟用户的映射账号，用于访问系统资源，但不能登录系统。
   
   
2. 创建GDBM数据库 
   ```
   gdbmtool /etc/vsftpd/login.pag store ftpuser 123456
   ```
   - ftpuser：虚拟用户名示例
   
   - 123456：示例密码
   
   - login.pag：账户密码存储文件
   
   
   
   
3. 配置 PAM 模块，编辑/etc/pam.d/vsftpd文件，删除已有内容并写入以下内容： 
   ```
   auth    required    pam_userdb.so db=/etc/vsftpd/login
   account required    pam_userdb.so db=/etc/vsftpd/login
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   db=/etc/vsftpd/login实际指的是login.pag，无需扩展名。
   
   
4. 设置vsftpd配置文件，编辑/etc/vsftpd/vsftpd.conf文件，添加以下内容： 
   ```
   guest_enable=YES
   guest_username=vsftpd
   user_config_dir=/etc/vsftpd/user_conf
   #开启被动模式。
   pasv_enable=YES
   pasv_address=<FTP服务器公网IP地址>
   # 是否允许用户访问其他目录
   chroot_list_enable=NO
   allow_writeable_chroot=YES
   # 设置被动模式下，可使用的端口范围，建议把端口范围设置在一段比较高的范围内，有助于提高访问FTP服务器的安全性。
   # 可使用的端口范围的最小值，此例中是5000，请根据实际情况修改。
   pasv_min_port=5000
   # 可使用的端口范围的最大值，此例中是5010，请根据实际情况修改。
   pasv_max_port=5010
   ```
   
   
5. 配置虚拟用户访问权限 
   1. 创建用户权限配置目录
      ```
      mkdir -p /etc/vsftpd/user_conf
      ```
      
   
   2. 在/etc/vsftpd/user_conf/ftpuser文件写入以下内容：
      ```
      # 允许写操作（上传、改名、删除等）
      write_enable=YES
      # 允许本地系统用户（包括虚拟用户）登录 FTP 服务器
      local_enable=YES
      # 本地用户创建文件/目录时使用的权限掩码
      local_umask=077
      # 匿名用户创建文件/目录时的权限掩码
      anon_umask=022
      # 设置虚拟用户或本地用户登录后的根目录，限制用户只能访问该目录及其子目录
      local_root=/home/vsftpd/ftp
      # 允许匿名用户上传文件
      anon_upload_enable=YES
      # 允许匿名用户创建目录
      anon_mkdir_write_enable=YES
      # 允许匿名用户执行其他写操作，如删除或改名文件等
      anon_other_write_enable=yes
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      在vsftp中，虚拟用户虽然通过本地用户映射实现，但其权限控制沿用了匿名用户的配置方式，因此需依赖匿名用户相关选项来启用写操作。
      
   
   
   
   
6. 准备FTP根目录并赋权 
   ```
   mkdir -p /home/vsftpd/ftp/pub
   chmod 777 /home/vsftpd/ftp/pub
   ```
   
   
7. 重启vsftpd服务 
   ```
   systemctl restart vsftpd
   ```
   
   
8. 验证 
   1. 执行如下命令查看vsftpd服务所使用的端口：
      ```
      netstat -natp | grep vsftpd
      ```
      默认情况下所使用的端口是21。
      
   
   2. 在安全组界面，入方向放开21端口和5000\~5010端口。
   
   3. 在客户端执行以下命令安装ftp客户端：
      ```
      yum install ftp
      ```
      
   
   4. 在客户端执行以下命令：
      ```
      ftp <FTP服务器公网IP地址>
      ```
      
   
   5. 按照提示输入账号和密码。
   
   6. 登录成功后，执行"ls"命令后可以看到test.txt文件表示配置成功。
      图3验证示例   
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002346953933.png "点击放大") 
   
   
   
   
 
