vsftpd报错500 OOPS: refusing to run with writable root inside chroot,是因2.3.5+版本默认禁止chroot用户根目录可写;推荐方案是设根目录root所有、755权限,并在其下建用户可写子目录;禁用allow_writeable_chroot以保安全。

vsftpd 报错 500 OOPS: refusing to run with writable root inside chroot,是因为从 vsftpd 2.3.5 版本起,默认禁止 chroot 用户的根目录具有写权限(出于安全考虑)。解决方法不是降级或关安全机制,而是按规范配置目录权限。
确保 chroot 用户根目录不可写(推荐做法)
这是最安全、官方推荐的方式:用户登录后的根目录(如 /home/username)本身设为 仅 root 可写,但在其下建一个子目录供用户上传文件。
- 执行:
sudo chown root:root /home/username - 执行:
sudo chmod 755 /home/username(不能是 777 或 775) - 再创建可写子目录:
sudo mkdir /home/username/upload - 赋权给用户:
sudo chown username:username /home/username/upload
启用 allow_writeable_chroot(不推荐,仅测试环境用)
若确实需要用户根目录可写(例如旧业务强依赖),可在 vsftpd.conf 中显式允许,但必须配合 chroot_local_user=YES 使用:
- 编辑配置:
sudo nano /etc/vsftpd.conf - 添加或修改两行:
chroot_local_user=YESallow_writeable_chroot=YES - 重启服务:
sudo systemctl restart vsftpd
检查 SELinux 或 AppArmor 干扰(CentOS/RHEL 或 Ubuntu)
即使权限设置正确,SELinux 可能阻止 chroot 行为:
- 临时测试是否是它导致:
sudo setenforce 0(运行后重试 FTP 登录) - 若是,需恢复并打标签:
sudo setsebool -P ftp_home_dir on - Ubuntu 用户检查 AppArmor 是否限制 vsftpd:
sudo aa-status | grep vsftpd,必要时调整配置
确认用户属于 chroot 列表且配置生效
确保你的用户被纳入 chroot 控制范围,且配置未被其他规则覆盖:
- 若使用
chroot_list_enable=YES,需在/etc/vsftpd.chroot_list中添加用户名(每行一个) - 若用
chroot_local_user=YES,则所有本地用户默认 chroot,除非出现在chroot_list中且chroot_list_enable=YES+chroot_list_file=/etc/vsftpd.chroot_list - 改完配置务必重启服务,且检查日志:
sudo tail -f /var/log/vsftpd.log或journalctl -u vsftpd -n 20









