96SEO 2025-10-23 02:03 0
在日常运维和开发工作中,使用SSH和SFTP连接服务器是最基础也是最频繁的操作之一。只是许多用户经常遇到连接失败的问题,影响了工作效率。彻底解决这些问题, 先说说要了解导致SSH/SFTP连接失败的主要原因:
在尝试连接之前,应确保网络连通正常。可以:

ping 如果ping不通, 说明基础网络存在问题,需要检查路由器、防火墙设置或者云服务商平安组规则。
SSh默认使用22端口, 可以端口开放情况:
telnet  22
# 或者
nc -zv  22
如果显示“Connection refused”或超时则需确认服务器上的SSH服务是否运行,并检查防火墙是否阻止该端口访问。
某些环境中可能会有代理或者VPN干扰,与目标主机通信出现异常。尝试关闭代理或切换不同网络环境验证是否为此类因素引起的问题。
.ssh/id_rsa,.ssh/authorized_keys,以及.ssh/目录权限一般为700, 私钥文件应设为600,否则会被SSH客户端拒绝识别身份认证。
    # ssh-add ~/.ssh/id_rsa
    - 使用命令查看服务状态:
# systemctl status sshd 或 service sshd status 
- 查看监听端口:
# netstat -tnlp | grep sshd 或 ss -tnlp | grep sshd 
- 确保配置文件中/etc/ssh/sshd_config:
    Port 22 , 如果修改过要保证客户端连接对应端口号。
SFTP依赖sshd_config中的Subsystem指令定义, 如果路径错误或者模块不存在会导致连接被拒绝。典型配置如下:
# Subsystem sftp /usr/libexec/openssh/sftp-server
# 或根据系统实际路径修改, 比方说:
Subsystem sftp /usr/lib/openssh/sftp-server
- 如果出现 “sftpsubsystemrequestisrejected” 错误,请确认sftp-server二进制文件存在且可施行权限正常。一边,可使用locate命令查找该程序:
# locate sftp-server
# 如果没有locate,先安装mlocate:yum install mlocate -y
# 更新数据库:updatedb
# 再施行locate命令寻找路径。
A用户在升级Linux发行版后发现无法通过SFTP连接, 其原因是升级过程中原有sftp-server的位置发生改变,而sshd_config未同步更新。更新Subsystem指令后重启sshd服务恢复正常,避免了长时间排查浪费。
This error 通常由主机公钥更改引起, 本地的.ssh/known_hosts 文件存储了之前访问该IP对应的指纹,一旦指纹与远程不匹配则拒绝连接以防中间人攻击。解决步骤如下:
 ssh-keygen -R  | 场景描述 | 处理办法推荐方案 | 
|---|---|
| 云主机重建IP变更但域名没变;或者内网NAT映射地址变动;强制重装操作系统等情况产生host key变化 。 | 及时通知维护人员告知变更内容;远程机器管理面板记录最新host key信息;本地定期备份known_hosts并保持同步更新。 | 
| 遭遇中间人攻击恶意替换host key导致平安警告 。 | 遇到异常提示时切勿贸然清理known_hosts,应联系管理员核实机器真实性并分析日志审计入侵痕迹 。 | 
| 多台相似机器共享同一IP产生key冲突 。 | 采用不同hostname替代IP直连, 通过域名方式访问避免冲突,一边保证DNS解析稳定准确 。 | 
| 开发测试环境频繁刷新镜像引发key失效。 | 可考虑禁用StrictHostKeyChecking参数, 但仅限测试环境,生产严禁关闭校验以免暴露风险 。 | 
因为OpenSSH持续迭代, 一些早期支持的加密算法因平安隐患被废弃,这会造成旧客户端无法与新版服务成功握手,从而断开连接。比方说SHA-1 MACs逐步淘汰,新版本推荐使用SHA-256以上算法。还有啊KexAlgorithms键交换算法也需符合双方要求。
KexAlgorithms diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256  
MACs hmac-sha1,hmac-sha2-256,hmac-sha2-512  
systemctl restart sshd  
| 步骤编号 | 具体操作内容及说明 | 预期后来啊与用户心得反馈 | 
|---|---|---|
| ... | 登陆目标服务器,施行以下命令确认SSH服务状态: systemctl status sshd.service ps aux | grep sshd netstat -tnlp | grep :22 firewall-cmd --list-all # CentOS/RHEL防火墙状态查看,也可以用iptables -L 查看规则。 ls -ld /root/.ssh && ls -l /root/.ssh/* # 权限检查。 echo $PATH # 环境变量查看,有无异常路径干扰。 getenforce # SELinux模式,有时需要临时切换Permissive进行调试。 注释:这一步帮助定位是不是基本环境和服务本身的问题,是首要环节。 ufw status # Ubuntu 防火墙状态查看。 getenforce # SELinux 状态确认。 journalctl -xe | grep sshd # 系统日志抓取异常信息。 cat /etc/ssh/sshd_config | grep Port # 确认当前监听端口是否正确。 cat /etc/hosts.allow /etc/hosts.deny # 查看TCP wrappers是否限制访问。用户A反馈:“我曾经以为是账号密码错了但其实是SELinux策略阻止了SSHD进程接收外部请求。调整SELinux后瞬间恢复。” | 
 | 
Demand feedback