目录
- 安装 vsftpd
- 启动、停止、重启 vsftpd 服务
- 配置文件核心说明
- 核心配置项详解
- FTP 用户管理
- 防火墙与 SELinux 设置
- 客户端连接测试
- 常见问题与解决方案
安装 vsftpd
在大多数基于 Debian/Ubuntu 的系统上:

# 更新软件包列表 sudo apt update # 安装 vsftpd sudo apt install vsftpd
在大多数基于 CentOS/RHEL/Fedora 的系统上:
# 更新软件包列表 sudo yum check-update # 或 sudo dnf checkupdate # 安装 vsftpd sudo yum install vsftpd # 或 sudo dnf install vsftpd
安装完成后,vsftpd 服务通常会自动启动。
启动、停止、重启 vsftpd 服务
使用 systemctl 命令来管理 vsftpd 服务。
# 检查 vsftpd 服务状态 sudo systemctl status vsftpd # 启动 vsftpd 服务 sudo systemctl start vsftpd # 停止 vsftpd 服务 sudo systemctl stop vsftpd # 重启 vsftpd 服务 sudo systemctl restart vsftpd # 设置 vsftpd 开机自启 sudo systemctl enable vsftpd # 禁止 vsftpd 开机自启 sudo systemctl disable vsftpd
配置文件核心说明
vsftpd 的主配置文件是 /etc/vsftpd.conf,所有的配置修改都在这个文件中进行。

重要提示: 在修改配置文件之前,强烈建议先备份一份。
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
修改配置文件后,必须重启 vsftpd 服务才能使新配置生效。
sudo systemctl restart vsftpd
核心配置项详解
以下是一些最常用和最重要的配置项,您可以根据 /etc/vsftpd.conf 中的注释来理解它们。
基础设置
| 配置项 | 值 | 说明 |
|---|---|---|
anonymous_enable |
YES / NO |
是否允许匿名用户登录,默认为 YES,生产环境通常设为 NO。 |
local_enable |
YES / NO |
是否允许本地系统用户登录。通常设为 YES。 |
write_enable |
YES / NO |
是否允许在登录后进行写操作(如上传、创建目录、重命名、删除)。全局开关。 |
local_umask |
022 |
本地用户上传文件后,文件的默认权限掩码。022 意味着上传的文件权限为 755 (rwxr-xr-x)。 |
chroot_local_user |
YES / NO |
非常重要! 是否将本地用户限制在其家目录(home directory)中,设为 YES 是一种安全措施,防止用户访问系统其他目录。 |
allow_writeable_chroot |
YES / NO |
当 chroot_local_user 为 YES 时,如果用户的家目录是可写的,默认会拒绝登录,此选项允许在可写家目录中进行 chroot。CentOS 7+ 默认为 NO,需要手动开启。 |
匿名用户设置
| 配置项 | 值 | 说明 |
|---|---|---|
anon_upload_enable |
YES / NO |
是否允许匿名用户上传文件,需要 write_enable=YES 和 anonymous_enable=YES。 |
anon_mkdir_write_enable |
YES / NO |
是否允许匿名用户创建新目录。 |
anon_other_write_enable |
YES / NO |
是否允许匿名用户进行其他写操作(如删除、重命名)。 |
anon_root |
/path/to/dir |
指定匿名用户的登录根目录,而不是默认的 /var/ftp。 |
no_anon_password |
YES / NO |
匿名用户登录时是否需要输入密码,设为 YES 则直接登录。 |
日志与安全
| 配置项 | 值 | 说明 |
|---|---|---|
xferlog_enable |
YES / NO |
是否启用上传/下载日志记录。 |
xferlog_file |
/var/log/xferlog |
指定日志文件路径。 |
dual_log_enable |
YES / NO |
除了 xferlog 外,是否同时记录到 vsftpd_log_file。 |
vsftpd_log_file |
/var/log/vsftpd.log |
vsftpd 的标准日志文件。 |
pasv_enable |
YES / NO |
是否启用被动模式。客户端在防火墙后时必须开启。 |
pasv_min_port |
60000 |
被动模式使用的最小端口。 |
pasv_max_port |
65535 |
被动模式使用的最大端口。 |
userlist_enable |
YES / NO |
是否启用用户列表文件 (/etc/vsftpd.user_list) 来控制用户访问。 |
userlist_file |
/etc/vsftpd.user_list |
指定用户列表文件路径。 |
tcp_wrappers |
YES / NO |
是否使用 TCP Wrappers (如 /etc/hosts.allow, /etc/hosts.deny) 进行访问控制。 |
用户列表控制
当 userlist_enable=YES 时,userlist_file 中的行为由以下选项决定:

