DNS 反向解析导致 ssh 连接缓慢

检查 sshd 配置文件

一般,默认的 UseDNS 参数都是注释的

grep UseDNS /etc/ssh/sshd_config

centos 一般默认是这样的,openeuler 22.03 (LTS-SP4) 默认是 no

#UseDNS yes

查看 sshd 配置文件的默认值

方法一

man sshd_config | grep -A 5 UseDNS
  • 指定 sshd(8)是否应查找远程主机名,并检查远程 IP 地址的解析主机名是否映射回相同的 IP 地址
  • 默认值为 “yes”
  • 如果该选项设置为 no,那么在 ~/.ssh/authorized_keys 文件中的 from 选项和 sshd_config 文件中的 Match Host 指令中只能使用地址,不能使用主机名。
     UseDNS  Specifies whether sshd(8) should look up the remote host name, and to check that the resolved host name for the remote IP address maps back to the very same IP address.
             The default is “yes”.

             If this option is set to no then only addresses and not host names may be used in ~/.ssh/authorized_keys from and sshd_config Match Host directives.

方法二

这个方法是验证 sshd 当前的配置,如果修改了 /etc/ssh/sshd_config 配置文件,下面的命令也会看到配置的更新

sshd -T | grep usedns

centos 默认是 yes

usedns yes

修改 sshd 配置文件

/etc/ssh/sshd_config 文件内加入下面的内容,确保没有其他的 UseDNS 是非注释状态

UseDNS no

重启 sshd 应用配置文件

systemctl restart sshd

通过上面的 sshd -T | grep usedns 可以看到 usedns 已经从 yes 变成了 no,再次 ssh 就快很多了

题外扩展

以下内容取自 chatgpt,本人还未验证过

  • 上面的配置文件提到过,如果 UseDNS 选项设置为 no,那么在 ~/.ssh/authorized_keys 文件中的 from 选项和 sshd_config 文件中的 Match Host 指令中只能使用地址,不能使用主机名
  • 这里扩展一下这两个的场景

~/.ssh/authorized_keys 中的 from 条件

from 条件用于限制某个公钥登录的客户端来源(IP 地址或主机名)。你可以在 ~/.ssh/authorized_keys 文件中,为每个公钥添加一个 from 条件,指定只有从特定的 IP 地址或主机才能使用该公钥登录

  • 语法格式
from="host1,host2" ssh-rsa AAAAB3... user@host
  • 示例场景

    • 限制访问到特定 IP 地址:你希望只有从公司内部网或特定的 IP 地址才能通过公钥登录。通过 from 限制,可以确保即使公钥泄露,也只能从指定的 IP 地址登录

      • from="192.168.1.0/24" ssh-rsa AAAAB3... user@host
        
      • 这条配置表示只有从 192.168.1.0/24 网段内的主机才能使用这个公钥登录

    • 限制特定主机名:如果 UseDNS yes,也可以使用主机名进行限制

      • from="trustedhost.example.com" ssh-rsa AAAAB3... user@host
        
      • 这里指定只有主机 trustedhost.example.com 能使用该公钥登录

  • 注意事项

    • UseDNS 设置为 no 时,from 条件只能使用 IP 地址,不能使用主机名
    • 如果 DNS 解析不可靠或延迟很高,建议使用 IP 地址来避免问题

sshd_config 中的 Match Host 指令

Match 指令可以根据多个条件(如客户端的主机名、IP 地址、用户等)对 SSH 配置进行精细控制。Match Host 是其中的一种条件,允许你根据客户端的主机名或 IP 地址为其应用特定的 SSH 设置

  • 语法格式
Match Host pattern
    <SSH 选项>
  • 示例场景

    • 为特定主机应用不同的设置:你可以根据不同的主机名或 IP 地址,对 SSH 配置进行细粒度的控制。例如,要求来自某个主机的连接只能使用密码认证,而来自其他主机的连接可以使用公钥认证

      • Match Host 192.168.1.100
            PasswordAuthentication yes
        Match Host *
            PasswordAuthentication no
        
      • 在这个例子中,IP 为 192.168.1.100 的主机可以使用密码登录,而其他所有主机则必须使用公钥认证

    • 限制特定主机只能通过特定用户登录:你可以限制来自特定 IP 或主机名的登录只能使用特定用户

      • Match Host 192.168.1.100
            AllowUsers specialuser
        
      • 这样,来自 192.168.1.100 的主机只能通过 specialuser 登录

  • 注意事项

    • from 一样,如果 UseDNS 设置为 no,那么 Match Host 只能使用 IP 地址,不能使用主机名
    • Match 指令必须放在 sshd_config 文件的最后部分,因为它会根据条件覆盖前面的全局配置

