别用默认配置启动vsftpd,否则等于裸奔;安装命令必须按发行版区分:ubuntu/debian用apt、centos/rhel用yum或dnf,混用必报错;关键安全配置五项必改——anonymous_enable=no、local_enable=yes、write_enable=yes、chroot_local_user=yes、allow_writeable_chroot=yes,并需验证语法、重启服务,同时开放防火墙21端口及被动模式端口段,处理selinux布尔值。

直接说结论:别用默认配置启动 vsftpd,否则连上就等于把服务器裸奔给外网;安装命令必须按发行版严格区分,混用必报错。
怎么装?先看系统再敲命令
执行 cat /etc/os-release,重点看 ID= 那行:
- Ubuntu/Debian 系:用
sudo apt update && sudo apt install -y vsftpd - CentOS 7 / RHEL 7 / AlmaLinux 8+:用
sudo yum install -y vsftpd(RHEL 8+ 推荐dnf) - Rocky Linux 9 / Fedora:用
sudo dnf install -y vsftpd
别试 apt install vsftpd 在 CentOS 上跑——会提示 command not found;也别在 Ubuntu 上硬上 yum,包管理器不兼容,依赖直接崩。预装环境先跑 vsftpd -v,有输出(比如 vsftpd: version 3.0.5)就跳过安装,重复装可能触发服务冲突。
/etc/vsftpd.conf 必改的五项安全配置
开配置前先备份:sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak。打开后至少确认这五项:
-
anonymous_enable=NO——匿名登录不关,任何人均可无密码上传脚本 -
local_enable=YES——不开这个,你建的用户根本登不进 -
write_enable=YES——只让登录不让传文件,等于摆设 -
chroot_local_user=YES——不加这句,用户能cd /直接遍历整个系统 -
allow_writeable_chroot=YES——用户主目录权限是755(常见),不加这句登录直接报500 OOPS: vsftpd: refusing to run with writable root inside chroot()
新版 vsftpd(如 3.0.4+)默认开启 seccomp_sandbox=YES,在阿里云轻量、某些容器或低权限宿主机上会导致 chroot 失败,顺手改成 NO 更稳。
连不上?90% 是防火墙或 SELinux 拦的
先查服务是否真在监听:sudo ss -tlnp | grep :21。没输出,说明压根没起来,或被拦死。
- firewalld(CentOS/RHEL/Fedora):
– 放行控制端口:firewall-cmd --permanent --add-port=21/tcp
– 被动模式必须开数据端口段(仅放 21 不够!):firewall-cmd --permanent --add-port=40000-40100/tcp
– 最后 reload:firewall-cmd --reload - SELinux:
– 临时关掉测试:setenforce 0,如果连上了,就是它的问题
– 永久方案不是关 SELinux,而是开布尔值:setsebool -P ftp_home_dir on和setsebool -P allow_ftpd_full_access on
别信“关掉 firewalld 和 setenforce 0 就行”这种懒方案——生产环境禁用防火墙等于自废武功。
用户登录失败(530 / 503)?检查两个黑名单文件
哪怕你用 useradd 新建了用户,只要名字出现在以下任一文件里,vsftpd 就直接拒之门外:
-
/etc/vsftpd/ftpusers:硬性黑名单,root、bin、daemon 默认就在里面,删掉用户名或注释掉那行 -
/etc/vsftpd/user_list:行为由userlist_enable和userlist_deny共同决定;若userlist_deny=YES(默认),此文件也是黑名单
改完配置别忘了验证语法:sudo vsftpd /etc/vsftpd/vsftpd.conf,无输出才代表 OK;然后重启:sudo systemctl restart vsftpd,再用 systemctl status vsftpd 看有没有 “Failed to start”。
最易忽略的是被动模式端口范围和 allow_writeable_chroot 的联动——用户主目录权限是 755 却没开这项,错误码藏得深,排查时容易绕远路。











