首页 > 其他分享 >ssh登录太慢了,每次都要20s

ssh登录太慢了,每次都要20s

时间:2024-04-03 17:22:36浏览次数:24  
标签:sshd log strace 0.0 20s ssh dns 日志 太慢

背景

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

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

host 10.80.121.46 and tcp port  22

image-20240403150300958

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

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

定位过程

看日志

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

image-20240403150748358

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

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

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

image-20240403154906764

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

journalctl -u sshd -f

image-20240403155216416

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

image-20240403155612165

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

服务端dns抓包

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

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

image-20240403160126500

可以发现,本机是给两个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:

image-20240403162504572

但是啥也没看出来。

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

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

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

image-20240403162625728

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

上网查

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

image-20240403162958052

image-20240403163038782

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

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

image-20240403163719503

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

到了上图,就变成了:

image-20240403163844082

也难怪我没看出来,这个基本算是一个强力证据了,大概率是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

image-20240403170112853

这次可以跟踪了。

补充

在写这篇文章的时候,对一个地方产生了疑问。一般看日志的时候,对于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

image-20240403171017316

标签:sshd,log,strace,0.0,20s,ssh,dns,日志,太慢
From: https://www.cnblogs.com/grey-wolf/p/18113149

相关文章

  • SSH原理详解
    SSH(SecureShell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。SSH协议通过对网络数据进行加密和验证,在不安......
  • ssh 无法登录到Linux虚拟机分析总结
    ssh登录到Linux虚拟机出现登录失败,错误提示为:Permissiondenied,pleasetryagain.可能的原因如下:1.登录到root账户失败如果是登录到root账户失败,则可能是sshd_config配置限制了root账户登录的问题。需要通过指令:sudovim/etc/ssh/sshd_config来设置PermitRo......
  • 宿主机 ssh 登录到 Linux 虚拟机
    配置开发环境,宿主机为Win11,虚拟机为VM中的Ubuntu,现在要在Win11的终端(cmd/PowerShell)来连接到虚拟机。需要配置VM的虚拟机。1.建立IP映射安装好VMwareWorkstation和Ubuntu后,默认的网络连接是NAT,需要先在虚拟机和宿主机之间建立IP映射,具体操作如下:查看虚拟机的IP地......
  • 将BGR转换成为YUV420SP图像格式
      //BGR2YUV(YUV420SP_NV21)voidenCodeYUV420SP(unsignedchar*yuv420sp,unsignedchar*rgb,intwidth,intheight){ if(yuv420sp==NULL||rgb==NULL) return; intframeSize=width*height; intyIndex=0; intuvIndex=frameSize; intR,G,......
  • SSH中私钥和公钥的使用
    在SSH(SecureShell)中,密钥对用于加密和身份验证,保证了远程会话的安全。一个密钥对包括两部分:公钥和私钥。它们有不同的作用和特性:私钥私钥是一个用户保密的密钥,它绝不能被泄露或分享给其他人。保存在用户的本地计算机上,用于SSH进行安全的认证。通常由SSH客户端软件生成并......
  • 在Linux中,什么是SSH?它是如何工作的?
    SSH(SecureShell)是在Linux及其他类Unix系统中广泛应用的一种网络协议,主要用于安全的远程登录和命令执行。SSH的设计目标是在不安全的网络环境下,为用户提供数据机密性、完整性以及操作认证等安全保障。SSH是如何工作的:SSH协议采用客户端-服务器架构,其工作流程大致分为以下几个步......
  • Vmware虚拟机远程SSH连接失效解决方法及分析过程
    问题描述系统为CentOS764位一向能够正常连接在某次使用FinalShell进行远程SSH连接时突然无法连接对问题原因猜测及尝试1.dns解析失效发现显示DNS无法解析,可以得知是使用了主机名登录,而主机名无法登录.遂查看host文件.host文件因不知名原因被清空,重新恢复后该问......
  • Linux——ssh登录很慢解决方法
    1、背景在同一机房中,有多台安装了CentOS7操作系统的服务器,它们的配置除了IP地址不同外基本相同。这些服务器的资源利用率都不高,但在使用SSH连接时,发现有几台服务器连接速度较慢,可能需要等待30-60秒才能提示输入密码,但一旦连接成功后,速度就恢复正常。2、SSH登陆慢原因这种......
  • linux ssh配置radius认证
    使用pam_radius实现1、下载及安装Pam_radius2、修改ssh配置以及ssh服务的pam文件3、搭建radius服务器下载及安装Pam_radius1、安装依赖sudoyuminstallgccpampam-develmake-y2、前往freeradius网站下载pam_radius,链接如下https://freeradius.org/sub_projects/3、......
  • 同一个主机配置多个SSH key
    使用git时,我们可能一个git客户端使用多个git服务器,比如github,自建gitlab,gitee,为了防止提交混乱,所以需要一一对应生成公私钥。第一步:使用ssh-keygen生成多对密钥对,比如:ssh-keygen-trsa-C'随意注解三者不一样就好'-f~/.ssh/id_rsa_githubssh-keygen-trsa-C'......