背景

大家工作时,少不了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. ubuntu 23.04 无法联网

    一些参考文章: 解决ubuntu突然无法联网问题 共享主机网络方法: https://www.server-world.info/en/note?os=Ubuntu_22.04&p=squid ...

  2. 关于char * 和 char [] 的一点理解

    截取一段有用的信息: c++的char[]和char*的区别 char str1[] = "abc": 这里的"abc"是一个常量,首先会在常量存储区里存储&q ...

  3. win32 - 将文件的访问权限给特定的用户

    需要首先获取特定用户的SID. 这是一些步骤, 验证输入参数. 为可能足够大的SID和域名创建缓冲区. 在循环中,调用LookupAccountName以检索提供的帐户名的SID.如果SID的缓冲区或 ...

  4. 【Android逆向】修改so文件方式修改程序行为

    1. 还是之前的那个apk 链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an 尝试使用 010Editor来修改so文件 2. 使用 ...

  5. 【Azure Batch】在中国区批处理服务(Mooncake Batch Account)上实验自动池(Auto Pool)的创建/删除

    问题描述 在Azure Batch的介绍文档中,提出了自动池的概念, 它可以在任务完成后,自动删除Pool资源,详细介绍:https://docs.azure.cn/zh-cn/batch/nodes ...

  6. idea技巧-自定义后缀补全

    Idea技巧-Postfix Completion 在idea中可以使用.xxx进行后缀补全 比如.sout 如何自定义后缀补全? 比如.log 在idea中打开设置 File | Settings ...

  7. 学习ASP.NET Core Razor 编程系列文章目录

    学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二--添加一个实体 学习ASP.NET Core Razor 编程系列三--创建数据表及创建项目 ...

  8. Android学习之文件存储

    •前言 任何一个应用程序,其实说白了就是在不停地和数据打交道,我们聊QQ.看新闻.刷微博,所关心的都是里面的数据, 没有数据的应用程序就变成了一个空壳子,对用户来说没有任何实际用途. 那么这些数据都是 ...

  9. GoLand打开后Project消失

    一直用的好好的Goland,突然不能用了,左边栏Project"消失"了. 如下: 解决方法 遇到上面问题,一般情况是GoLand的cache问题,这个时候要将GoLand清理一下 ...

  10. ReACT介绍与llama_index ReActAgent实践

    Agent是大模型的重要应用方向,而ReACT是学术界提出的重要方法,本文介绍ReACT论文,然后通过llama_index ReActAgent来分析ReACT的执行过程. ReACT <RE ...