notes icon indicating copy to clipboard operation
notes copied to clipboard

SSH无法远程登录 or ssh connection failure

Open lanlin opened this issue 6 years ago • 3 comments

背景

SSH登录远程服务器,经常会遇到莫名其妙的问题,导致登录失败。 记性不好,搜了一大堆的文章,各种乱七八糟的办法都不系统。 最后从阿里云的运维排查指南中提取关键内容,Copy到这里,以备后用。

如果你恰好从中受益,请感谢阿里云技术文档的编辑们吧。

本文主要针对无明显错误提示的中间网络问题的排查。 因为如果有明确的错误提示,直接搜索原因即可。 没有错误,只是失败和超时,处理起来会比较头疼。

SSH DEBUG

先用跟踪先 SSH 的连接过程,定位问题,并搜索相应解决方案

ssh -vvv [email protected] -p 22

准备步骤

如果SSH DEBUG 信息无法定位到问题,用如下方式进行 telnet 端口测试

telnet 192.168.0.1 22

正常情况下,会返回服务端 SSH 软件版本号

参考文章

云服务器 ECS Linux SSH 无法远程登录问题排查指引与 SSH 原理概述

这应该是网上此类问题最详细的说明文章了,感谢阿里云技术文档的编辑们。

lanlin avatar May 20 '19 03:05 lanlin

情形一

如果准备步骤中, ping 丢包或不通时采用本步骤

当客户端访问目标服务器出现 ping 丢包或 ping 不通时,可以通过 traceroute 或 mtr 等工具进行链路测试来判断问题来源。

mtr (My traceroute)是几乎所有 Linux 发行版本预装的网络测试工具。他把 ping和 traceroute 的功能并入了同一个工具中,所以功能更强大。

mtr 默认发送 ICMP 数据包进行链路探测。可以通过 -u 参数来指定使用 UDP 数据包用于探测。

相对于 traceroute 只会做一次链路跟踪测试,mtr 会对链路上的相关节点做持续探测并给出相应的统计信息。所以,mtr能避免节点波动对测试结果的影响,所以其测试结果更正确。

mtr 223.5.5.5

-r 或 —report:以报告模式显示输出。 -p 或 —split:将每次追踪的结果分别列出来,而非如 —report统计整个结果。 -s 或 —psize:指定ping数据包的大小。 -n 或 —no-dns:不对IP地址做域名反解析。 -a 或 —address:设置发送数据包的IP地址。用于主机有多个IP时。 -4:只使用 IPv4 协议。 -6:只使用 IPv6 协议。

另外,也可以在 mtr 运行过程中,输入相应字母来快速切换模式,比如:

?或 h:显示帮助菜单。 d:切换显示模式。 n:切换启用或禁用 DNS 域名解析。 u:切换使用 ICMP或 UDP 数据包进行探测。

默认配置下,返回结果中各数据列的说明:

第一列(Host):节点IP地址和域名。如前面所示,按n键可以切换显示。 第二列(Loss%):节点丢包率。 第三列(Snt):每秒发送数据包数。默认值是10,可以通过参数 -c 指定。 第四列(Last):最近一次的探测延迟值。 第五、六、七列(Avg、Best、Wrst):分别是探测延迟的平均值、最小值和最大值。 第八列(StDev):标准偏差。越大说明相应节点越不稳定。

lanlin avatar May 20 '19 03:05 lanlin

情形二

如果准备步骤中,能 ping 通但端口不通时采用本步骤。

业务端口无法访问可能是端口拦截造成的。当客户端访问目标服务器时,如果能 ping 通,业务端口却无法访问,可能是链路中的相关节点拦截了端口所致。

用 traceroute 通过发送 TCP 数据包向目标端口进行探测,以检测从数据包源到目标服务器的整个链路上相应端口的连通性情况。

traceroute -n -T -p 22 223.5.5.5

-n 直接使用 IP 地址而非主机名称(禁用 DNS 反查)。 -T 通过 TCP 探测。 -p 探测目标端口号。 Host 目标服务器域名或 IP。

如果相关端口在某一跳被阻断,则其后各跳均不会返回数据。据此就可以判定出异常节点。 通过 ip.taobao.com 等 IP 地址查询网站获取相应节点归属运营商及网络。

lanlin avatar May 20 '19 03:05 lanlin

情形三

如果以上两种都没有找到问题,那么可以通过 tcpdump 抓包分析异常交互数据。

tcpdump -s 0 -i eth0 port 22

-s 用于设置数据包抓取长度。如果 -s 为 0,则表示自动选择合适的长度来抓取数据包。 -w 用于将抓包结果导出到文件,而不是在控制台进行分析和打印输出。 -i 用于指定需要监听的接口(网卡)。 -vvv 用于输出详细的交互数据。

expression 是一个正则表达式,用于过滤报文。主要包含如下几类: 指定类型的关键字:包括 host(主机)、net(网络)和 port(端口)。 指定传输方向的关键字:包括 src(源)、dst(目标)、dst or src(源或目标)和 dst and src(源和目标)。 指定协议的关键字:包括 icmp、ip、arp、rarp、tcp、udp 等协议类型。

常见用法:

  1. 抓取指定网卡指定端口的交互数据
tcpdump -s 0 -i eth0 port 22
  1. 抓取指定网卡发送给指定 IP 上指定端口的交互数据,并在控制台输出详细交互信息
tcpdump -s 0 -i eth1 -vvv port 22
  1. 抓取发送至指定 IP 的 ping 交互数据,并在控制台输出详细交互数据
tcpdump -s 0 -i eth1 -vvv dst 223.5.5.5 and icmp
  1. 抓取系统内所有接口数据并保存到指定文件
tcpdump -i any -s 0 -w test.cap

lanlin avatar May 20 '19 03:05 lanlin