按下面顺序从服务、配置、权限、网络四个维度排查,通常可在几分钟内定位并恢复 SFTP 连接。
一 快速自检
- 确认 SSH 服务已运行(Debian 上服务名通常为ssh,部分教程写作 sshd):
sudo systemctl status ssh
未运行则启动:sudo systemctl start ssh;修改配置后重启:sudo systemctl restart ssh。
- 直接用命令行测试连接:sftp 用户名@服务器IP,观察报错关键词(如 Authentication failed、Permission denied、Connection refused、Timeout)。
- 查看实时日志,优先看认证日志:sudo tail -f /var/log/auth.log;或使用 journalctl:sudo journalctl -u ssh -f。
以上能快速判断是服务未起、认证失败还是配置/权限问题。
二 配置与权限关键点
- 核对 SFTP 子系统配置(/etc/ssh/sshd_config):
推荐使用内置模块:
Subsystem sftp internal-sftp
若改为外部程序,路径必须存在(可用 which sftp-server 确认),否则会报 “Subsystem not found”。修改后重启 ssh 生效。
- 如需将用户限制在家目录(Chroot),典型配置:
Match Group sftp_users
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
要点:Chroot 目录必须存在、属主为 root、权限 755;否则会出现 “Cannot change directory”。
- 用户与目录权限范式:
- 创建组:sudo groupadd sftp_users
- 加入用户:sudo usermod -a -G sftp_users 用户名
- 家目录:sudo chown root:root /home/用户名 && sudo chmod 755 /home/用户名
- 上传目录:mkdir /home/用户名/uploads && sudo chown 用户名:sftp_users /home/用户名/uploads && sudo chmod 755/775 /home/用户名/uploads
- 认证方式:
- 密码登录:确保密码正确、账户未锁定。
- 密钥登录:公钥需置于用户 ~/.ssh/authorized_keys,文件权限 600,.ssh 目录 700;若使用 root 登录,确认 PermitRootLogin 配置允许。
这些是保证 SFTP 子系统可用、目录可访问、认证能过的关键。
三 网络与防火墙
- 本机与云侧放行 22/TCP(或自定义端口):
- UFW:sudo ufw allow 22/tcp 或 sudo ufw allow ssh;sudo ufw enable/status 查看规则。
- firewalld:sudo firewall-cmd --permanent --add-port=22/tcp && sudo firewall-cmd --reload。
- 云服务器安全组需同样放行对应端口。
- 连通性测试:
ping 服务器IP
telnet 服务器IP 22 或 nc -zv 服务器IP 22
若超时,优先排查本机/边界防火墙、NAT/路由、云安全组。
- 端口冲突或自定义端口:
若 22 被占用,可在 /etc/ssh/sshd_config 中改为 Port 2222,并同步更新防火墙/安全组规则。
- 连接数限制:
检查 MaxStartups(如 10:30:100),并发未认证连接过多会被拒绝,可按需调大或临时放宽用于排查。
以上步骤可排除“连不上/被拒绝/超时”等网络层问题。
四 常见报错对照与修复
| 报错关键词 |
典型原因 |
修复要点 |
| Authentication failed |
密码错误、账户被锁、密钥未正确部署 |
核对密码/解锁账户;检查 ~/.ssh/authorized_keys 权限 600 与内容;必要时用 ssh-keygen -y 校验私钥对应公钥 |
| Permission denied |
家目录或上传目录权限/属主不当、Chroot 目录非 root 所有 |
家目录 root:root 755;上传目录 用户名:sftp_users 755/775;Chroot 目录必须 root 所有 755 |
| Connection refused |
SSH 服务未运行、端口不对、配置语法错误 |
systemctl status/start/restart ssh;确认 Port 与防火墙一致;sshd_config 语法无误再重启 |
| Connection timed out |
防火墙/安全组/网络不通 |
放行 22/TCP;检查云安全组、路由/NAT;用 telnet/nc 验证端口连通 |
| Cannot change directory |
Chroot 路径不存在或权限错误 |
创建目录、设置 root:root 755,再重试 |
| Subsystem not found |
Subsystem 路径错误或二进制不存在 |
改为 internal-sftp 或用 which sftp-server 校正路径后重启 ssh |
| “Write failed. Broken pipe” |
资源/连接数限制、磁盘满、权限不足 |
检查磁盘空间 df -h;放宽 MaxStartups;确认上传目录可写 |
| 以上对照覆盖了大多数 SFTP 连接故障场景,可据此快速定位并修复。 |
|
|