vsftpd:Very Secure FTP Daemon,主流轻量 FTP 服务;下面分 Ubuntu/Debian、CentOS/RHEL/openEuler/ 麒麟 两套,附带完整配置、防火墙、被动模式、用户权限、开机自启。 ⚠️ 注意:FTP 明文传输,生产优先 sftp;如果必须用 FTP,尽量搭配 SSL(ftps)。
一、Ubuntu / Debian(含 WSL Ubuntu)
1. 安装
apt update
apt install vsftpd -y
2. 查看状态 & 开机自启
# 查看状态
systemctl status vsftpd
# 开机自启
systemctl enable --now vsftpd
二、CentOS7 / RHEL7 /openEuler/ 银河麒麟(rpm 系)
# CentOS7
yum install vsftpd -y
# CentOS8+/openEuler
dnf install vsftpd -y
# 启动+开机自启
systemctl enable --now vsftpd
systemctl status vsftpd
三、前置准备:创建 FTP 用户(推荐独立用户,不要用 root)
# 创建用户 ftpuser,指定家目录 /data/ftp
useradd -d /data/ftp -s /sbin/nologin ftpuser
# 设置密码
passwd ftpuser
# 创建目录并授权
mkdir -p /data/ftp
chown ftpuser:ftpuser /data/ftp
chmod 755 /data/ftp
-s /sbin/nologin:禁止 ssh 登录,只能 ftp 登录,安全最佳实践
四、主配置文件 /etc/vsftpd.conf(Ubuntu) | /etc/vsftpd/vsftpd.conf(CentOS/openEuler)
先备份!必做
# Debian/Ubuntu
cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
# CentOS/openEuler
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
基础可用配置(本地用户登录,被动模式,禁止匿名)
打开编辑 vim /etc/vsftpd.conf
# 关闭匿名访问(安全)
anonymous_enable=NO
# 允许本地系统用户登录
local_enable=YES
# 开启上传写入
write_enable=YES
# 本地用户umask,文件权限 644,目录755
local_umask=022
# 开启被动模式(路由器/防火墙必须,客户端最常用)
pasv_enable=YES
# 被动端口范围,防火墙放行这个区间
pasv_min_port=40000
pasv_max_port=40100
# 被动模式对外IP(云服务器填公网IP,内网不用改)
# pasv_address=你的公网IP
# 禁锢用户在家目录(chroot,防止跳出目录,强烈开启)
chroot_local_user=YES
# chroot需要目录不能是可写!
allow_writeable_chroot=NO
# 日志
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
# 监听IPv4
listen=YES
listen_ipv6=NO
✅ 重点坑:
chroot_local_user=YES时,用户根目录不能是 777 可写,否则拒绝登录! 刚才我们/data/ftp权限 755 是没问题的。
配置修改后重载服务
# Ubuntu/Debian
systemctl restart vsftpd
# CentOS/openEuler
systemctl restart vsftpd
五、防火墙放行端口
FTP 需要 21 端口(控制端口) + 被动端口区间 40000-40100
ufw(Ubuntu)
ufw allow 21/tcp
ufw allow 40000:40100/tcp
ufw reload
firewalld(CentOS/openEuler)
firewall-cmd --add-service=ftp --permanent
firewall-cmd --add-port=40000-40100/tcp --permanent
firewall-cmd --reload
云服务器(阿里云 / 腾讯云):控制台安全组也要放行 21 + 40000-40100,很多人卡在这!
六、测试连接
客户端:FileZilla、xftp
协议:FTP
主机:服务器 IP
端口:21
用户:ftpuser
密码:刚才设置的密码
七、常见问题 & 排错
500 OOPS: vsftpd: refusing to run with writable root inside chroot() 原因:家目录权限 777 修复:
chmod 755 /data/ftp能连上,但是列表卡住、无法打开目录 → 被动端口没放行、pasv_address 公网 IP 没配置(云服务器必配)
匿名登录 需要把
anonymous_enable=YES,不推荐生产使用
八、可选:FTP over TLS(FTPS 加密,替代明文 FTP)
在 vsftpd.conf 追加:
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
客户端连接方式改成 FTPS(显式,端口 21)