SFTP依赖SSH服务运行,首先确认SSH服务是否启动:
sudo systemctl status sshd
若未运行,启动服务并设置开机自启:
sudo systemctl start sshd
sudo systemctl enable sshd
确保配置文件中SFTP子系统设置正确,推荐使用internal-sftp(性能更好且无需额外进程):
# 注释或删除旧的sftp-server配置
# Subsystem sftp /usr/libexec/openssh/sftp-server
# 添加internal-sftp配置
Subsystem sftp internal-sftp
# 可选:限制特定用户/组使用SFTP(如创建sftpusers组)
Match Group sftpusers
ChrootDirectory /data/sftp/%u # 限制用户根目录
ForceCommand internal-sftp # 强制使用SFTP
AllowTcpForwarding no # 禁用端口转发
X11Forwarding no # 禁用X11转发
修改后重启SSH服务:
sudo systemctl restart sshd
CentOS默认使用firewalld,需允许SSH(默认端口22)流量:
# 查看防火墙状态
sudo systemctl status firewalld
# 允许SSH服务
sudo firewall-cmd --permanent --add-service=ssh
# 重新加载防火墙规则
sudo firewall-cmd --reload
若使用传统iptables,添加允许22端口的规则:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo service iptables save
若SELinux处于Enforcing模式,可能阻止SFTP访问用户目录。临时设置为Permissive模式测试:
sudo setenforce 0
若问题解决,可永久修改SELinux配置(需重启服务器):
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
或针对SFTP目录设置正确SELinux上下文(如/data/sftp):
sudo chcon -R -t ssh_chroot_t /data/sftp
root,权限为755(防止用户修改目录结构):sudo chown root:root /home/username
sudo chmod 755 /home/username
ChrootDirectory(如/data/sftp/username),目录必须属主为root,权限为755,且用户不能有写权限:sudo mkdir -p /data/sftp/username
sudo chown root:root /data/sftp/username
sudo chmod 755 /data/sftp/username
ChrootDirectory下创建子目录(如upload),属主为用户,权限为755(或775,若需组写入):sudo mkdir /data/sftp/username/upload
sudo chown username:sftpusers /data/sftp/username/upload
sudo chmod 755 /data/sftp/username/upload
通过系统日志获取错误详情,常用日志路径:
# CentOS 7及以上
sudo tail -f /var/log/secure
# 或使用journalctl查看SSH服务日志
sudo journalctl -u sshd -f
常见日志错误及对应解决方法:
Subsystem路径是否正确)、SELinux上下文或目录权限。ChrootDirectory属主为root,权限为755。ChrootDirectory路径是否存在,且无符号链接。使用客户端(如FileZilla、WinSCP)或命令行测试连接:
sftp username@server_ip
输入密码后,若能进入用户目录并列出文件,则配置成功。
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 连接超时 | 防火墙阻止/网络不通 | 检查防火墙规则、网络连通性(ping/telnet) |
| 权限拒绝 | 用户目录/Chroot目录权限错误 | 修正属主(root)和权限(755) |
| 服务未响应 | SSH服务未启动 | 启动SSH服务(systemctl start sshd) |
| 配置未生效 | 未重启SSH服务 | 修改配置后重启服务(systemctl restart sshd) |
| SELinux阻止 | SELinux处于Enforcing模式 | 临时设置为Permissive或调整SELinux策略 |