[排错] 解决 SSH 远程登录时很慢但 ping 时延迟很低

分析

ssh 远程某台服务器时很慢,但是 ping 时延迟却很低。这可能是 DNS 解析出现问题造成的,禁用服务器上 sshd 的 GSSAPIAuthentication 参数和 UseDNS 参数可以解决,这两个参数的作用是:
1) GSSAPIAuthentication,当服务器的 sshd 服务此参数处于开启状态时,客户端 SSH 登录此服务器时,客户端会对服务器的 IP 地址进行 PTR 反解析,获得服务器的域名,再通过服务器的域名对服务器进行 DNS A 正向 IP 地址解析,通过此方法来防止欺骗。
2) UseDNS,当服务器的 sshd 服务此参数处于开启状态时,客户端 SSH 登录此服务器时,服务器会对客户端的 IP 地址进行反解析,获得客户端的域名,再通过客户端的域名对客户端进行 DNS A 正向 IP 地址解析,通过此方法来防止欺骗。

解决方法

方法一:忽略 DNS

1.1 修改 SSH 的配置文件

# vim /etc/ssh/sshd_conf

将以下内容:

......
UseDNS yes
......
GSSAPIAuthentication yes
......

修改为:

......
UseDNS no
......
GSSAPIAuthentication no
......

1.2 让修改的 SSH 配置文件生效

# systemctl restart sshd

方法二:重启 systemd-logind

2.1 重启 dbus

# systemctl restart dbus

2.2 重启 systemd-logind

# systemctl restart systemd-logind

(注意:如果不重启 dbus 直接重启 systemd-logind 则可能会报错)

[命令] Linux 命令 eval (执行变量里的命令或实现指针)

内容一:eval 命令的作用

对将要执行的命令进行 2 次扫描,第 1 次扫描时把扫描的内容替换成命令,第 2 次扫描时执行扫描到的命令

内容二:eval 直接执行命令的案例

2.1 设置变量

# url=eternalcenter.com

(补充:这里以将内容 eternalcenter.com 赋值给变量 url 为例)

2.2 显示变量里内容

# echo $url
eternalcenter.com

或者:

# eval echo $url
eternalcenter.com

(补充:这里以显示变量 url 里的内容 eternalcenter.com 为例)

内容三:eval 将变量转换成命令后执行的案例

3.1 将命令设置成变量

# command=pwd

(补充:这里以将命令 pwd 赋值给变量 command 为例)

3.2 显示变量里的命令

# echo $command
pwd

(补充:这里以显示变量 command 里的 pwd 命令为例)

3.3 执行变量里的命令

# eval $command
/root

(补充:这里以执行变量 command 里的 pwd 命令为例)

内容四:eval 显示脚本里最后 1 个位置变量的内容

4.1 创建显示最后 1 个位置变量的脚本

# vim test.sh

创建以下内容:

#!/bin/bash
eval echo \$$#

(补充:这里创建名为 test.sh 的脚本为例)

4.2 带位置变量执行脚本

# . test.txt a b c d e
e

(补充:这里执行名为 test.sh 的脚本并附带 a b c d e 5 个位置变量为例)

内容五:eval 实现指针

5.1 设置变量

# url=eternalcenter.com

(补充:这里以将内容 eternalcenter.com 赋值给变量 url 为例)

5.2 设置指针

# pointer=url

(补充:这里以让指针 pointer 指向 url 变量为例)

5.3 显示指针指向的变量

# echo $pointer
url

(补充:这里以显示指针 pointer 指向的变量 url 为例)

5.4 显示指针最终指向的内容

# eval echo \$$pointer
eternalcenter.com

(补充:这里以显示指针 pointer 指向的最终内容 eternalcenter.com 为例)

[命令] Linux 命令 mtr (检测网络联通状态)

案例一:一直检测某 1 个 IP 地址的联通状态并边检测边显示状况

# mtr -n 8.8.8.8

或者:

# mtr --no-dns 8.8.8.8


补充:
1) 这里以检测 8.8.8.8 IP 地址为例
2) -n 或者 –no-dns 参数代表不使用 DNS 解析主机名

案例二:检测某 1 个 IP 地址 100 次的联通状态并边检测边显示状况

2.1 检测某 1 个 IP 地址 100 次的联通状态并边检测边显示状况 (TCP 加 UDP 版)

# mtr -nc 100 8.8.8.8

或者:

# mtr --no-dns --report-cycles 100 8.8.8.8


补充:
1) 这里以检测 8.8.8.8 IP 地址为例
2) -n 或者 –no-dns 参数代表不使用 DNS 解析主机名
3) -c 或者 –report-cycles 参数代表指定次数

2.2 检测某 1 个 IP 地址 100 次的联通状态并边检测边显示状况 (TCP 版)

# mtr -nTc 100 8.8.8.8

或者:

# mtr --no-dns --tcp --report-cycles 100 8.8.8.8


补充:
1) 这里以检测 8.8.8.8 IP 地址为例
2) -n 或者 –no-dns 不使用 DNS 解析主机名
3) -T 或者 –tcp 指定 TCP 端口
4) -c 或者 –report-cycles 指定次数

2.3 检测某 1 个 IP 地址 100 次的联通状态并边检测边显示状况 (UDP 版)

# mtr -nuc 100 8.8.8.8

或者:

# mtr --no-dns --udp --report-cycles 100 8.8.8.8


补充:
1) 这里以检测 8.8.8.8 IP 地址为例
2) -u 或者 —udp 指定 UDP 端口
3) -n 或者 –no-dns 参数代表不使用 DNS 解析主机名
4) -c 或者 –report-cycles 参数代表指定次数

案例三:检测某 1 个域名 100 次的联通状态并显示最终报告

# mtr -nrc 100 eternalcenter.com

或者:

# mtr --no-dns --report --report-cycles 100 eternalcenter.com


补充:
1) 这里以检测 eternalcenter.com 域名为例
2) -n 或者 –no-dns 参数代表不使用 DNS 解析主机名
3) -r 或者 –report 参数代表生成最终报告
4) -c 或者 –report-cycles 参数代表指定次数

案例四:检测某 1 个域名 TCP 443 端口 100 次的联通状态并显示最终报告

# mtr -TP 443 -nrc 100 eternalcenter.com

或者:

# mtr --tcp --port 443 --no-dns --report --report-cycles 100 eternalcenter.com


补充:
1) 这里以检测 eternalcenter.com 域名的 443 端口为例
2) -n 或者 –no-dns 参数代表不使用 DNS 解析主机名
3) -r 或者 –report 参数代表生成最终报告
4) -c 或者 –report-cycles 参数代表指定次数
5) -T 或者 –tcp 参数代表指定 TCP
6) -P 或者 –port 参数代表指定端口号