背景

大家工作时,少不了ssh登录各个服务器,我这边手里也有很多服务器,有一些登录很快就进去了,有些要卡半天才能进去。之前以为是公司网络问题,每次也就忍了,这次突然不想忍了,决定定位一下。

我这边的服务器是10.80.121.46。因为这个问题是可复现的,算是个好问题,于是在本地开了wireshark,ssh登录,看看能不能看出端倪。

host 10.80.121.46 and tcp port  22

可以看到,服务端在00:13,发了第一个消息过来;过了20s,发了第二个消息过来。

总的来说,应该是服务端问题。

定位过程

看日志

由于是ssh这种加密了的协议,抓包也看不出个啥。所以我首先的思路是看看sshd这个服务端进程的日志。sshd是systemd管理的,所以看看状态先。

这种的话,一般也能看到最新的日志,如果要看完整的日志,可以用如下命令:

journalctl -u sshd
ps: journalctl -u sshd -f 可以像tailf那样持续跟踪日志

但是,发现只有info级别的日志,也看不出什么特别.

Apr 03 15:27:30 nginx2 sshd[87616]: Accepted password for root from 10.0.235.72 port 11481 ssh2

接下来,又看了下其他日志:

/var/log/messages:

Apr  3 15:27:30 year-account-nginx2 systemd-logind: New session 13336 of user root.
Apr 3 15:27:30 year-account-nginx2 systemd: Started Session 13336 of user root.

/var/log/secure:

Apr  3 15:27:30 year-account-nginx2 sshd[87616]: Accepted password for root from 10.0.235.72 port 11481 ssh2
Apr 3 15:27:30 year-account-nginx2 sshd[87616]: pam_unix(sshd:session): session opened for user root by (uid=0)

反正看了好些日志,没啥用,这边上个链接,讲linux下的各种日志。

https://www.plesk.com/blog/featured/linux-logs-explained/

https://www.eurovps.com/blog/important-linux-log-files-you-must-be-monitoring/

开启debug日志

上网查了下,怎么开启sshd的debug级别日志,结论如下:

vim /etc/ssh/sshd_config
加一行:
LogLevel DEBUG

这个LogLevel的取值有哪些呢,具体可以在机器上执行:

man sshd_config

没想到取值还有更逆天的:

我之前就是在debug级别下测试的,然后看日志:

journalctl -u sshd -f

看到出现了20s的间隔,但是,还是没有什么错误或者警告。当时,我就开始上网查了,但是这次,咱们要不试试把日志级别弄成DEBUG3:

这里日志细了一些,但还是看不太出来啥问题。这个10.0.235.72,是我本机windows的ip。

服务端dns抓包

经过上网冲浪,发现很多文章提到了一点,就是sshd会拿着我们客户端的ip,去dns 服务器查询ip对应的主机名(域名)。很明显,我这个ip,肯定是没什么域名的。大概率是这个原因,但是基于严谨的角度考虑,我还是先找找证据。

dns服务器对外的端口是53,所以我抓的就是这个端口的网络包:

可以发现,本机是给两个dns服务器发请求的,分别是8.8.8.8 8.8.4.4

看下机器的dns服务器配置:

vim /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

不知道为啥是这个地址,反正是运维同事给的。

测试了端口通不通,发现tcp不通,udp不知道咋测(试了下netcat、nmap,没太弄懂)

ping也不通,不知道是真不通,还是对端禁ping了。

这些都不重要,重要的是,这个报文也不知道是啥意思,看起来和我的问题没什么关系。

strace排查

暂时放下dns这块,准备strace试试,反正,死马当活马医。

strace这个一般用得少,选项记不住,一开始就这么试试:

netstat -nltp|grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 93585/sshd
tcp 0 0 0.0.0.0:4822 0.0.0.0:* LISTEN 31633/nginx: master
tcp6 0 0 :::22 :::* LISTEN 93585/sshd 拿到sshd pid为93585,开启strace:

