CentOS 7搭建vsftpd服务器

一、vsftpd 概述

vsftpd(Very Secure FTP Daemon)是 Linux 系统中主流的 FTP 服务器软件,核心优势在于高安全性轻量高效,支持匿名用户、本地用户、虚拟用户三种认证方式,具备以下特点:

  • 以低权限用户运行,降低对系统的潜在危害;
  • 利用 chroot() 函数限制用户目录,防止越权访问系统文件;
  • 高权限操作(如登录、文件权限修改)由特殊上层程序控制,需严格身份验证;
  • 支持 IPv6、带宽限制、日志审计、虚拟主机、被动模式等功能;
  • 完全开源免费,兼容 CentOS、Ubuntu、BSD 等 UNIX 类系统。

二、安装前准备

搭建前需处理防火墙与 SELinux 限制(避免端口或权限拦截),建议先测试环境临时关闭,正式环境按需配置规则。

1. 防火墙配置

(1)临时关闭防火墙(测试用)

1
2
3
4
# 停止防火墙服务
systemctl stop firewalld
# 禁止防火墙开机自启
systemctl disable firewalld

(2)正式环境:开放 FTP 相关端口

vsftpd 需开放控制端口(默认 21,可自定义)和被动模式端口范围(数据传输用),示例如下:

1
2
3
4
5
6
7
8
9
10
# 开放控制端口(如默认21,或自定义60021)
firewall-cmd --permanent --zone=public --add-port=21/tcp
# 开放主动模式数据端口(20,仅主动模式需开放)
firewall-cmd --permanent --zone=public --add-port=20/tcp
# 开放被动模式端口范围(示例:64000-65000,可自定义)
firewall-cmd --permanent --zone=public --add-port=64000-65000/tcp
# 重新加载规则
firewall-cmd --reload
# 验证开放端口
firewall-cmd --list-ports

2. SELinux 配置

SELinux 可能拦截 FTP 访问,需临时关闭或永久配置权限:

(1)临时关闭(测试用)

1
2
3
setenforce 0
# 验证状态(输出 Permissive 表示临时关闭)
getenforce

(2)永久关闭(或配置权限)

1
2
3
4
5
6
7
8
# 编辑 SELinux 配置文件
vim /etc/selinux/config
# 将 SELINUX=enforcing 改为 SELINUX=disabled
SELINUX=disabled
# 保存后重启系统生效(或临时生效用 setenforce 0)

# 若不关闭 SELINUX,可允许 FTP 全权限(推荐)
setsebool -P ftpd_full_access on

三、vsftpd 安装与基础运维

1. 检查是否已安装

1
2
3
4
# 方法1:查看已安装的 vsftpd 包
rpm -qa | grep vsftpd
# 方法2:查看 vsftpd 版本
vsftpd -v

2. 安装 vsftpd

通过 yum 一键安装(CentOS 官方源默认包含):

1
yum install -y vsftpd

3. 服务运维命令

功能 命令
启动服务 systemctl start vsftpd.service
停止服务 systemctl stop vsftpd.service
重启服务(配置生效) systemctl restart vsftpd.service
查看服务状态 systemctl status vsftpd.service
开机自启 systemctl enable vsftpd.service
禁止开机自启 systemctl disable vsftpd.service

四、核心配置(vsftpd.conf)

vsftpd 主配置文件路径:/etc/vsftpd/vsftpd.conf,建议先备份原配置:

1
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.backup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#是否允许匿名,默认no
anonymous_enable=NO

#这个设定值必须要为YES 时,在/etc/passwd内的账号才能以实体用户的方式登入我们的vsftpd主机
local_enable=YES

#具有写权限
write_enable=YES

#本地用户创建文件或目录的掩码
local_umask=022

#当dirmessage_enable=YES时,可以设定这个项目来让vsftpd寻找该档案来显示讯息!您也可以设定其它档名!
dirmessage_enable=YES

#当设定为YES时,使用者上传与下载日志都会被纪录起来。记录日志与下一个xferlog_file设定选项有关
xferlog_enable=YESxferlog_std_format=YES

#上传与下载日志存放路径
xferlog_file=/var/log/xferlog

#开启20端口
connect_from_port_20=YES

#关于系统安全的设定值:
#ascii_download_enable=YES(NO)
#如果设定为YES ,那么 client 就可以使用 ASCII 格式下载档案。
#一般来说,由于启动了这个设定项目可能会导致DoS 的攻击,因此预设是NO。
#ascii_upload_enable=YES(NO)
#与上一个设定类似的,只是这个设定针对上传而言!预设是NO。
ascii_upload_enable=NO
ascii_download_enable=NO
#通过搭配能实现以下几种效果:
#①当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
#②当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd.chroot_list文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。
#③当chroot_list_enable=NO,chroot_local_user=YES时,所有的用户均不能切换到其他目录。
#④当chroot_list_enable=NO,chroot_local_user=NO时,所有的用户均可以切换到其他目录。

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

