CentOS SFTP配置问题排查与修复指南
一、快速自检清单
sudo systemctl status sshd,必要时 sudo systemctl start sshd && sudo systemctl enable sshd。Subsystem sftp internal-sftp;Match User sftpuser → ChrootDirectory /data/sftp/%u → ForceCommand internal-sftp → AllowTcpForwarding no → X11Forwarding no。sudo firewall-cmd --list-all;如需放行:sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload。sudo tail -f /var/log/secure,定位失败原因(认证、权限、命令被拒等)。sudo systemctl restart sshd。二、常见报错与对应处理
| 症状 | 高概率原因 | 处理要点 |
|---|---|---|
| 连接被重置、认证失败或“Couldn’t read packet: Connection reset by peer” | 客户端 known_hosts 中旧主机密钥残留;或服务器端 ChrootDirectory 及其上级目录权限不合规(非 root 拥有、存在组写/其他写) | 客户端删除该主机对应行后重连;服务器端确保 Chroot 目录及路径上所有父目录属主为 root:root,权限 755/750,用户可写目录放在 Chroot 下独立子目录并属主给该用户 |
| 登录后无法列目录或“Write failed: Broken pipe” | Chroot 目录权限错误、上级目录可写、或用户家目录权限不当 | 按上条修正权限;若使用 Chroot,家目录本身也需满足“root 拥有、不可被用户写”的约束 |
| 使用 internal-sftp + Chroot 后启动报错或无法进入 | 配置顺序不当导致指令冲突(如把全局指令写进 Match 块) | 将全局指令(如 UseDNS、PermitRootLogin、PasswordAuthentication)放在 Match 块之前,保持 Subsystem sftp internal-sftp 在全局位置 |
| 登录缓慢 | GSSAPI 认证耗时 | 在 sshd_config 设置 GSSAPIAuthentication no 并重启 |
| 被动模式/传输异常 | 防火墙未放行被动端口范围 | 在防火墙中开放所用被动端口范围,或改用直连端口 22 测试 |
| root 无法 SFTP | PasswordAuthentication 被关闭或 root 登录策略限制 |
临时开启 PasswordAuthentication yes 测试,或改用密钥登录并遵循 PermitRootLogin 策略 |
| 以上为高频场景,优先对照日志与目录权限进行修正。 |
三、权限与目录规范(Chroot 场景)
ChrootDirectory 指定的目录及其所有上级目录,必须:
sudo mkdir -p /data/sftp/sftpuser/uploadsudo chown root:root /data/sftp/sftpuser && sudo chmod 755 /data/sftp/sftpusersudo chown sftpuser:sftp /data/sftp/sftpuser/upload && sudo chmod 755 /data/sftp/sftpuser/uploadSubsystem sftp internal-sftpMatch User sftpuser
ChrootDirectory /data/sftp/%uForceCommand internal-sftpAllowTcpForwarding noX11Forwarding nosudo systemctl restart sshd四、启用详细日志便于定位
sshd_config 为 SFTP 启用日志:
Subsystem sftp internal-sftp -l INFO -f local5LogLevel INFOrsyslog 中单独落盘:
auth,authpriv.*,local5.* /var/log/sftp.logsudo systemctl restart sshd && sudo systemctl restart rsyslogsudo tail -f /var/log/sftp.log 与 /var/log/secure 联动分析认证与会话细节。五、安全与加固建议
AllowTcpForwarding no、X11Forwarding no。sftp 服务名,直接放行 ssh 服务更稳妥。sudo setenforce 0 验证,但生产环境应改为正确的 SELinux 策略或布尔值,而非长期关闭。