# CentOS7 安装配置 vsftpd

## 安装依赖

安装 Berkeley DB 的命令行工具，用于生产虚拟用户文件数据库：

```
sudo yum -y install libdb-utils
```

安装 PAM，用于虚拟用户认证：

```
sudo yum -y install pam
```

## 安装 vsftpd

检查是否已安装：

```
rpm -qa | grep vsftpd
```

如果无，则安装：

```
sudo yum -y install vsftpd
```

如果有，则更新：

```
sudo yum -y update vsftpd
```

查看版本信息：

```
vsftpd -v
```

> vsftpd: version 3.0.2

## 生成 SSL 证书

检查当前版本 vsftpd 是否支持 SSL：

```
sudo ldd `which vsftpd` | grep ssl
```

> ​ libssl.so.10 => /lib64/libssl.so.10 (0x00007fa9662c2000)

使用 openssl 生成 SSL 证书：

```
sudo openssl req -x509
                 -nodes \
                 -days 3650 \
                 -newkey rsa:2048 \
                 -out /etc/vsftpd/vsftpd.pem \
                 -keyout /etc/vsftpd/vsftpd.pem
```

过程中需要输入的证书信息可随意填写，在使用 FTP 工具连接时，会显示填写的证书信息。

修改文件权限：

```
sudo chmod 400 /etc/vsftpd/vsftpd.pem
```

> **Tips:** 使用 FTP 工具连接时，需要设置使用 **显式 SSL/TLS** 方式连接。

## 创建宿主用户

创建宿主用户：

```
sudo useradd -M -s /sbin/nologin vsftpd
```

> **Tips:** `vsftpd` 为宿主用户名。

## 修改主配置文件

备份默认的主配置文件：

```
sudo mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
```

重新创建主配置文件：

```
sudo vim /etc/vsftpd/vsftpd.conf
```

插入配置信息：

```
# standalone mode
listen=YES
listen_port=21

# security
tcp_wrappers=NO
reverse_lookup_enable=NO

# PORT method
port_enable=YES
port_promiscuous=YES
connect_from_port_20=YES
ftp_data_port=20

# PASV method
pasv_enable=YES
pasv_promiscuous=YES
pasv_min_port=18000
pasv_max_port=19000

# SSL / TLS
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=HIGH
allow_anon_ssl=NO
require_ssl_reuse=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem

# timeout(s)
accept_timeout=60
connect_timeout=60
data_connection_timeout=300
idle_session_timeout=600

# log
#log_ftp_protocol=YES
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log

# anonymous user
anonymous_enable=NO

# local user
local_enable=YES
local_umask=022

# user list
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

# chroot list
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES

# virtual user
guest_enable=YES
guest_username=vsftpd
pam_service_name=vsftpd
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vuser_conf
```

> **Tip:**
>
> 配置项等号两边不能有空格。
>
> `pasv_min_port` 和 `pasv_max_port` 为被动模式端口起始范围。
>
> `guest_username` 为上面创建的宿主用户，是 FTP 操作的目录和文件的真正所有者。
>
> `pam_service_name` 为 PAM 认证配置文件名。
>
> `user_config_dir` 为存放虚拟用户独立配置文件的目录。

保存退出。

## 虚拟用户配置

### 添加虚拟用户

添加虚拟用户：

```
sudo vim /etc/vsftpd/vuser
```

在文件中添加虚拟用户名和密码：

```
test
test123
```

> **Tips:** 奇数行为用户名，偶数行为密码。

保存退出，并修改文件权限：

```
sudo chmod 400 /etc/vsftpd/vuser
```

生成虚拟用户认证使用的数据库文件：

```
sudo db_load -T -t hash -f /etc/vsftpd/vuser /etc/vsftpd/vuser.db
```

> **Tips:**
>
> 每次修改 `/etc/vsftpd/vuser` 文件内容后需重新生成一次认证文件。
>
> 如果出现以下错误：
>
> > db\_load： unexpected end of input data or key/data pair、db\_load： odd number of key/data pairs
>
> 在 `/etc/vsftpd/vuser` 最后添加一行空行，再重新生成用户认证文件。

修改认证文件权限：

```
sudo chmod 400 /etc/vsftpd/vuser.db
```

### PAM 认证配置

备份 vsftpd 默认的 PAM 认证文件：

```
sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
```

重新创建 PAM 文件：

```
sudo vim /etc/pam.d/vsftpd
```

插入配置（64 位系统）：

```
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
```

