CentOS SFTP配置常见问题解答
一 快速排查清单
sudo systemctl status sshd,必要时执行 sudo systemctl start sshd && sudo systemctl enable sshd。Subsystem sftp internal-sftp,并为受限用户配置 Match User|Group ... ForceCommand internal-sftp。ChrootDirectory 指定目录及其上级目录必须属主为 root、权限不超过 755;如需写入,给用户在子目录单独授权。sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload(或放行 22/tcp)。getenforce 查看状态;如受限可临时 sudo setenforce 0 验证,再按需设置 setsebool -P sftp_home_dir on 或调整策略。sudo tail -f /var/log/secure 定位认证、权限、配置错误。sftp user@host 或使用 FileZilla/WinSCP。二 高频问题对照表
| 症状 | 常见原因 | 解决要点 |
|---|---|---|
| 连接超时或被拒绝 | 防火墙未放行 22/tcp、SSH 未启动、端口被占用 | 放行端口并重启防火墙;systemctl restart sshd;`ss -tnlp |
| Received unexpected end of file | ChrootDirectory 权限不对、上级目录可写、SELinux 限制 |
ChrootDirectory 及上级目录属主 root、权限 ≤ 755;必要时 setenforce 0 验证,或 setsebool -P sftp_home_dir on |
| 登录后无法列目录或写入 | 根目录不可写、子目录未单独授权、权限过宽 | 根目录仅 root 可写;为用户创建可写子目录并 chown user:group |
| 仅 SFTP 可用、禁止 Shell | 使用 ForceCommand internal-sftp 且 Match 正确 |
在 Match 块内设置 ForceCommand internal-sftp,并禁用不必要转发 |
| 速度慢 | GSSAPI 认证协商耗时 | 在 sshd_config 设置 GSSAPIAuthentication no 并重启 |
| root 无法 SFTP | PermitRootLogin 或 PasswordAuthentication 限制 |
按需开启 PermitRootLogin yes 或 PasswordAuthentication yes 并重启(生产环境慎用) |
| 目录列表失败(被动模式) | 误将 FTP 的被动端口问题套用到 SFTP | SFTP 基于 SSH,无需开放额外被动端口;若使用 FTPS 才需配置被动端口范围 |
三 安全加固与最佳实践
Match Group sftpusers 集中管理。Match 块内设置:ForceCommand internal-sftp、AllowTcpForwarding no、X11Forwarding no,仅开放 SFTP。upload)。四 最小可用配置示例
sudo groupadd sftpusers
sudo useradd -g sftpusers -s /sbin/nologin sftpuser
sudo passwd sftpuser
sudo mkdir -p /data/sftp/sftpuser/upload
sudo chown root:root /data/sftp/sftpuser
sudo chmod 755 /data/sftp/sftpuser
sudo chown sftpuser:sftpusers /data/sftp/sftpuser/upload
sudo chmod 755 /data/sftp/sftpuser/upload
Subsystem sftp internal-sftp
Match Group sftpusers
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
sudo systemctl restart sshd
sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload
sftp sftpuser@your_server_ip
说明:%u 会自动替换为用户名;如需自定义根目录,请确保其为 root 所有且权限 ≤ 755。
五 仍无法解决时的定位思路
sudo tail -f /var/log/secure,从报错关键词(如 fatal, Permission denied, Bad ownership)定位是配置、权限还是认证问题。setenforce 0 验证是否为 SELinux 限制。ping、telnet your_ip 22 或 nc -vz your_ip 22 检查端口可达性。MaxStartups、top 资源占用,排除连接数或性能瓶颈。