> For the complete documentation index, see [llms.txt](https://avincheng.gitbook.io/notebook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://avincheng.gitbook.io/notebook/linux/centos/centos7-an-zhuang-pei-zhi-vsftpd.md).

# 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)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://avincheng.gitbook.io/notebook/linux/centos/centos7-an-zhuang-pei-zhi-vsftpd.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