但是啥也没看出来。

找了下以前笔记,加了几个选项:

strace -p 121920 -s 1000  -t -e trace=network,file,desc,process

-s: 字符串显示1000个字符串,不截断(默认是32,会看不全)
-t:显示时间
-e trace=network,file,desc,process,监控网络、文件、文件描述符、进程相关的系统调用

这次信息多一点,还是啥都看不出来。

上网查

没法了,把之前dns抓的包拿下来用wireshark分析分析。

这个dns查询,有点看不懂,直接拿关键字搜了下,大家看如下链接吧:

https://www.cloudflare.com/zh-cn/learning/dns/dns-records/dns-ptr-record/

难怪,dns进行反向查找时,客户端ip是反的,我的实际ip是:10.0.235.72

到了上图,就变成了:

也难怪我没看出来,这个基本算是一个强力证据了,大概率是dns解析的问题,毕竟用了我的ip。

修改sshd配置

那就禁用这个机制吧,方式如下:

vim /etc/ssh/sshd_config
UseDNS no 然后重启sshd
systemctl restart sshd

这样基本就ok了。重新试了下,再没有卡20s了,秒登录。

继续探索strace

找到问题原因后,strace我又继续研究了下。原来是少了个选项,-f:

       -f
--follow-forks
Trace child processes as they are created by currently traced processes as a result of the fork(2), vfork(2) and
clone(2) system calls. Note that -p PID -f will attach all threads of process PID if it is multi-threaded, not only
thread with thread_id = PID.

这个选项是跟踪子进程的系统调用,因为,sshd收到一个客户端连接时,会fork一个新进程出来。前面都忘了加-f,所以导致没跟踪到。

换下命令:

strace -p 93585 -s 1000  -t -e trace=network,file,desc,process -f

这次可以跟踪了。

补充

在写这篇文章的时候,对一个地方产生了疑问。一般看日志的时候,对于systemd管理的service,我会看journalctl,也会看/var/log/messages,经常的情况是,在journalctl中的日志,在/var/log/messages中也能看到。

查了下两者的机制,参考:

https://serverfault.com/questions/1150014/can-a-service-managed-by-systemd-send-its-logs-somewhere-other-than-var-log-mes

systemd会写日志到一些文件(journalctl就会读这些文件),然后,另一个后台进程rsyslogd,也会读这些日志,然后写到/var/log/messages这些文件中。

[root@year-account-nginx2 log]# ps -ef|grep rsys
root 1614 1 0 2022 ? 00:46:28 /usr/sbin/rsyslogd -n