fromMatch Host 的区别和联系

  • 使用层次

    • from 是针对特定公钥的约束,只作用于 ~/.ssh/authorized_keys 文件中的特定公钥。
    • Match Host 是在全局 SSH 配置中控制客户端主机行为的指令,可以影响整个 SSH 配置文件的行为。
  • 使用场景

    • from 更适合精细化控制单个用户的公钥访问,尤其是在多用户服务器上,只需配置某个用户的公钥。
    • Match Host 更适合全局配置,比如为不同来源的主机或网段设置不同的安全策略。
  • 总结

    • from 条件 允许你为每个公钥设置基于来源 IP 地址或主机名的限制,主要用于细粒度控制单个用户或公钥的来源
    • Match Host 指令 则是服务器级别的配置,允许基于客户端的主机名或 IP 地址应用不同的 SSH 配置
  • 在实际使用中,这两者可以结合使用,通过 from 限制单个公钥的登录来源,同时通过 Match Host 在全局配置文件中对特定来源应用不同的 SSH 策略

### 如何通过SSH连接到虚拟机以及常见故障排查 #### 一、确认SSH服务状态并启用 在Linux系统中,如果无法通过SSH连接到虚拟机,首先要检查SSH服务的状态。可以使用以下命令查看SSH服务是否已启动: ```bash service sshd status ``` 如果没有启动,则可以通过以下命令手动启动SSH服务[^1]: ```bash service sshd start ``` 需要注意的是,这种手动启动的方式不会持久化生效。为了确保SSH服务在重启后仍然可用,应执行以下命令将其设置为开机自启: ```bash chkconfig sshd on ``` --- #### 二、优化SSH配置以提升性能 某些情况下,SSH连接可能会变得非常缓慢。这通常是因为`sshd`默认启用了DNS反向解析功能所致。要禁用此功能,需编辑`/etc/ssh/sshd_config`文件,并找到或添加如下参数[^2]: ```plaintext UseDNS no ``` 保存更改后,记得重启SSH服务使改动生效: ```bash service sshd restart ``` --- #### 三、处理自动断开连接的问题 当成功建立SSH会话后不久便被强制断开时,可能的原因之一是`.bashrc`脚本中的异常退出指令。具体来说,在用户的家目录下可能存在类似以下的内容[^3]: ```bash exit ``` 该语句会导致终端立即终止运行。因此,建议打开对应的`.bashrc`文件(通常是`~/.bashrc`或`/root/.bashrc`),删除多余的`exit`关键字。 --- #### 四、其他潜在问题及其解决方案 除了上述提到的情况外,还有几个常见的SSH连接障碍需要关注: 1. **防火墙阻止端口访问** 虚拟机所在主机的操作系统或者网络设备上可能设置了严格的防火墙策略,默认拒绝外部流量进入指定的TCP端口号(如标准的22号端口)。此时应当允许特定IP地址范围内的请求到达目标机器。 2. **SELinux干扰通信流程** 若目标操作系统启用了安全增强型Linux (Security-Enhanced Linux),它也可能阻碍正常的远程登录尝试。临时关闭方法如下所示;不过出于安全性考虑不推荐长期如此操作。 ```bash setenforce 0 ``` 3. **私钥认证失败** 当采用基于密钥的身份验证方式而非密码模式时,务必保证客户端公钥已经正确上传至服务器侧对应账户下的authorized_keys列表里头去了。 --- ### 提供一段简单的Python代码用于自动化检测SSH连通性 下面给出了一段利用paramiko库实现基本的功能演示程序片段——用来判断能否顺利抵达某台远端计算机节点之上。 ```python import paramiko def test_ssh_connection(hostname, port=22, username='root', password=None): try: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if password: client.connect(hostname, port=port, username=username, password=password) else: key_path = '/path/to/private/key' mykey = paramiko.RSAKey.from_private_key_file(key_path) client.connect(hostname, port=port, username=username, pkey=mykey) stdin, stdout, stderr = client.exec_command('whoami') output = stdout.read().decode() return f'Connection successful! Current user: {output.strip()}' except Exception as e: return str(e) if __name__ == '__main__': result = test_ssh_connection('your.vm.ip.address', username='testuser', password='mypassword') print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值