#这个是pam模块的名称,我们放置在/etc/pam.d/vsftpd
pam_service_name=vsftpd

#当然我们都习惯支持TCP Wrappers的啦!
tcp_wrappers=YES

#不添加下面这个会报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
allow_writeable_chroot=YES

#ftp的端口号
listen_port=60021
#启动被动式联机(passivemode)
pasv_enable=YES
#上面两个是与passive mode 使用的 port number 有关,如果您想要使用65400到65410 这 11 个 port 来进行被动式资料的连接,可以这样设定
pasv_min_port=65400
pasv_max_port=65410

#FTP访问目录
local_root=/data/ftp/

以下是核心配置参数,按功能分类:

1. 基础访问控制

参数 取值 说明
anonymous_enable YES/NO 是否允许匿名用户登录(默认 YES,安全起见设为 NO
local_enable YES/NO 是否允许本地系统用户(/etc/passwd 中的用户)登录(必须设为 YES
write_enable YES/NO 是否允许用户写操作(上传、删除、创建目录,需设为 YES 才支持)
local_umask 022 本地用户创建文件 / 目录的权限掩码(文件:644=666-022,目录:755=777-022)

2. 目录限制(chroot 配置)

chroot 用于将用户禁锢在指定目录,防止访问系统其他文件,核心参数组合如下:

chroot_local_user chroot_list_enable chroot_list_file 作用 效果总结
YES YES 列出的用户 允许 切换到其他目录 仅列表内用户可越权,其余用户被禁锢
YES NO 无效 所有用户 均被禁锢在主目录
NO YES 列出的用户 禁止 切换到其他目录 仅列表内用户被禁锢,其余用户可越权
NO NO 无效 所有用户 均允许切换到其他目录(不推荐)

必加参数allow_writeable_chroot=YES → 解决 “500 OOPS: vsftpd: refusing to run with writable root inside chroot ()” 报错(允许被禁锢用户的主目录有写权限)。

3. 被动模式配置

FTP 被动模式更适合客户端在防火墙后(如家庭网络),需指定端口范围:

1
2
3
4
5
6
7
8
# 启用被动模式
pasv_enable=YES
# 被动模式最小端口(自定义,如 64000)
pasv_min_port=64000
# 被动模式最大端口(自定义,如 65000)
pasv_max_port=65000
# 自定义控制端口(默认 21,可选,如 60021)
listen_port=60021

4. 日志与安全配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 启用上传/下载日志
xferlog_enable=YES
# 日志格式(标准格式)
xferlog_std_format=YES
# 日志路径
xferlog_file=/var/log/xferlog
# 禁止 ASCII 格式上传/下载(防止 DoS 攻击,默认 NO)
ascii_upload_enable=NO
ascii_download_enable=NO
# PAM 认证模块(默认 vsftpd,对应 /etc/pam.d/vsftpd)
pam_service_name=vsftpd
# 支持 TCP Wrappers(增强安全性)
tcp_wrappers=YES
# 本地用户默认访问目录(自定义,如 /data/ftp)
local_root=/data/ftp

五、用户管理

vsftpd 支持本地用户虚拟用户,虚拟用户与系统用户隔离,安全性更高,以下分两种场景配置:

1. 本地用户配置(单用户 / 简单场景)

(1)创建本地用户

创建仅用于 FTP 登录、禁止 SSH 登录的用户(如 ftpuser):

1
2
3
4
5
6
7
# -d:指定主目录(与 local_root 一致,如 /data/ftp)
# -s:指定登录shell(/sbin/nologin 或 /usr/bin/nologin,禁止 SSH 登录)
# -M:不自动创建主目录(已手动创建则加)
useradd -d /data/ftp -s /sbin/nologin ftpuser

# 若提示“shell /sbin/nologin does not exist”,需添加到 /etc/shells
echo "/sbin/nologin" >> /etc/shells

(2)设置用户密码

1
2
3
4
# 交互设置密码
passwd ftpuser
# 非交互设置密码(如密码 ftppassword)
echo "ftppassword" | passwd --stdin ftpuser

(3)配置目录权限

确保用户对主目录有访问权限:

1
2
3
4
5
6
7
8
9
10
11
# 创建主目录(若未创建)
mkdir -p /data/ftp
# 设置目录所有者为 ftpuser
chown -R ftpuser:ftpuser /data/ftp
# 设置目录权限(755:用户可读写执行,其他只读执行)
chmod -R 755 /data/ftp

# (可选)创建上传目录(单独授权写权限)
mkdir -p /data/ftp/upload
chown ftpuser:ftpuser /data/ftp/upload
chmod 755 /data/ftp/upload

2. 虚拟用户配置(多用户 / 高安全场景)

虚拟用户仅存在于 FTP 服务中,与系统用户隔离,适合多用户管理。

(1)创建宿主系统用户

虚拟用户需映射到一个低权限的系统宿主用户(如 vsftpd_guest):

1
2
3
4
5
# 创建宿主用户,禁止 SSH 登录,主目录 /home/vsftpd
useradd -d /home/vsftpd -s /sbin/nologin vsftpd_guest
# 设置目录权限
chown -R vsftpd_guest:vsftpd_guest /home/vsftpd
chmod -R 755 /home/vsftpd

(2)创建虚拟用户列表

创建文本文件存储虚拟用户账号密码(一行账号、一行密码):

1
2
3
4
5
6
vim /etc/vsftpd/vuser_passwd
# 内容示例(用户 wcj、hss,密码均为 123456)
wcj
123456
hss
123456

(3)生成虚拟用户数据库文件

vsftpd 需读取数据库格式的用户文件,用 db_load 生成:

1
2
3
4
# -T:转换格式,-t hash:哈希算法,-f:源文件,输出 db 文件
db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db
# 设置权限(仅 root 可读,防止密码泄露)
chmod 600 /etc/vsftpd/vuser_passwd.db

(4)配置虚拟用户独立目录

为每个虚拟用户创建独立配置文件,实现目录隔离:

1
2
3
4
5
6
# 创建虚拟用户配置目录
mkdir /etc/vsftpd/vuser_conf

# 为每个用户创建配置文件(如 wcj、hss)
touch /etc/vsftpd/vuser_conf/wcj
touch /etc/vsftpd/vuser_conf/hss

(5)编辑虚拟用户配置

以用户 wcj 为例,配置其独立目录和权限:

1
2
3
4
5
6
7
8
vim /etc/vsftpd/vuser_conf/wcj
# 内容如下
local_root=/home/vsftpd/wcj # wcj 的 FTP 目录
write_enable=YES # 允许写操作
anon_world_readable_only=NO # 允许浏览目录
anon_upload_enable=YES # 允许上传
anon_mkdir_write_enable=YES # 允许创建目录
anon_other_write_enable=YES # 允许删除/重命名

(6)创建用户目录并授权

1
2
3
4
5
6
7
8
# 为每个虚拟用户创建目录
mkdir -p /home/vsftpd/wcj /home/vsftpd/hss
# 创建上传子目录(解决主目录写权限问题)
mkdir -p /home/vsftpd/wcj/upload /home/vsftpd/hss/upload
# 授权(宿主用户 vsftpd_guest 拥有权限)
chown -R vsftpd_guest:vsftpd_guest /home/vsftpd
chmod -R 755 /home/vsftpd
chmod 777 /home/vsftpd/wcj/upload /home/vsftpd/hss/upload

(7)修改 vsftpd.conf 启用虚拟用户

vsftpd.conf 末尾添加:

1
2
3
4
5
6
7
8
9
10
11
# 启用虚拟用户功能
guest_enable=YES
# 虚拟用户映射的宿主用户(即 vsftpd_guest)
guest_username=vsftpd_guest
# 虚拟用户配置文件目录
user_config_dir=/etc/vsftpd/vuser_conf
# 虚拟用户权限:YES 与本地用户同权,NO 与匿名用户同权(默认 NO)
virtual_use_local_privs=YES
# 被动模式端口范围(与前文一致)
pasv_min_port=10060
pasv_max_port=10090

六、服务测试

配置完成后重启 vsftpd,通过以下方式测试是否正常运行:

1. 终端测试(ftp/lftp 命令)

(1)ftp 命令

1
2
3
4
5
6
7
8
9
10
11
12
# 连接 FTP 服务器(IP 为服务器地址,端口默认 21,自定义需加端口)
ftp 192.168.10.110 21
# 输入用户名(本地用户 ftpuser 或虚拟用户 wcj)
Name (192.168.10.110:root): ftpuser
# 输入密码
Password:
# 登录成功后,执行操作(示例)
ftp> ls # 查看目录
ftp> cd upload # 进入上传目录
ftp> put test.txt # 上传本地文件 test.txt
ftp> get test.txt # 下载服务器文件 test.txt
ftp> bye # 退出连接

(2)lftp 命令(支持非交互登录)

1
2
3
4
5
6
# 格式:lftp 用户名:密码@IP:端口
lftp ftpuser:ftppassword@192.168.10.110:21
# 执行操作
lftp ftpuser@192.168.10.110:/> ls
lftp ftpuser@192.168.10.110:/> cd upload
lftp ftpuser@192.168.10.110:/upload> put test.txt

2. 浏览器测试

在浏览器地址栏输入 ftp://服务器IP:端口,输入用户名密码后,可查看目录和下载文件(浏览器仅支持下载,不支持上传)。

3. 客户端测试(推荐)

使用 FTP 客户端(如 FileZilla、FlashFXP):

  • 主机:服务器 IP
  • 端口:21(或自定义端口)
  • 用户名 / 密码:本地用户或虚拟用户账号
  • 连接后可上传、下载、管理文件,直观验证功能。

七、常见问题与解决

1. 报错:500 OOPS: could not read chroot list file:/etc/vsftpd/chroot_list

原因:配置了 chroot_list_file=/etc/vsftpd/chroot_list,但该文件不存在。解决:创建空的 chroot_list 文件:

1
2
3
touch /etc/vsftpd/chroot_list
# 若需允许特定用户越权,将用户名添加到文件(一行一个)
echo "ftpuser" >> /etc/vsftpd/chroot_list

2. 报错:500 OOPS: chroot

原因:SELinux 限制了 chroot 操作。解决:临时关闭 SELinux(setenforce 0)或永久关闭(修改 /etc/selinux/config),或设置 SELinux 权限:

1
setsebool -P ftpd_full_access on

3. 登录失败:331 Please specify the password. 后报错

原因

  • 用户不在允许登录列表(user_list);

  • 用户在禁止登录列表(/etc/vsftpd/ftpusers);

  • 目录权限不足。

    解决

  • 将用户添加到 /etc/vsftpd/user_list(一行一个);

  • 确保用户不在 /etc/vsftpd/ftpusers 中;

  • 重新配置目录权限(chown -R 用户名:组 /目录chmod -R 755 /目录)。

八、进阶配置:FTPS 加密传输

FTP 默认明文传输,通过 FTPS(FTP over SSL/TLS)加密数据,需生成 SSL 证书:

1. 安装 openssl

1
yum install -y openssl openssl-devel

2. 生成 CA 私钥与自签证书

1
2
3
4
5
6
7
# 生成 CA 私钥(2048位,路径 /etc/pki/CA/private/cakey.pem)
openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
chmod 400 /etc/pki/CA/private/cakey.pem

# 生成 CA 自签证书(有效期 365 天)
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
# 按提示输入信息(Country Name、State 等,可随意填写)

3. 生成 vsftpd 证书与私钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建证书目录
mkdir -p /etc/vsftpd/.ssl
chmod 400 /etc/vsftpd/.ssl

# 生成 vsftpd 私钥
openssl genrsa -out /etc/vsftpd/.ssl/vsftpd.key 2048
chmod 400 /etc/vsftpd/.ssl/vsftpd.key

# 生成证书请求文件
openssl req -new -key /etc/vsftpd/.ssl/vsftpd.key -out /etc/vsftpd/.ssl/vsftpd.csr

# 签发 vsftpd 证书(需先初始化 CA 索引和序列号)
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
openssl ca -in /etc/vsftpd/.ssl/vsftpd.csr -out /etc/vsftpd/.ssl/vsftpd.crt -days 365

4. 配置 vsftpd 启用 SSL

vsftpd.conf 末尾添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 启用 SSL
ssl_enable=YES
# 强制本地用户登录和数据传输加密
force_local_logins_ssl=YES
force_local_data_ssl=YES
# 禁用 SSL 会话重用
require_ssl_reuse=NO
# 支持的 SSL 版本
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
# SSL 密码等级
ssl_ciphers=HIGH
# 证书和私钥路径
rsa_cert_file=/etc/vsftpd/.ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/.ssl/vsftpd.key
# 启用 SSL 调试日志
debug_ssl=YES

5. 重启服务并测试

1
2
systemctl restart vsftpd
# 使用支持 FTPS 的客户端(如 FileZilla),选择“FTP over TLS”连接

九、常用 FTP 命令

命令 功能说明
ascii 以 ASCII 格式传输文件(默认)
binary 以二进制格式传输文件(推荐,避免文件损坏)
get 远程文件 [本地文件] 下载远程文件到本地
put 本地文件 [远程文件] 上传本地文件到远程
mget 远程文件列表 批量下载文件(如 mget *.txt
mput 本地文件列表 批量上传文件(如 mput *.txt
ls [远程目录] 列出远程目录文件
cd 远程目录 切换远程目录
lcd 本地目录 切换本地目录
mkdir 目录名 在远程创建目录
rmdir 目录名 删除远程空目录
delete 文件名 删除远程文件
rename 旧名 新名 重命名远程文件
pwd 显示当前远程目录
bye/quit/exit 退出 FTP 连接

CentOS 7搭建vsftpd服务器
https://netguy6.github.io/2026/02/05/CentOS 7搭建vsftpd服务器/
作者
net06
发布于
2026年2月5日
许可协议