vsftpd在Ubuntu上默认拒绝可写chroot目录,报错“500 OOPS”,因其安全机制要求chroot根目录不可写;解决方法为:设主目录不可写并建可写子目录,或配置allow_writeable_chroot=YES(内网可用,生产环境慎用)。

vsftpd 是 Ubuntu 上最常用、最轻量也最安全的 FTP 服务实现。直接用它,别折腾 proftpd 或 pure-ftpd ——除非你明确需要它们的某项特性(比如 LDAP 集成或虚拟用户数据库)。默认配置下 vsftpd 启动即用,但裸配会出问题:常见是连得上却进不去家目录、上传失败、被动模式卡死,或者被防火墙/SELinux 拦住。
为什么 vsftpd 默认拒绝 chroot?
新版 vsftpd(尤其是 Ubuntu 18.04+)默认启用 chroot_local_user=YES 时,会要求被 chroot 的目录**不可写**(即 /home/ftpuser 不能对 ftpuser 可写),否则直接拒绝登录并报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()。
这不是 bug,是安全加固机制。解决方法只有两个:
- 把用户主目录设为不可写(
chmod a-w /home/ftpuser),再在下面建一个可写子目录(如/home/ftpuser/upload)供上传; - 加一行配置
allow_writeable_chroot=YES(仅限测试环境或内网可信场景)——注意它绕过了 chroot 安全检查,生产环境慎用。
如何让 passive mode(PASV)真正可用?
很多用户配置完发现客户端能连控制端口(21),但 LIST/RETR 失败,卡在“数据连接超时”——这基本是 PASV 模式没调通。
vsftpd 默认 PASV 端口范围是随机高端口(1024–65535),而云服务器或家用路由器几乎都只放行 20/21 端口。必须显式限定端口段,并在防火墙和 NAT 规则里同步放开:
- 在
/etc/vsftpd.conf中添加:pasv_enable=YES pasv_min_port=10000 pasv_max_port=10100
- Ubuntu 自带
ufw的话,运行:sudo ufw allow 10000:10100/tcp; - 如果是云服务器(如阿里云、腾讯云),还要在安全组里放行
10000–10100TCP 端口; - 若服务器在 NAT 后(比如公司内网),需在路由器上做端口映射:将公网 IP 的
10000–10100映射到内网服务器对应端口。
local_enable=YES 但登录仍被拒绝?检查三件事
常见现象:用户明明存在、密码正确、local_enable=YES 已开,却提示 530 Permission denied。
优先排查以下三项:
-
/etc/vsftpd.user_list和/etc/vsftpd.chroot_list文件内容 —— 如果userlist_enable=YES(默认开启),且用户出现在user_list中,就会被**默认拒绝**(哪怕密码对);要么删掉该用户名,要么把userlist_deny=NO改成YES(表示 list 里的是允许名单); -
ftpusers文件 —— 这是黑名单,root、daemon、sys 等系统用户默认在里面;如果你的用户名也在其中,会被无条件拒登; - 用户 shell 是否合法 ——
vsftpd默认只允许/bin/bash、/bin/sh等白名单 shell 登录;如果用户 shell 是/usr/sbin/nologin或/bin/false(常见于纯 FTP 用户),需加配置:check_shell=NO。
重启后配置不生效?别只 systemctl restart
改完 /etc/vsftpd.conf 后,执行 sudo systemctl restart vsftpd 是常规操作,但容易忽略两点:
- 配置语法错误会导致服务启动失败,但
systemctl不一定立刻报错;务必检查:sudo systemctl status vsftpd和sudo journalctl -u vsftpd -n 20 --no-pager; - 某些旧版 Ubuntu(如 16.04)仍用 SysV init,
service vsftpd restart才有效;不确定时,用ps aux | grep vsftpd看进程是否真重启了; - 修改了用户目录权限(如
chown或chmod)后,记得确认 SELinux 或 AppArmor 没拦截 —— Ubuntu 默认用 AppArmor,查日志:sudo aa-status,再看/var/log/syslog里有没有apparmor="DENIED"记录。
实际部署中,最常卡住的不是安装,而是 chroot 权限 + PASV 端口 + 用户白/黑名单 这三者的组合逻辑。每改一项,都要验证对应环节,别堆在一起调。尤其别在公网环境开 anonymous_enable=YES 或 write_enable=YES 而不设访问限制 —— 扫描器几秒就能找到并塞满你的磁盘。


















