必须同时满足三个条件:用户主目录权限正确、chroot_local_user或chroot_list_enable生效、且allow_writeable_chroot=yes显式开启(vsftpd≥2.3.5强制要求)。

直接结论:必须同时满足三个条件——用户主目录权限正确、chroot_local_user 或 chroot_list_enable 配置生效、且 allow_writeable_chroot=YES 显式开启(vsftpd ≥ 2.3.5 后强制要求)。
chroot_local_user=YES 是最简但全局生效的方案
设为 YES 后,所有本地用户登录即被锁定在其 home 目录内,无法执行 cd .. 跳出。这是最直白的“只允许访问家目录”行为。
但要注意:
- 该模式下,用户家目录本身不能有写权限(否则 vsftpd 拒绝登录,报错
500 OOPS: cannot change directory) - 所以必须配
allow_writeable_chroot=YES解除这个限制(仅限 vsftpd ≥ 2.3.5) - 如果用户家目录是
/home/ftpuser,它必须归属该用户且权限为755或750,不能是777(SELinux 下还可能触发额外拦截)
chroot_list_enable=YES 是按需限制的灵活方案
当不想一刀切限制所有用户时,用白名单方式更安全。它依赖三个参数协同:
-
chroot_local_user=NO:关闭默认 chroot 行为 -
chroot_list_enable=YES:启用白名单机制 -
chroot_list_file=/etc/vsftpd/chroot_list:指定文件路径,每行一个用户名(如ftpuser1)
文件必须存在、可读,且用户必须已通过 useradd 创建并设置好 home 目录。漏掉任一参数,chroot 都不会生效。
为什么连上后还能 cd .. 到上级?常见失效原因
这不是配置没写,而是几个关键点被忽略:
-
allow_writeable_chroot没开 → vsftpd ≥ 2.3.5 默认拒绝进入可写的 chroot 目录,直接报500 OOPS - 用户 home 目录属主不是该用户 → 运行
ls -ld /home/username确认 owner 和 group 正确 - SELinux 启用且未放行 → 报错常伴随
setsebool -P ftpd_disable_trans 1或调整上下文:semanage fcontext -a -t public_content_t '/home/username(/.*)?' - 误把
local_root当成 chroot → 它只改初始工作目录,不阻止cd ..,和 chroot 无关
重启前必须验证的三件事
改完 /etc/vsftpd/vsftpd.conf 后,别急着 systemctl restart vsftpd:
- 用
vsftpd -t检查语法是否合法(返回空表示 OK) - 确认
/etc/vsftpd/chroot_list文件存在且内容无空行、无多余空格 - 确认目标用户 shell 是
/bin/bash或/sbin/nologin(不能是/bin/false,否则 PAM 认证失败)
chroot 的真正边界不在配置行数,而在用户 home 目录的归属、权限、SELinux 上下文这三层叠加控制——少一层,就可能漏出去。











