vsftpd 跑起来不等于安全可用,关键三步是:关匿名(anonymous_enable=NO)、设 chroot(chroot_local_user=YES)、开写入(write_enable=YES),缺一不可。

vsftpd 能跑起来,不等于安全可用;本地用户能登录,不等于能上传或进对目录。最关键的三步是:关匿名、设 chroot、开 write_enable,缺一不可。
vsftpd 安装后为什么连不上?先查防火墙和端口
常见错误现象:Connection refused 或客户端卡在“正在连接”;netstat -tuln | grep :21 查不到监听,说明服务根本没起来或被拦截。
- CentOS/RHEL 7+ 必须执行
systemctl start vsftpd和systemctl enable vsftpd,仅yum install不会自动启动 - 防火墙必须放行端口:主动模式开
20/tcp和21/tcp;被动模式还需额外开放 PASV 端口范围(如50000-51000),并配置pasv_min_port/pasv_max_port - SELinux 默认阻止 FTP 写入家目录,必须运行
setsebool -P ftp_home_dir on,否则用户能登录但无法cd或put
local_enable=YES 但用户还是被拒绝?检查 ftpusers 和 user_list
即使配置了 local_enable=YES,系统仍可能静默拒绝登录——因为 /etc/vsftpd/ftpusers 是黑名单,/etc/vsftpd/user_list 默认也是黑名单(取决于 userlist_enable 和 userlist_deny 设置)。
-
/etc/vsftpd/ftpusers中的用户**永远禁止登录**,无论其他配置如何,root、bin、daemon 等默认就在其中 -
/etc/vsftpd/user_list行为由两个参数控制:userlist_enable=YES+userlist_deny=YES→ 名单内用户被拒;设为NO则只允许名单内用户登录 - 新建的
ftpuser如果不在ftpusers里,但登录时提示530 Permission denied,优先检查user_list是否误加了该用户名
chroot_local_user=YES 后上传失败或 500 OOPS 错误?别漏掉 allow_writeable_chroot
启用 chroot_local_user=YES 限制用户在主目录后,vsftpd 3.0.0+ 版本会强制要求该目录**不可写**,否则直接报 500 OOPS: vsftpd: refusing to run with writable root inside chroot()。
- 解决方法只有两个:要么改目录权限为
chmod 755 /home/resource(用户无法上传),要么加配置allow_writeable_chroot=YES -
allow_writeable_chroot=YES是绕过校验的开关,不是“推荐做法”,但它在生产中广泛使用——前提是目录属主是该用户且无全局写权限(即drwxr-xr-x不行,drwx------可以) - 如果用
useradd -d /home/resource ftpuser创建用户,记得同步设置目录属主:chown ftpuser:ftp /home/resource,否则即使可写也因权限不匹配被 SELinux 或 vsftpd 拒绝
FTPS 配置为什么证书总报错?注意 PEM 文件格式和路径权限
开启 ssl_enable=YES 后,客户端提示 SSL connection failed 或证书不受信任,大概率是证书生成或引用出问题。
- 证书文件必须是 PEM 格式且**私钥和证书合并到同一个文件**(
vsftpd.pem),OpenSSL 命令中-keyout和-out指向同一路径才有效 - 证书路径必须用绝对路径写入配置:
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.pem,不能用相对路径或环境变量 - 证书文件权限必须严格:
chmod 600 /etc/vsftpd/ssl/vsftpd.pem,否则 vsftpd 启动时静默忽略 SSL 配置(日志里可能只写WARNING: ssl_enable is set, but no certs found) - 隐式 FTPS(端口 990)需额外配置
listen_port=990和ssl_enable=YES,但多数客户端默认走显式 FTPS(端口 21 + AUTH TLS),别混用
最易被忽略的是 SELinux 和 ftpusers 的双重拦截——它不报具体错误,只让登录无声失败;调试时先临时 setenforce 0 和注释 user_list,确认基础通路再逐项打开加固。


















