一、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
| firewall-cmd --permanent --zone=public --add-port=21/tcp
firewall-cmd --permanent --zone=public --add-port=20/tcp
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
getenforce
|
(2)永久关闭(或配置权限)
1 2 3 4 5 6 7 8
| vim /etc/selinux/config
SELINUX=disabled
setsebool -P ftpd_full_access on
|
三、vsftpd 安装与基础运维
1. 检查是否已安装
1 2 3 4
| rpm -qa | grep vsftpd
vsftpd -v
|
2. 安装 vsftpd
通过 yum 一键安装(CentOS 官方源默认包含):
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
| anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YESxferlog_std_format=YES
xferlog_file=/var/log/xferlog
connect_from_port_20=YES
ascii_upload_enable=NO ascii_download_enable=NO
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list
pam_service_name=vsftpd
tcp_wrappers=YES
allow_writeable_chroot=YES
listen_port=60021
pasv_enable=YES
pasv_min_port=65400 pasv_max_port=65410
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
pasv_min_port=64000
pasv_max_port=65000
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_upload_enable=NO ascii_download_enable=NO
pam_service_name=vsftpd
tcp_wrappers=YES
local_root=/data/ftp
|
五、用户管理
vsftpd 支持本地用户和虚拟用户,虚拟用户与系统用户隔离,安全性更高,以下分两种场景配置:
1. 本地用户配置(单用户 / 简单场景)
(1)创建本地用户
创建仅用于 FTP 登录、禁止 SSH 登录的用户(如 ftpuser):
1 2 3 4 5 6 7
|
useradd -d /data/ftp -s /sbin/nologin ftpuser
echo "/sbin/nologin" >> /etc/shells
|
(2)设置用户密码
1 2 3 4
| passwd ftpuser
echo "ftppassword" | passwd --stdin ftpuser
|
(3)配置目录权限
确保用户对主目录有访问权限:
1 2 3 4 5 6 7 8 9 10 11
| mkdir -p /data/ftp
chown -R ftpuser:ftpuser /data/ftp
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
| 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 123456 hss 123456
|
(3)生成虚拟用户数据库文件
vsftpd 需读取数据库格式的用户文件,用 db_load 生成:
1 2 3 4
| db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db
chmod 600 /etc/vsftpd/vuser_passwd.db
|
(4)配置虚拟用户独立目录
为每个虚拟用户创建独立配置文件,实现目录隔离:
1 2 3 4 5 6
| mkdir /etc/vsftpd/vuser_conf
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 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
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
guest_username=vsftpd_guest
user_config_dir=/etc/vsftpd/vuser_conf
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 192.168.10.110 21
Name (192.168.10.110:root): ftpuser
Password:
ftp> ls ftp> cd upload ftp> put test.txt ftp> get test.txt ftp> bye
|
(2)lftp 命令(支持非交互登录)
1 2 3 4 5 6
| 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
| openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048 chmod 400 /etc/pki/CA/private/cakey.pem
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
|
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
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
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_enable=YES
force_local_logins_ssl=YES force_local_data_ssl=YES
require_ssl_reuse=NO
ssl_tlsv1=YES ssl_sslv2=YES ssl_sslv3=YES
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/.ssl/vsftpd.crt rsa_private_key_file=/etc/vsftpd/.ssl/vsftpd.key
debug_ssl=YES
|
5. 重启服务并测试
1 2
| systemctl restart vsftpd
|
九、常用 FTP 命令
| 命令 |
功能说明 |
ascii |
以 ASCII 格式传输文件(默认) |
binary |
以二进制格式传输文件(推荐,避免文件损坏) |
get 远程文件 [本地文件] |
下载远程文件到本地 |
put 本地文件 [远程文件] |
上传本地文件到远程 |
mget 远程文件列表 |
批量下载文件(如 mget *.txt) |
mput 本地文件列表 |
批量上传文件(如 mput *.txt) |
ls [远程目录] |
列出远程目录文件 |
cd 远程目录 |
切换远程目录 |
lcd 本地目录 |
切换本地目录 |
mkdir 目录名 |
在远程创建目录 |
rmdir 目录名 |
删除远程空目录 |
delete 文件名 |
删除远程文件 |
rename 旧名 新名 |
重命名远程文件 |
pwd |
显示当前远程目录 |
bye/quit/exit |
退出 FTP 连接 |