抓包分析ssh远程主机为何变慢了?

简介: 在使用spug自动化部署程序的时候,会使用ssh协议远程执行脚本,但是ssh那一步会耗时比较旧,网上的解决方案五花八门. 问题可能可以解决,但是背后原理并不清楚,借此机会抓包将此问题彻底消化.

背景

在使用spug自动化部署程序的时候,会使用ssh协议远程执行脚本,但是ssh那一步会耗时比较旧,网上的解决方案五花八门. 问题可能可以解决,但是背后原理并不清楚,借此机会抓包将此问题彻底消化.

SSH协议握手过程

ssh 抓包MAC层包传输

序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。


确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。


控制位:

ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。

RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。

SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。

FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。

tcp握手抓包解释

89814d04e2ad4879b546ef59c522f3f6.png

No 描述 Seq Win ACK 解释
214 第一次握手 0 14600 \ seq = 0表示客户端当前的TCP包序列号
215 第二次握手 0 14480 1 seq = 0,表示服务器端当前的TCP包序列号ack = 1(客户端seq + 1),表示对客户端第 seq = 0 的TCP包进行应答
216 第三次握手 1 14720 1 seq = 1,表示客户端当前的TCP包序列号ack = 1(服务器seq + 1),表示对服务器端第 seq = 0 的TCP包进行应答

三次握手的第一个报文- SYN包95fb6af1ead6486fbe78632fa35c0c53.png

第一个报文对应的抓包详情

a96279663239428690d4304cd347fad6.png

三次握手的第二个报文- SYN+ACK包

3f8b36148d484a17a430119f3b5194ec.png

第二个报文对应的抓包详情

d77063d52c224aeca6a6bf8ed73f4c1c.png

三次握手的第三个报文- ACK包

210ce145cf8c4909978d65fbfeeb8981.png

第三个报文对应的抓包详情

396d20cd0f7c4a6fbd660d3495c7f410.png

ssh版本协议交换

ced6a7ae16e94c4683b1225f5676261a.png

No 描述 解释
217 server端协议版本协商 服务器将自己的SSH协议版本发送到客户端,格式为:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车) LF(换行)
219 client协议版本协商 客户端将自己的SSH协议版本发送到服务器,格式为:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车符) LF(换行符)

密钥协商key阶段

221-228是SSH版本协议交换过程。

0263356a373f4b118ec75d2903a45ce4.png

密钥协商过程从客户端和服务器相互发出Key Exchange Init请求开始,主要是告诉对方自己支持的相关加密算法列表、MAC算法列表等。

6d00bd42f615423990da373592453d62.png

最后协商成功之后,将会生成一个对称加密会话密钥key以及一个会话ID,在这里要特别强调,这个是对称加密密钥key,不要和公钥相混淆了,公钥和密钥在上面开头已经着重强调两者的区别了,公钥是给客户端去验证服务器用的。

在这一步中,公钥会从服务器传送到客户端:

7efd2caaa9024782ac1cec38db54bb82.png

而会话密钥是通过D-H算法计算出来的,不会在网络上传输,其破解的难度取决于离散对数的破解难度,一般不会被破解的,有兴趣的可以自行了解该算法原理。

Key Exchange Init发送的请求包数据分析

98b212fd6a55468997a9bc94c42178bb.png


No 描述 解释
1 kex_algorithms 密钥交换算法,里边即包含我们使用的D-H算法,用于生成会话密钥
2 server_host_key_algorithms

服务器主机密钥算法,可以采用 ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,有公钥和私钥的说法,公钥即我们上面讲到的pub key,对于公钥私钥的概念,可以参见understanding public key private key concepts

3 encryption_algorithms_client_to_server 对称加密算法,常用的有aes128-cbc,3des-cbc

服务器首次ssh的指纹信息就是ecdsa-sha2-nistp256算法生成的.

看懂wireshark抓包数据的前置知识

tcp的格式

d92e0128d8774a32ba5a5b94a2242169.png

参考

【1】 参考此文章

【2】 小林codding

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
安全 Shell Linux
【Shell 命令集合 文件管理】Linux ssh 远程主机之间复制文件 scp 命令使用教程
【Shell 命令集合 文件管理】Linux ssh 远程主机之间复制文件 scp 命令使用教程
731 0
|
7月前
|
安全 Linux 网络安全
CentOS 8下SSH连接超时与“无法加载主机密钥”错误的排查与修复
在CentOS 8系统中,宝塔面板提示“出错了,面板运行时发生错误”,导致插件无法正常显示。同时,SSH连接超时,修复面板功能失效。通过VNC连接排查,发现SSH服务安装和配置问题频发,最终通过重装SSH、调整权限并重新生成主机密钥文件解决问题,成功恢复SSH连接。
461 16
|
Ubuntu 网络安全 数据安全/隐私保护
如何在 Ubuntu 上创建一个 SSH CA 以验证主机和客户端
如何在 Ubuntu 上创建一个 SSH CA 以验证主机和客户端
253 0
|
弹性计算 运维 Shell
基于key验证多主机ssh访问
【4月更文挑战第30天】
148 1
|
安全 Linux 网络安全
Linux加强篇009-使用ssh服务管理远程主机
山重水复疑无路,柳暗花明又一村
474 0
Linux加强篇009-使用ssh服务管理远程主机
|
jenkins Linux 网络安全
使用Jenkins通过SSH插件远程控制主机执行脚本
使用Jenkins通过SSH插件远程控制主机执行脚本
711 1
|
Shell Linux 网络安全
ssh 主机之间免密配置脚本
ssh 主机之间免密配置脚本
213 0
|
jenkins Linux 网络安全
使用Jenkins通过Publish Over SSH插件远程控制主机执行脚本
使用Jenkins通过Publish Over SSH插件远程控制主机执行脚本
423 0
|
Linux 网络安全
三步实现Linux下主机之间SSH免密登录
三步实现Linux下主机之间SSH免密登录
304 0
|
Linux 网络安全 数据安全/隐私保护
Linux下ssh远程主机报错:ssh_exchange_identification: read: Connection 解决
Linux下ssh远程主机报错:ssh_exchange_identification: read: Connection 解决
490 0