530 Login incorrect 错误主因是PAM认证拦截或用户shell不在/etc/shells中;需检查/etc/pam.d/vsftpd配置、确保shell合法(如添加/bin/false到/etc/shells),并区分系统/虚拟用户模式。

VSFTPD 报错 530 Login incorrect,但确认用户名密码无误,问题往往出在 PAM 认证流程或用户 shell 限制上。VSFTPD 默认通过 PAM(Pluggable Authentication Modules)验证登录,并严格检查用户 shell 是否在 /etc/shells 中——即使密码正确,shell 不合法也会直接拒绝登录。
PAM 配置导致认证被拦截
VSFTPD 使用 /etc/pam.d/vsftpd 文件控制认证流程。若该文件中包含 auth [Error=ignore] pam_succeed_if.so user = ftp 类规则,或误启用了 pam_deny.so、pam_listfile.so 等模块,可能在未比对密码前就拒绝登录。
- 检查
/etc/pam.d/vsftpd是否存在语法错误或过于严格的条件判断 - 临时备份并替换为最小化配置(仅保留必要 auth/account 行),例如:
auth [default=ignore] pam_localuser.so auth required pam_unix.so - 确保没有启用
pam_shells.so的重复校验(vsftpd 自身已做 shell 检查,PAM 层再加会冗余且易冲突)
用户 shell 不在 /etc/shells 中
VSFTPD 默认开启 check_shell=YES(编译时默认启用,配置中不显式写出也生效),要求用户 shell 必须存在于 /etc/shells 文件里。常见陷阱是给 FTP 用户设为 /bin/false 或 /usr/sbin/nologin,但这两个路径未被加入 /etc/shells。
- 运行
cat /etc/shells查看当前允许的 shell 列表 - 若需禁用用户 ssh 登录但允许 FTP,可将 shell 设为
/bin/bash并配合chsh -s /bin/bash username,再用usermod -s /bin/bash username确保一致 - 更安全的做法:添加受限 shell 到
/etc/shells,如执行echo "/bin/false" >> /etc/shells(注意权限和换行)
系统用户 vs 虚拟用户混淆
若你实际想用虚拟用户(如通过 PAM + mysql 或文本数据库),但 VSFTPD 配置仍走系统用户认证路径,会导致 PAM 尝试查找系统账户失败。此时即使密码匹配虚拟库,PAM 的 pam_unix.so 也会因找不到系统用户而返回失败。
- 确认
/etc/vsftpd.conf中是否设置了guest_enable=YES和virtual_use_local_privs=YES - 虚拟用户必须搭配独立的 PAM 配置(如
/etc/pam.d/vsftpd.virtual),并在 vsftpd.conf 中指定pam_service_name=vsftpd.virtual - 避免在虚拟用户模式下混用
local_enable=YES和系统用户登录,否则认证逻辑会冲突
调试与验证步骤
启用日志后快速定位真实原因:
- 在
/etc/vsftpd.conf中添加:
log_ftp_protocol=YES xferlog_enable=YES xferlog_file=/var/log/vsftpd.log vsftpd_log_file=/var/log/vsftpd.log - 重启服务:
systemctl restart vsftpd - 尝试登录后查看日志:
tail -f /var/log/vsftpd.log,重点关注 “PAM”、“shell”、“auth” 相关提示 - 用
getent passwd username确认用户是否存在、shell 字段是否合法、UID/GID 是否有效