结论:必须禁用匿名登录、严格检查防火墙和selinux,否则90%连接失败源于此;安装前先用cat /etc/os-release确认系统类型,ubuntu/debian用apt、centos/rhel用yum或dnf,不可混用;配置后须用sudo vsftpd /etc/vsftpd/vsftpd.conf验证语法,并用ss -tlnp | grep :21确认端口监听。

直接说结论:别用匿名模式,别跳过防火墙和 SELinux 检查,否则 90% 的“连不上”“530 错误”“超时”都是这两处拦的。
确认系统类型再装 vsftpd
不同发行版的包管理器不互通,硬套命令会失败:
- Ubuntu/Debian:运行
cat /etc/os-release看到ID=ubuntu或ID=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
装完别急着启动。先检查有没有残留配置:ls -l /etc/vsftpd/vsftpd.conf。如果非空,先备份:sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak。
改完 vsftpd.conf 必须验证语法
默认配置等于裸奔——允许匿名登录、开放写权限、不限制路径。生产环境必须改这几项:
-
anonymous_enable=NO:关掉匿名访问,这是第一道防线 -
local_enable=YES:启用本地用户(比如你创建的ftpuser) -
write_enable=YES:允许上传,但单独开这个没用,得配合chroot -
chroot_local_user=YES:锁定用户在主目录,防止跳出到/ -
allow_writeable_chroot=YES:vsftpd 3.0.2+ 强制要求——若用户主目录有写权限(如/home/ftpuser),必须加这行,否则登录报500 OOPS: vsftpd: refusing to run with writable root inside chroot() -
seccomp_sandbox=NO:在阿里云轻量、某些容器或低权限环境里,不关沙箱会导致服务根本起不来
改完保存后,立刻验证:sudo vsftpd /etc/vsftpd/vsftpd.conf。没输出才是正常;有报错就按提示行号修,别靠猜。
防火墙和 SELinux 是最常被忽略的两个点
即使配置全对、服务也 running,ss -tlnp | grep :21 看不到监听,基本就是它俩挡的:
- 查端口是否真在监听:
sudo ss -tlnp | grep :21。没输出?说明服务没起来,或被拦截 - Firewalld(CentOS/RHEL):
sudo firewall-cmd --permanent --add-port=21/tcp+sudo firewall-cmd --permanent --add-service=ftp+sudo firewall-cmd --reload。只开 21 不够,被动模式还要放 PASV 端口段(后面配) - UFW(Ubuntu):
sudo ufw allow 21/tcp,同样要补 PASV 端口范围 - SELinux:
sudo setsebool -P ftp_home_dir on(允许 FTP 访问用户家目录);如果还连不上,临时测是否 SELinux 导致:sudo setenforce 0,能连上就说明需调策略,不是关它
被动模式(PASV)必须额外配端口段并放行,否则 FileZilla 会卡在“等待数据连接”。在 vsftpd.conf 加两行:pasv_enable=YES 和 pasv_min_port=40000、pasv_max_port=40100,然后防火墙同步放通 40000-40100 TCP。
用户权限和登录控制容易踩坑
本地用户能登录 ≠ 能上传/列目录,权限链上有三处可能断掉:
-
/etc/vsftpd/ftpusers是硬黑名单,root、bin、daemon 等默认在里面,删了或注释掉对应行才可能登录 -
/etc/vsftpd/user_list行为取决于userlist_enable和userlist_deny。常见组合是:userlist_enable=YES+userlist_deny=NO→ 此时user_list是白名单,你创建的用户必须加进去才能登录 - 用户主目录权限不能太松:
chmod 755 /home/ftpuser可以,chmod 777会触发allow_writeable_chroot报错(即使你开了那项) - 如果用
chroot_local_user=YES但又想让用户上传到子目录(比如/home/ftpuser/upload),确保该子目录属主是用户且有写权限:sudo chown ftpuser:ftpuser /home/ftpuser/upload && chmod 755 /home/ftpuser/upload
最后提醒一句:vsftpd 启动后,别只信 systemctl status vsftpd 显示 active,一定要用 ss -tlnp | grep :21 确认端口真在监听,再用客户端实测登录和上传——很多问题只在真实交互时暴露。











