Ubuntu 下 vsftpd 连接问题排查与修复
一 快速自检清单
- 确认服务已运行并开机自启:sudo systemctl status vsftpd;如未运行执行:sudo systemctl start vsftpd && sudo systemctl enable vsftpd。
- 本机连通性测试:ftp 127.0.0.1;远程连通性:telnet 服务器IP 21。
- 防火墙放行:sudo ufw allow 21/tcp;若启用被动模式,放行数据端口范围(示例:sudo ufw allow 40000:50000/tcp);如使用 FTPS,放行 990/tcp。
- 查看日志定位:sudo tail -f /var/log/vsftpd.log;服务异常可用:journalctl -xe。
- 端口占用检查:sudo netstat -tulpen | grep :21。
二 常见症状与对应修复
-
连接被拒绝或超时
- 服务未启动或端口未监听:systemctl status vsftpd;2) 端口被占用:netstat 查 21 并释放或更换端口;3) 云服务器安全组/本机防火墙未放行 21;4) 客户端主动/被动模式与服务器不匹配(见第四部分)。
-
530 Login incorrect / Permission denied
- 检查用户名与密码;2) 查看是否被禁止登录:/etc/vsftpd/ftpusers(黑名单);3) 检查 /etc/vsftpd/user_list 与配置项 userlist_enable、userlist_deny 的组合语义;4) 确认 PAM 配置正确:pam_service_name=vsftpd 且 /etc/pam.d/vsftpd 正常。
-
登录后无法列出目录或切换目录(500 OOPS: chdir / cannot change directory)
- 本地用户对主目录有执行权限:chmod 755 /home/用户名;2) 若启用了 chroot,避免将用户根目录设为可写,或使用 allow_writeable_chroot=YES;3) SELinux 环境下启用 ftp_home_dir(仅限 SELinux 系统)。
-
可登录但无法上传(550 或 500 OOPS)
- 配置 write_enable=YES;2) 目标目录属主与权限正确(如:chown 用户名:用户名 目录;chmod 755/775 视 umask 而定);3) 磁盘空间充足。
-
TLS/SSL 相关报错(AUTH TLS/FTPS 失败、GnuTLS 错误等)
- 明确使用显式 FTPS(端口 21,AUTH TLS)还是隐式 FTPS(端口 990);2) 显式 FTPS:ssl_enable=YES,并开放 990/tcp;隐式 FTPS:listen_port=990;3) 客户端加密选择“仅使用 FTP over TLS/显式 FTP over TLS”;4) 若报 GnuTLS 错误,调整 ssl_ciphers=HIGH。
三 最小可用配置示例
-
明文 FTP(适合内网或受信网络)
- /etc/vsftpd.conf 关键项:
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
- 防火墙:sudo ufw allow 21/tcp;sudo ufw allow 40000:50000/tcp。
-
显式 FTPS(推荐对外服务)
- /etc/vsftpd.conf 关键项(在明文配置基础上增加):
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
- 防火墙:sudo ufw allow 21/tcp;sudo ufw allow 990/tcp。
四 主动模式与被动模式要点
- 主动模式(PORT):客户端在高位端口监听,服务器用 20/tcp 主动连客户端数据端口;常见于客户端在内网、服务器在公网的场景,可能被防火墙/NAT 拦截。
- 被动模式(PASV):服务器在配置范围内开放高位端口,客户端主动连这些端口获取数据;公网/云服务器通常应启用 PASV 并放行端口范围(如 40000:50000/tcp)。
- 客户端设置要与服务器一致:FileZilla 在“传输设置”里选择主动或被动;命令行 ftp 默认主动,可用被动命令切换。
五 提交信息模板便于进一步定位
- 请提供:vsftpd 版本(vsftpd -v)、/etc/vsftpd.conf 的非默认关键项、/etc/vsftpd.ftpusers 与 /etc/vsftpd.user_list 相关内容、防火墙与安全组规则、客户端类型与报错原文(含 220/331/530/550 等行)、以及 /var/log/vsftpd.log 中对应时间段的日志片段。