SSH 卡很久的解决办法

遇到 SSH 卡很久,大概要30秒以上怎么解决?

这种情况首先确认下 sshd_config 中的2个配置是否是如下这样:

UseDNS no
GSSAPIAuthentication no

UseDNS 选项打开状态下,当客户端试图登录SSH服务器时,服务器端先根据客户端的IP地址进行DNS PTR反向查询出客户端的主机名,然后根据查询出的客户端主机名进行DNS正向A记录查询,验证与其原始IP地址是否一致,这是防止客户端欺骗的一种措施,但一般我们的是动态IP不会有PTR记录,打开这个选项不过是在白白浪费时间而已,不如将其关闭。

另外一个是GSSAPI 认证会消耗很长时间,其实关闭了也没多大影响,一般 SSH 依次进行的认证方法的是 publickey, gssapi-keyex, gssapi-with-mic, password, 这个你可以ssh -v开启 debug 模式在连接日志看到。 一般用户只使用 password 认证方式,但前面 3 个认证过程系统还是会尝试,这就浪费时间了,也就造成 SSH 登录慢。
关于 GSSAPI 相关的认证,消耗的时间比较多,具体可以查看 SSH 连接日志。
GSSAPI 主要是基于 Kerberos 的,因此要解决这个问题也就变成要系统配置有 Kerberos, 一般用户是没有配置 Kerberos的

此外,我发现 systemd 的一个 bug 也会影响 ssh 登录慢,甚至还会影响操作系统内的任何操作,例如 su

通过 ssh -v 查看连接详情,发现会卡在 pledge: network 这里很久,

...
debug1: Authentication succeeded (publickey).
Authenticated to myserver.mydomain.com ([xx.xx.xx.xx]:22).
debug1: channel 0: new [client-session]
debug2: channel 0: send open
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network

另外在系统认证日志中会出现

pam_systemd(sshd:session): Failed to create session: Connection timed out

这种情况,可以重启下systemd-logind

systemctl restart systemd-logind

具体这个问题,可以参考这里