关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » HTML5 »SSH 连接慢的解决方案详解

    SSH 连接慢的解决方案详解

    2015-07-21 00:00:00 出处:linux.cn
    分享

    每次PuTTY使用SSH登录到远程的Linux进行管理的时候,远程登录的过程都非常慢——输入完用户名之后,非要等到30秒左右才会出来输入密码的提示。在实际处理问题的时候,特别需要快速响应的时候,这种状况着实让人难以忍受。

    但后来具体测试了一下,发现这又并非是每种系统的通病,出现问题的机器主要集中的CentOS上,同样的Debian系统,在远程连接的过程就是健步如飞,丝毫没有卡顿犹豫的感觉。这难道是CentOS的问题?

    诊断并解决 SSH 连接慢的方法

    出于好奇,查看了下两个系统在SSH时的差别

    CentOS:

    ssh -v ssh_test@192.168.128.137

    SSH远程登录的时候显示的信息如下:

    OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 Feb 2013
    ...Some sensitive information...
    debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
    debug1: match: OpenSSH_5.3 pat OpenSSH_5*
    debug1: Enabling compatibility mode for protocol 2.0
    debug1: Local version string SSH-2.0-OpenSSH_6.0p1 Debian-4
    debug1: SSH2_MSG_KEXINIT sent
    debug1: SSH2_MSG_KEXINIT received
    debug1: kex: server->client aes128-ctr hmac-md5 none
    debug1: kex: client->server aes128-ctr hmac-md5 none
    debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
    debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
    debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
    debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
    ...Some sensitive information...
    debug1: ssh_rsa_verify: signature correct
    debug1: SSH2_MSG_NEWKEYS sent
    debug1: expecting SSH2_MSG_NEWKEYS
    debug1: SSH2_MSG_NEWKEYS received
    debug1: Roaming not allowed by server
    debug1: SSH2_MSG_SERVICE_REQUEST sent
    debug1: SSH2_MSG_SERVICE_ACCEPT received
    debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
    debug1: Next authentication method: gssapi-keyex
    debug1: No valid Key exchange context
    debug1: Next authentication method: gssapi-with-mic
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    
    debug1: Next authentication method: publickey
    debug1: Trying private key: /home/mitchellchu/.ssh/id_rsa
    debug1: Trying private key: /home/mitchellchu/.ssh/id_dsa
    debug1: Trying private key: /home/mitchellchu/.ssh/id_ecdsa
    debug1: Next authentication method: password

    而Debian使用同样的命令测试的结果为:

    OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 Feb 2013
    ...Some sensitive information...
    debug1: Remote protocol version 2.0, remote software version OpenSSH_6.0p1 Debian-4
    debug1: match: OpenSSH_6.0p1 Debian-4 pat OpenSSH*
    debug1: Enabling compatibility mode for protocol 2.0
    debug1: Local version string SSH-2.0-OpenSSH_6.0p1 Debian-4
    debug1: SSH2_MSG_KEXINIT sent
    debug1: SSH2_MSG_KEXINIT received
    debug1: kex: server->client aes128-ctr hmac-md5 none
    debug1: kex: client->server aes128-ctr hmac-md5 none
    debug1: sending SSH2_MSG_KEX_ECDH_INIT
    debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
    ...Some sensitive information...
    debug1: ssh_ecdsa_verify: signature correct
    debug1: SSH2_MSG_NEWKEYS sent
    debug1: expecting SSH2_MSG_NEWKEYS
    debug1: SSH2_MSG_NEWKEYS received
    debug1: Roaming not allowed by server
    debug1: SSH2_MSG_SERVICE_REQUEST sent
    debug1: SSH2_MSG_SERVICE_ACCEPT received
    debug1: Authentications that can continue: publickey,password
    debug1: Next authentication method: publickey
    debug1: Trying private key: /home/mitchellchu/.ssh/id_rsa
    debug1: Trying private key: /home/mitchellchu/.ssh/id_dsa
    debug1: Trying private key: /home/mitchellchu/.ssh/id_ecdsa
    debug1: Next authentication method: password

    从上面可以看到,在CentOS中,系统使用了publickey,gssapi-keyex,gssapi-with-mic,和password来进行认证(上面颜色标记行,23行),而Debian此时则使用了Publickey和password两种。在连接CentOS的时候,在23行处花费了相当多的时间。我们在那里开始往下看,就能非常清楚的看到下面的信息:

    #下面使用的是GSSAPI-KEYEX来进行验证
    debug1: Next authentication method: gssapi-keyex
    #但是报错:没有可用的Key来交换信息
    debug1: No valid Key exchange context
    #系统接着又使用下一个验证方法:GSSAPI-WITH-MIC
    debug1: Next authentication method: gssapi-with-mic
    #但遗憾的是,GSSAPI-WITH-MIC方法也失败。
    #原因:不能确定数字主机地址的域
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    # 在尝试几次后,SSH认证终于放弃了这种验证。进入下一个验证:Publickey
    debug1: Next authentication method: publickey

    除了这个方法还有其他方法么?这个自然是有的,CentOS其实就已经提供给我们一个解决方案了——使用ssh远程登录的时候禁用GSSAPI验证。当然,还有一个问题不得不注意,假如你的机器上启用了UseDNS的话,需要一并关闭,具体可参见最后的说明。

    从错误可以看出应该是和主机域相关的问题——应该是无法确认IP对应的域,因此会出现这个问题。GSSAPI主要是基于Kerberos的,因此要解决这个问题也就变得要系统配置有Kerberos,这对于没有Kerberos的筒子们来说,配置个Kerberos就为了解决个登录延时问题,似乎不是个明智的决定——特别是在生产环境中!最小化满足需求才是王道。

    下面先放出处理GSSAPI的方法

    禁用GSSAPI认证有两个方式:客户端和服务端

    1. 客户端禁用

    比较简单,影响的只有单个客户端用户,可以用下面的方法实现:

    ssh -o GSSAPIAuthentication=no your-server-username@serverIP

    用上面的方法登录远程,即可实现禁用GSSAPIAuthentication。

    假如你嫌麻烦,直接配置你ssh客户端的文件/etc/ssh/ssh_config来达到永久解决这个问题:

    vi /etc/ssh/ssh_config
    ### 找到ssh_config文件里面的GSSAPIAuthentication yes这行
    ### 修改为GSSAPIAuthentication no
    ### 保存ssh_config文件并退出

    这个修改方法是将所有这个机器上的用户都影响到了,假如你影响面不要那么的广泛,只要在指定的用户上实施禁用GSSAPIAuthentication的话,那么你可以在该用户的目录下,找到.ssh目录,在其下面添加config文件,并在文件内添加上面这句,假如没有这个文件,你也可以直接这么做:

    cat >>~/.ssh/config<<EOF
    GSSAPIAuthentication no
    EOF

    使用cat,直接将输入导出到文件中,这时候,你在使用ssh连接远程的目标主机时,就不会再使用GSSAPI认证了。

    上面这些文件是在客户端,不是服务端的。也就是说,要修改这个文件,你的客户端也要是Linux才行。

    假如你是在Windows下使用PuTTY这样的客户端工具,就不使用上面这个方法了,PuTTY下可以尝试在连接之前进行设置:

    PuTTY Configuration -> Connection -> SSH -> Auth -> GSSAPI -> (取消勾选)Attempt GSSAPI authentication(SSH-2 only)

    假如没有关闭PuTTY的GSSAPIAuthentication,你可以在连接的窗口右键(或:Ctrl + 右键)查看日志,可以发现PuTTY会自动尝试GSSAPI连接的日志:

    2014-05-18 23:46:54 Using SSPI from SECUR32.DLL
    2014-05-18 23:46:54 Attempting GSSAPI authentication
    2014-05-18 23:46:54 GSSAPI authentication request refused

    恩,上面基本上将客户端禁止GSSAPIAuthentication的方法罗列了一下。

    注意:上面这些方法是比较通用的。

    2、假如你已经配置了Kerberos的情况下

    那么你也可以尝试下如下的客户端解决这个问题的方法:

    添加远程主机的主机名到你本机的host文件中(Linux是/etc/hosts,Windows是系统盘:/Windows/System32/drivers/etc/hosts)。Linux和Windows下都可以添加下面这行。

    ### 注意:下面这样的IP-Addr要替换成你的远程机器的IP地址,HostName,自然是主机名
    IP-Addr HostName

    添加完毕之后,保存退出。

    假如你没有配置Kerberos的话,仅配置这个hosts文件一样是不能解决问题的,在使用ssh登录的时候,你可以看到报错日志会类似下面这样:

    debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mi
    debug1: Next authentication method: gssapi-keyex
    debug1: No valid Key exchange context
    debug1: Next authentication method: gssapi-with-mic
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Credentials cache file '/tmp/krb5cc_0' not found
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Credentials cache file '/tmp/krb5cc_0' not found
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Credentials cache file '/tmp/krb5cc_0' not found
    
    debug1: Next authentication method: publickey

    这个错误我在刚开始的时候也犯了的,需要注意。

    3、服务端禁用GSSAPIAuthentication。

    直接到/etc/ssh/sshd_config里面,将GSSAPIAuthentication yes改为no即可了,同时也请注意,你可能也需要将UseDNS这个也修改成UseDNS no(这个要注意,每个系统的默认值不同,此处以CentOS 6为例):

    sudo vi /etc/ssh/sshd_config
    ### 普通用户权限不够,需要root权限
    ### 找到GSSAPIAuthentication yes,修改为
    ### GSSAPIAuthentication no
    ### 注意,这里你也需要将UseDNS修改为no,CentOS默认是yes,即使这行已被注释,你也需要加上
    ### UseDNS no
    ### 有看到人说UseDNS yes不需要修改为UseDNS no,Mitchell测试下来是需要的。
    ### 保存文件,退出

    当禁用之后,我们需要重启SSH服务来保证新的配置文件被正确应用:

    service sshd restart

    这个时候,再次使用SSH登录这个主机时,是不是感觉飞快了?

    呼~ 终于完成了这篇长文,要一边捣腾一边弄出这些个文字,还是真是有点困难。不过,这样也就将问题捣腾的差不多了,希望看文章的你能够看的明白,欢迎讨论。

    说明:

    1. GSSAPI:Generic Security Services Application Program Interface,GSSAPI本身是一套API,由IETF标准化。其最主要也是著名的实现是基于Kerberos的。一般说到GSSAPI都暗指Kerberos实现。

    2. UseDNS:是OpenSSH服务器上的一个DNS查找选项,而且默认还是打开的,在打开的状态下,每当客户端尝试连接OpenSSH服务器的时候,服务端就自动根据用户客户端的IP进行DNS PTR反向查询(IP反向解析才会有记录),查询出IP对应的Hostname,之后在根据客户端的Hostname进行DNS正向A记录查询。通过这个查询,验证IP是否和连接的客户端IP一致。但绝大部分我们的机器是动态获取IP的,也就是说,这个选项对于这种情况根本就没用——即使是普通静态IP服务器,只要没有做IP反向解析,也难以适用。假如你符合这些情况,建议关闭UseDNS以提高SSH远程登录时候的认证速度。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。