ssh登录太慢了,每次都要20s的更多相关文章

  1. SSH 首次登录太慢问题

    这两天在使用 Docker 做测试,发现新建的容器在首次 ssh 登录的时候经常超时,我们简单将超时时间设置成60秒,但仍然会偶尔超时.所以简单延迟超时时间此路不通. 于是想到是否可以通过修改 ssh ...

  2. ssh 登录

    一.ssh登录过程 在实际开发中,经常使用ssh进行远程登录.ssh 登录到远程主机的过程包括: 版本号协商 密钥和算法协商 认证 交互 1.1 版本号协商阶段 (1) 服务端打开22端口(也可以为了 ...

  3. SSH 登录缓慢解决方案

    SSH 登录太慢可能是 DNS 解析的问题,默认配置下 sshd 初次接受 ssh 客户端连接的时候会自动反向解析客户端 IP 以得到 ssh 客户端的域名或主机名. 如果这个时候 DNS 的反向解析 ...

  4. SharePoint 2013:解决添加域名后每次都需要登录的问题

    在SharePoint 2013中,当我们添加一个域名给SP后(添加域名的方法请参考此文:http://www.cnblogs.com/jianyus/archive/2013/08/10/32494 ...

  5. 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译

    如果你干预到了项目的编译过程,可能就需要考虑到差量编译了.不然--当你的项目大起来的时候,就会感受到每次都重新编译时,每次重复调试的过程都要进行漫长等待时的绝望和无奈. 如果你正遭遇差量编译失效,每次 ...

  6. 【转】ssh登录原理以及ssh免密码登陆

    一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会 ...

  7. Mac下,使用sshpass让iterm2支持多ssh登录信息保存

    windows里有个Xshell非常的方便好使,因为它能保存你所有的ssh登录帐号信息.MAC下并没有xshell,有些也提供这样的功能,但效果都不好.iterm2是很好的终端,但却不能很好的支持多p ...

  8. sudo,linux 新建账号,并开通ssh登录

    新建账号需要root账号或sudo权限,sudo配置保存在/etc/sudoers文件. sudoers的配置格式一般为: root ALL=(ALL:ALL) ALL %sudo ALL=(ALL: ...

  9. Jenkins踩坑系列--你试过linux主机ssh登录windows,启动java进程吗,来试试吧

    一.问题概述 在一个多月前,组长让我研究下持续集成.我很自然地选择了jenkins.当时,(包括现在也是),部分服务器用的是windows主机. 我当时想了想,如果我把jenkins装在windows ...

  10. <转载>Mac下,使用sshpass让iterm2支持多ssh登录信息保存

    windows里有个Xshell非常的方便好使,因为它能保存你所有的ssh登录帐号信息.MAC下并没有xshell,有些也提供这样的功能,但效果都不好.iterm2是很好的终端,但却不能很好的支持多p ...

随机推荐

  1. 常见的问题系列--- Swagger @ApiOperationSupport忽略失效的问题

    https://www.cnblogs.com/hujunwei/p/15853307.html

  2. 维基百科Wikipedia镜像网站列表(全部已被封)

    序号 网址 备注 1 https://chi.jinzhao.wiki/wiki (中文版) https://en.jinzhao.wiki/wiki/Main_Page (英文版)  支持多种语言. ...

  3. 【Azure 应用服务】如何来检查App Service上证书的完整性以及在实例中如何查找证书是否存在呢?

    问题描述 1:如何来检查App Service上证书的完整性呢? 2:如何来检查App Service的实例上是否包含这个证书呢? Windows 环境 or  Linux 环境? 问题解答 问题一: ...

  4. 【Azure 媒体服务】使用媒体服务 v3 对视频进行上载、编码和流式传输时遇见的AAD错误

    问题描述 使用媒体服务 v3 对视频进行上载.编码和流式传输示例时,遇见了AAD错误. TIP: Make sure that you have filled out the appsettings. ...

  5. Langchain 介绍与入门

    官方介绍 LangChain 是一个利用LLM开发应用程序的框架.它让应用程序具备: 上下文感知能力:将LLM连接到上下文源(提示说明.少量示例.用以形成其响应的内容等) 推理:依靠LLM进行推理(例 ...

  6. Java 构造器(构造方法)练习

    1 package com.bytezero.triangle; 2 3 public class TriAngle 4 { 5 //私有属性 6 private double base; //边长 ...

  7. 修改html5 placeholder文字默认颜色

    注意: 1.input后面的冒号不要写错! 2.-moz后面是没有input字样,火狐设置字体颜色为#000,但是他不是全黑,好像有个度似的!(个人认为) input:-ms-input-placeh ...

  8. Android APP 渗透测试---总结

    1.apk反编译得到源代码 使用编译软件 dex2gar 和 jdgui.jar 对Android APP软件进行反编译.具体步骤如下: (1)首先将APK文件后缀改为zip并解压,得到其中的clas ...

  9. CPNtools协议建模安全分析--ML语言之颜色集定义(六)

    之前一直在怀疑我是不是因为对CPN Tools的原理结构还是不够理解,对Petri网的还没有弄清楚,越往后面看这种质疑越来越严重. 之前说CPN Tools在对称和非对称算法中不能形式化的问题,后续看 ...

  10. vue 下 placeholder 修改颜色

    input::placeholder{ color:#585c89 !important; }