在 Linux 中排查 SFTP 连接问题时,可以按照以下步骤进行系统性检查:
1. 确认 SSH/SFTP 服务状态
- 检查 SSH 服务是否运行:
systemctl status sshd # 或 ssh(取决于系统)
- 若未运行,启动服务:
systemctl start sshd
- 若未运行,启动服务:
2. 检查 SSH 配置
- 配置文件路径:
/etc/ssh/sshd_config
- 关键配置项:
Subsystem sftp /usr/lib/openssh/sftp-server # 确认子系统路径正确 AllowUsers your_user # 检查用户是否被允许登录 PasswordAuthentication yes # 是否启用密码认证 PermitRootLogin prohibit-password # 禁止 root 直接登录(可选)
- SFTP 专用配置(Chroot):
Match Group sftp_users # 匹配用户组 ChrootDirectory /data/sftp # Chroot 目录(必须属 root 且权限 755) ForceCommand internal-sftp # 强制使用内置 SFTP X11Forwarding no AllowTcpForwarding no
- 注意:Chroot 目录必须为 root 所有,权限
755
,且用户目录(如/data/sftp/username
)可由用户写入。
- 注意:Chroot 目录必须为 root 所有,权限
3. 权限检查
- 用户家目录:
- 确保用户家目录(或 Chroot 目录)权限正确:
chown root:root /data/sftp # Chroot 根目录属主 chmod 755 /data/sftp chown username:group /data/sftp/username # 用户子目录属主
- 确保用户家目录(或 Chroot 目录)权限正确:
- 用户 Shell:
- 在
/etc/passwd
中确认用户 Shell 为有效路径(如/bin/bash
或/usr/sbin/nologin
)。
- 在
4. 防火墙与网络
- 检查防火墙规则:
ufw status # Ubuntu iptables -L # 检查规则是否允许 22 端口
- 确认端口监听:
ss -tuln | grep 22 netstat -tuln | grep 22
- 测试网络连通性:
telnet your_server_ip 22 # 检查端口是否可达
5. 认证方式排查
- 密码错误:
- 临时允许密码登录(若已禁用):
PasswordAuthentication yes # /etc/ssh/sshd_config
- 重启 SSH 服务:
systemctl restart sshd
- 临时允许密码登录(若已禁用):
- 密钥认证问题:
- 检查客户端密钥权限(本地):
chmod 600 ~/.ssh/private_key
- 服务端公钥路径:
~/.ssh/authorized_keys
- 检查客户端密钥权限(本地):
6. 日志分析
-
查看 SSH/SFTP 日志:
tail -f /var/log/auth.log # Debian/Ubuntu tail -f /var/log/secure # CentOS/RHEL
- 常见错误:
Permission denied
: 权限问题或认证失败Connection closed by ...
: 服务配置或网络中断Could not chdir to ...
: Chroot 目录配置错误
- 常见错误:
-
启用 SFTP 调试模式:
sftp -v -P 22 username@host # 显示详细连接过程
7. SELinux 检查
- 临时禁用 SELinux(测试用):
setenforce 0
- 调整策略(若需保留 SELinux):
chcon -R -t ssh_home_t /data/sftp # 修正目录上下文
8. 其他常见问题
- 磁盘空间不足:
df -h # 检查存储空间
- 进程限制:
- 检查
/etc/security/limits.conf
中的nproc
或nofile
限制。
- 检查
流程
- 服务状态 → 2. 配置与权限 → 3. 防火墙/网络 → 4. 认证方式 → 5. 日志分析 → 6. SELinux/其他
通过逐步排除,通常可以定位到问题根源。若仍无法解决,可结合具体错误信息进一步分析。