SFTP依赖SSH服务运行,若SSH未启动,SFTP无法连接。使用以下命令确认SSH服务状态:
sudo systemctl status sshd
若未运行,启动服务并设置开机自启:
sudo systemctl start sshd
sudo systemctl enable sshd
SFTP子系统配置错误是常见原因,需确保以下设置正确(若无则添加):
Subsystem sftp /usr/libexec/openssh/sftp-server # 或使用 internal-sftp(更安全)
若需限制用户到指定目录(如/data/sftp/%u),可添加:
Match User sftpuser # 替换为目标用户名
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
修改后重启SSH服务生效:
sudo systemctl restart sshd
CentOS防火墙(firewalld)可能阻止SSH/SFTP端口(默认22),需允许该端口:
sudo firewall-cmd --permanent --add-service=ssh # 推荐方式(直接放行ssh服务)
sudo firewall-cmd --reload
或手动添加端口:
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --reload
日志文件/var/log/secure(CentOS 7/8)或/var/log/auth.log(部分版本)会记录连接失败的详细原因(如认证失败、权限问题)。使用以下命令实时查看日志:
sudo tail -f /var/log/secure
根据日志提示针对性解决(如“Permission denied”对应权限问题,“Connection refused”对应服务未启动)。
ping命令检查服务器IP是否可达(如ping 192.168.1.100)。telnet命令检查22端口是否开放(如telnet 192.168.1.100 22),若无法连接,可能是防火墙或网络设备拦截。SELinux处于Enforcing模式时,可能限制SFTP访问用户目录。临时设置为Permissive模式测试:
sudo setenforce 0
若问题解决,可永久修改SELinux配置(编辑/etc/selinux/config,将SELINUX=enforcing改为SELINUX=permissive),或调整SFTP相关策略:
sudo semanage fcontext -a -t sftp_chroot_t "/data/sftp(/.*)?" # 示例:允许chroot目录
sudo restorecon -Rv /data/sftp
root所有,权限设为755(避免用户修改目录权限导致无法访问):sudo chown root:root /home/sftpuser # 替换为目标用户家目录
sudo chmod 755 /home/sftpuser
ChrootDirectory(如/data/sftp/%u),该目录需归root所有,权限设为755,子目录(如上传目录)需为用户所有并允许写入:sudo mkdir -p /data/sftp/sftpuser/upload # 示例:创建用户子目录
sudo chown sftpuser:sftpuser /data/sftp/sftpuser/upload
sudo chmod 755 /data/sftp/sftpuser
sudo chmod 775 /data/sftp/sftpuser/upload
/etc/ssh/sshd_config中MaxStartups参数设置过小(如默认10:30:100),可能导致新连接被拒绝。修改为更大值(如10000)并重启SSH:sudo sed -i 's/#MaxStartups 10:30:100/MaxStartups 10000/g' /etc/ssh/sshd_config
sudo systemctl restart sshd
top命令检查CPU、内存、磁盘空间是否充足(如磁盘空间耗尽可能导致服务异常)。使用命令行或客户端工具(如FileZilla、WinSCP)测试连接,示例命令:
sftp sftpuser@your_server_ip
输入密码后,若能进入SFTP命令行(如sftp>),则表示连接成功。