如何解决 ssh 连接响应慢问题?

小梦IT 2022-05-06 13:18:36 664阅读 广西南宁市 广西中医学院

问题现象:
我使用 frp 做内网穿透,也就是 client -> 公网服务器 -> 目标服务器(局域网机器),来实现局域网机器可外部访问。
配置好 ssh 后,发现在 ssh -p xxxx user@host 的时候,输入密码后,就卡住了,大约花费 10s 钟才能返回响应结果。
非常的浪费时间,非常的难受!
请问大神如何解决?

提示:如果此问题没有解决您的需求,您可以点击 “我也要问” 在线咨询。 我也要问

若此问题存在违规行为,您可以点击 “举报”

1条回答

  • 苍狼
    2022-05-06 13:23:39 已采纳

    我遇到过这个问题,也做了笔记,正好分享出来。

    网络上的类似修改 /etc/ssh/sshd_config、/etc/nsswitch.conf、/etc/resolv.conf 都没用,建议你尝试下面两种办法:


    1、重启 systemd-logind 服务

    命令:systemctl stop systemd-logind

    原因:这应该是系统的一个缺陷,跟systemd有关,systemd-logind主要功能是为每一个登陆session创建一个systemd角度的cgroup管理对象,那些abandoned session应该就是没有及时释放的。

    备注:一般使用这个方法,就能马上解决问题,但是问题的根源在哪儿?可以看下第二个办法。


    2、PAM 认证

    文件目录:/etc/pam.d/

    命令:vi /etc/ssh/sshd_config #将UsePAM设为no,重启ssh后,问题解决。

    原因:pam_systemd.so 文件导致。(可以在 /etc/pam.d/ 中自行搜索此文件)

    备注:pam_systemd 将用户会话注册到 systemd 登录管理器(也就是 systemd-logind.service(8) 服务)中, 因此也同时注册到了 systemd 控制组(control group)之中。

    在登录(login)时,此模块与 systemd-logind.service 服务一起, 确保实现如下功能:

    如果用户运行时目录(/run/user/$UID)不存在, 那么就创建该目录或者以"tmpfs"文件系统挂载该目录, 同时根据登录用户为该目录设置磁盘配额、属主与属组。

    设置 $XDG_SESSION_ID 环境变量的值。 如果开启了审计并且 pam_loginuid.so 运行在此模块之前(强烈建议这么做), 那么将使用审计会话ID(/proc/self/sessionid)的值, 否则将使用独立的会话计数器的值。

    为会话创建一个新的 scope 单元。如果此会话是该用户多个并行会话中第一个建立的会话, 那么将会在 user.slice 之下自动创建一个针对该用户的 slice 单元,并将新建的 scope 单元置于其中。 按照会话用户的身份启动一个 user@.service 系统服务实例 (也就是运行一个 systemd 用户实例)。

    在退出(logout)时,此模块确保实现如下功能:

    如果在 logind.conf(5) 中设置了 KillUserProcesses=yes (无论明确还是隐含), 那么将会杀死会话中的所有进程。如果此会话是该用户多个并行会话中最后一个退出的会话, 那么还会同时终止该用户的 systemd 用户实例以及 slice 单元。

    如果此会话是该用户多个并行会话中最后一个退出的会话, 那么将会删除该用户的运行时目录(/run/user/$UID) 以及其中的所有内容。

    如果系统的 init 进程不是 systemd , 那么此模块什么也不做,并且立即返回 PAM_SUCCESS 值。

    所以问题还是回归到了 systemd-logind.service!

    持续跟踪用户的会话、进程、空闲状态。 这将在 user.slice 之下,为每个用户分配一个 slice 单元、为每个用户的当前会话分配一个 scope 单元。 同时,针对每个已登录的用户,将会启动一个专属的服务管理器(作为 user@.service 模版的一个实例)。

    生成并管理"session ID"。如果启用了审计并且已经为一个会话设置了审计"session ID", 那么该ID也将同时被用作"session ID", 否则将会使用一个独立的会话计数器(也就是独立生成一个"session ID")。

    为用户的特权操作(例如关闭或休眠系统) 提供基于 polkit 的认证与授权

    为应用程序实现 阻止关闭/休眠系统的逻辑

    处理 硬件关机/休眠按钮的动作

    多席位(Multi-Seat)管理

    会话切换管理

    管理 用户对设备的访问

    在启动虚拟终端时 自动启动文本登录程序(agetty), 并管理用户的运行时目录。

    用户会话是通过 pam_systemd(8) PAM 模块 在 logind 中注册的。


    排查过程借鉴的资料:

    https://blog.csdn.net/Bill_Xiang/article/details/78909167

    https://blog.csdn.net/Dancen/article/details/115560218


    203 举报

快速提问,在线解答

1

描述需求

填写需求概要标题,补充详细需求

2

耐心等

等待网友或网站工作人员在线解答

3

巧咨询

还有疑问?及时追问回复

立即咨询