Debian 下 vsftpd 登录失败 原因很多,常见原因基本集中在 配置、权限、PAM、防火墙/SELinux、被动模式 等方面。下面我会按由常见到少见帮你系统排查。
先从客户端报错判断方向(任选其一):
530 Login incorrect331 Please specify the password500 OOPS: cannot change directoryConnection refusedTimeout不同错误对应不同问题。
vsftpd 默认不允许 shell 为 /bin/false 或 /sbin/nologin 的用户登录
grep ftpuser /etc/passwd
如果看到类似:
ftpuser:x:1001:1001::/home/ftpuser:/sbin/nologin
✅ 解决方案(二选一):
方案一:允许 nologin 用户登录 FTP
在 /etc/vsftpd.conf 加:
allow_writeable_chroot=YES
并确保:
local_enable=YES
方案二:给用户一个可用 shell
chsh -s /bin/bash ftpuser
⚠️ 不建议 root 直接登录 FTP。
grep -E "local_enable|write_enable" /etc/vsftpd.conf
至少要看到:
local_enable=YES
write_enable=YES
Debian 使用 PAM 认证。
检查:
ls /etc/pam.d/vsftpd
内容应类似:
auth required pam_unix.so
account required pam_unix.so
✅ 测试账户密码是否正常:
su - ftpuser
如果 su 失败,FTP 一定失败。
vsftpd 对目录权限非常敏感。
正确权限示例:
chmod 755 /home/ftpuser
chown ftpuser:ftpuser /home/ftpuser
❌ 错误示例:
如果你用了:
chroot_local_user=YES
必须同时启用:
allow_writeable_chroot=YES
否则会报:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
防火墙放行:
ufw allow 30000:31000/tcp
云服务器还要放行安全组。
systemctl status vsftpd
重启:
systemctl restart vsftpd
如果出现:
530 Non-anonymous sessions must use encryption.
解决方式(不推荐,除非内网):
ssl_enable=NO
或者启用 FTPS(推荐)。
# 1. 用户能登录系统
su - ftpuser
# 2. vsftpd 配置
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
# 3. 家目录权限
chown ftpuser:ftpuser /home/ftpuser
chmod 755 /home/ftpuser
# 4. 防火墙
ufw allow 21/tcp
ufw allow 30000:31000/tcp
# 5. 重启
systemctl restart vsftpd
你可以直接贴出这些信息(脱敏即可):
/etc/vsftpd.conf/var/log/auth.log/var/log/vsftpd.log(如果有)我可以 直接告诉你哪一行配置要改 ✅