| 配置项 | 值 | 说明 |
|---|---|---|
userlist_deny |
YES / NO |
如果为 YES:userlist_file 中的用户被禁止登录。如果为 NO:只有 userlist_file 中的用户才允许登录,其他所有本地用户都被禁止。 |
FTP 用户管理
创建用户
创建一个专门用于 FTP 的用户,并将其家目录作为 FTP 根目录。
# 创建一个名为 ftpuser 的用户,家目录为 /home/ftpuser # -m 表示自动创建家目录 # -s /sbin/nologin 表示禁止该用户通过 SSH 登录,提高安全性 sudo useradd -m -s /sbin/nologin ftpuser # 为 ftpuser 设置密码 sudo passwd ftpuser
限制用户到其家目录 (chroot)
这是最常见的安全需求,有两种主要方法:
使用 chroot_local_user=YES (推荐)
在 /etc/vsftpd.conf 中设置:
chroot_local_user=YES
allow_writeable_chroot=YES
这种方法会将所有本地用户都限制在其家目录中。
使用 chroot_list_file (更灵活)
- 创建一个用户列表文件,
/etc/vsftpd.chroot_list。sudo touch /etc/vsftpd.chroot_list sudo nano /etc/vsftpd.chroot_list
- 在文件中输入需要被限制的用户名(每行一个)。
ftpuser anotheruser - 在
/etc/vsftpd.conf中添加以下配置:chroot_local_user=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list这种配置下,只有列表中的用户会被限制。
防火墙与 SELinux 设置
在 CentOS/RHEL 系统上,这是最容易出错的地方。
防火墙 (FirewallD)
# 永久开放 FTP 服务 (被动模式需要开放端口范围) sudo firewall-cmd --permanent --add-service=ftp # 如果手动设置了 pasv_min_port 和 pasv_max_port,也需要开放这个端口范围 # 假设 pasv_min_port=60000, pasv_max_port=61000 sudo firewall-cmd --permanent --add-port=60000-61000/tcp # 重新加载防火墙使配置生效 sudo firewall-cmd --reload
SELinux
如果系统启用了 SELinux,它会阻止 vsftpd 写入用户家目录,即使配置正确。
最简单的解决方案是临时关闭 SELinux 进行测试:
# 查看当前状态 sestatus # 临时设置为 enforcing 模式(重启后恢复) sudo setenforce 1 # 临时设置为 permissive 模式(只记录不阻止,重启后恢复) sudo setenforce 0 # 临时设置为 disabled(重启后恢复) sudo setenforce 0 # 这其实等同于 permissive
正确的解决方案是为 vsftpd 设置 SELinux 布尔值:
# 允许 FTP 用户写入其家目录 sudo setsebool -P ftpd_full_access on
注意:
-P参数会使这个设置永久生效,而不仅仅是当前会话。
客户端连接测试
您可以使用命令行 ftp 客户端或图形化工具(如 FileZilla)进行测试。
使用命令行 ftp
ftp your_server_ip
然后输入用户名和密码。
使用 FileZilla
- 打开 FileZilla。
- 在主机栏输入你的服务器 IP。
- 输入用户名和密码。
- 端口选择
21(FTP) 或22(SFTP,是 SSH 的一种,不是 FTP)。 - 协议选择
FTP - 文件传输协议。 - 如果连接被拒绝或超时,很可能是防火墙或 PASV 模式问题,在 FileZilla 的设置 -> 连接 -> FTP 模式中,尝试切换到“主动模式”或“被动模式”。
常见问题与解决方案
问题1:连接被拒绝 (Connection refused)
- 原因:
vsftpd服务未启动或防火墙阻止。 - 解决:
- 检查服务状态:
sudo systemctl status vsftpd。 - 启动服务:
sudo systemctl start vsftpd。 - 检查并开放防火墙端口:
sudo firewall-cmd --list-all,并按第6节所述开放 FTP 端口。
- 检查服务状态:
问题2:530 Login incorrect
- 原因:用户名或密码错误。
- 解决:确认用户名和密码正确。
问题3:500 OOPS: vsftpd: refusing to run with writable root chroot
- 原因:
chroot_local_user=YES且用户家目录是可写的,但allow_writeable_chroot=NO(这是 CentOS 7+ 的默认行为)。 - 解决:在
/etc/vsftpd.conf中添加或修改allow_writeable_chroot=YES。
问题4:425 Security: Bad Bounce
- 原因:客户端连接到服务器,但服务器无法主动连接回客户端(因为客户端在防火墙/NAT 后面),这是主动模式的问题。
- 解决:在服务器端和客户端都启用被动模式,服务器端确保
pasv_enable=YES,客户端(如 FileZilla)设置为被动模式。
问题5:本地用户可以登录,但被限制在家目录,无法上传文件
- 原因:SELinux 策略阻止了写入操作。
- 解决:执行
sudo setsebool -P ftpd_full_access on。
这份指南应该能覆盖您在使用 vsftpd 时遇到的大部分场景,祝您使用顺利!
