一、先确认是不是真的连不上

遇到SSH连接超时,先别急着改配置。第一步要确认:是网络不通,还是服务器真的没响应?

试试这个命令(以Linux客户端为例):

# 技术栈:Linux命令行
ping 192.168.1.100  # 替换成你的服务器IP

如果完全ping不通,可能是:

  • 服务器关机了
  • 防火墙拦住了ICMP包
  • 网络路由有问题

如果能ping通但SSH还是超时,继续往下看。

二、检查SSH服务是否活着

服务器可能SSH服务挂了。通过控制台登录服务器(比如云厂商的网页终端),检查服务状态:

# 技术栈:Linux系统管理
systemctl status sshd   # 大多数现代Linux系统
# 或者老系统用:
service sshd status

如果看到active (running),说明服务正常;如果是inactive,赶紧启动:

sudo systemctl start sshd

三、防火墙和端口排查

经典场景:改了SSH端口却忘记开防火墙。比如你把SSH端口从22改成2222,需要放行:

# 技术栈:Linux防火墙(以firewalld为例)
sudo firewall-cmd --add-port=2222/tcp --permanent
sudo firewall-cmd --reload

云服务器用户注意:安全组规则也要同步修改!比如阿里云需要在控制台添加2222端口的入方向规则。

四、SSH配置里的坑

配置文件/etc/ssh/sshd_config里这些参数容易引发超时:

# 技术栈:SSH服务配置
LoginGraceTime 30     # 登录超时时间(秒)
ClientAliveInterval 60  # 客户端活跃检测间隔
TCPKeepAlive yes      # 保持TCP连接

常见问题

  • LoginGraceTime设得太短,复杂密码输入慢会导致断开
  • 内网环境建议把ClientAliveInterval调到300(5分钟)

改完配置记得重启服务:

sudo systemctl restart sshd

五、网络中间件搞事情

跳板机/代理场景:如果通过跳板机连接,可能是中间链路问题。用telnet测试端口连通性:

# 技术栈:网络诊断
telnet 跳板机IP 22      # 测试跳板机到目标机的端口

如果卡住,可能是:

  • 跳板机防火墙规则错误
  • NAT转换失败
  • 中间路由器限制了连接数

六、连接数爆满怎么办

有时候SSH连不上是因为服务器连接数满了。查看当前会话:

# 技术栈:Linux系统监控
who -u              # 查看已登录用户
ps -ef | grep sshd  # 查看SSH进程数

紧急处理方案

sudo killall -u 恶意用户  # 踢出异常用户
sudo systemctl restart sshd  # 重置服务

七、客户端侧的隐藏问题

你的本地SSH配置也可能导致超时。检查~/.ssh/config文件:

# 技术栈:SSH客户端配置
Host myserver
    HostName 192.168.1.100
    Port 2222
    ConnectTimeout 10  # 关键参数!超时时间太短会误判

建议:内网环境把ConnectTimeout调到30秒以上。

八、终极解决方案

如果以上方法都无效,尝试用ssh -vvv输出调试信息:

# 技术栈:SSH调试
ssh -vvv user@server_ip 2>&1 | tee ssh.log

重点关注日志中的:

  • Connection established(是否完成TCP握手)
  • Authentication methods(是否卡在认证环节)
  • timeout: waiting for...(具体超时位置)

应用场景与技术总结

典型场景

  1. 云服务器迁移后端口未开放
  2. 企业内网跳板机策略变更
  3. 服务器遭受暴力破解导致连接数耗尽

技术优缺点

  • ping/telnet:快速定位网络层问题,但无法诊断应用层错误
  • ssh -vvv:信息最全,但需要一定的日志分析能力

注意事项

  • 生产环境修改SSH端口后,务必先开防火墙再断开当前连接
  • 谨慎设置ClientAliveInterval,值过大会导致僵尸会话占用资源

总结:SSH连接超时就像"水管漏水",要分段排查:先确认网络通畅→检查服务状态→分析中间环节→最后抓包看细节。掌握这套方法,90%的SSH问题都能快速解决。