> **Tips:**
>
> 如果是 32 位系统：
>
> ```
> auth required pam_userdb.so db=/etc/vsftpd/vuser
> account required pam_userdb.so db=/etc/vsftpd/vuser
> ```

保存退出。

### 独立配置文件

新建用于存放虚拟用户独立配置文件的目录：

```
sudo mkdir /etc/vsftpd/vuser_conf
```

创建虚拟用户独立配置文件：

```
sudo vim /etc/vsftpd/vuser_conf/test
```

> **TIps:** `test` 为虚拟用户的用户名，一个虚拟用户，一个单独的配置文件。

写入该用户的独立配置：

```
local_root=/home/wwwroot/www.xxx.com
write_enable=YES
download_enable=YES
```

> **Tips:** `local_root` 为该虚拟用户 FTP 主目录。

保存退出。

创建该虚拟用户的主目录：

```
sudo mkdir -p /home/wwwroot/www.xxx.com
```

修改目录所有者：

```
sudo chown vsftpd:vsftpd /home/wwwroot/www.xxx.com
```

修改目录权限：

```
sudo chmod 755 /home/wwwroot/www.xxx.com
```

### 虚拟用户白名单

备份 vsftpd 默认的允许访问 FTP 的用户白名单文件：

```
sudo mv /etc/vsftpd/user_list /etc/vsftpd/user_list.bak
```

重新创建白名单文件，并添加允许访问 FTP 的用户名：

```
sudo vim /etc/vsftpd/user_list
```

> **Tips:** 一行一个用户名。

保存退出。

### chroot 白名单

创建允许执行 `chroot` 操作的虚拟用户白名单文件，根据需要添加用户名：

```
sudo vim /etc/vsftpd/chroot_list
```

> **Tips:**
>
> 正常虚拟用户会被限制在自己的主目录之内，允许执行 `chroot` 表示可以切换到主目录之外的目录。
>
> 一行一个用户名。

保存退出。

## 启动 vsftpd

启动 vsftpd 服务：

```
sudo systemctl start vsftpd
```

设置开机启动：

```
sudo systemctl enable vsftpd
```

## FirewallD 配置

查看 FirewallD 当前默认区域永久配置：

```
sudo firewall-cmd --permanent --list-all
```

> public target: default icmp-block-inversion: no interfaces: sources: services: ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

可见 `services` 没有添加了 `ftp` 服务，`ports` 中也没有添加 FTP 相关端口（20，21 等）。

永久添加 ftp 服务当当前默认区域：

```
sudo firewall-cmd --permanent --add-service=ftp
```

给 `ftp` 服务添加额外的 FTP 相关端口：

```
# 主配置文件中设置的主动模式传输数据端口 20/tcp
sudo firewall-cmd --permanent --service=ftp --add-port=20/tcp

# 主配置文件中设置的被动模式传输数据端口区域 18000-19000/tcp
sudo firewall-cmd --permanent --service=ftp --add-port=18000-19000/tcp
```

查看重载 FirewallD 规则之后永久生效的服务：

```
sudo firewall-cmd --permanent --list-service
```

> ssh ftp

查看重载 FirewallD 规则之后永久生效的 ftp 服务的信息：

```
sudo firewall-cmd --permanent --info-service=ftp
```

> ftp ports: 21/tcp 20/tcp 18000-19000/tcp protocols: source-ports: modules: ftp destination:

重载 FirewallD 规则：

```
sudo firewall-cmd --reload
```

> **Tips:** 阿里云主机需要在安全组规则中添加入方向的 `20/tcp, 21/tcp, 18000-19000/tcp` 端口。

## 日志管理

如需开启日志功能，先取消掉主配置文件中的 `#log_ftp_protocol=YES` 注释。

创建日志文件：

```
sudo touch /var/log/vsftpd.log
```

设置文件权限：

```
sudo chown vsftp:vsftp /var/log/vsftpd.log
```

重启 vsftpd 服务：

```
sudo systemctl restart vsftpd
```

## FTP 客户端

推荐使用免费开源全平台支持的 FileZilla：[FileZilla 官方下载](https://filezilla-project.org) 。

第一次连接的时候会提示 “未知证书”，并显示之前填写的证书信息，勾选 “在以后的会话中始终信任该证书“ 并确定即可。

## 参考文献

* [vsftpd](http://wiki.ubuntu.org.cn/vsftpd)
* [VSFTPD.CONF](http://vsftpd.beasts.org/vsftpd_conf.html)
* [vsftpd安装及虚拟用户配置](https://www.cnblogs.com/st-jun/p/7743255.html)
