为什么 macOS Monterey 上的传入 SSH 停止工作,但可以通过重新启动 sshd 暂时修复?

为什么 macOS Monterey 上的传入 SSH 停止工作,但可以通过重新启动 sshd 暂时修复?

多年来,我一直允许我的一台家用机器上的 ssh 传入,从未发生过任何事故。最近它停止工作了。我发现可以通过重新启动 sshd 进程来修复此问题,使用以下命令:

sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

此后,它会工作一段时间,但通常会在 24 小时内再次卡住。我在日志中寻找线索,但到目前为止还没有找到任何东西。

Mac mini(2014 年末)、MacOS Monterey 12.7.3、SSH-2.0-OpenSSH_8.6

几个月前,我安装了 Cisco AnyConnect VPN,我想知道这是否是罪魁祸首(虽然我不能确定故障是否从那时开始,因为在此之前我已经很长时间没有使用远程 ssh 了),然而在我关闭它之后,行为是一样的,并且该应用程序配置为即使在 VPN 运行时也允许本地 LAN 访问。

我的家庭 LAN 是一个 TP-Link 路由器(Archer A7,AC 1750),并且已经设置了 DDNS,以便我可以远程连接到相关计算机,我第一次注意到这个问题是在我无法远程登录的时候,有一段时间我错误地认为问题出在路由器和/或 DDNS 上,但我认为通过在 Mac 上重新启动 sshd 来解决问题这一事实驳斥了任何此类解释。

版本sshdOpenSSH_8.6p1, LibreSSL 3.3.6。我安装了 Homebrew,在自己的软件中使用了许多库,并且相当定期地更新。

问题似乎出在 Mac 本身上:我可以使用 连接它ssh localhost,但不能使用本地192.168.0.xLAN 地址。事实上,我我认为使用连接ssh localhost表明 ssh-agent 已启动并正在运行,并且正确启动sshd

我尝试禁用 Mac 防火墙,但没有什么作用。(它已经配置为允许传入ssh)。

几周前我发过Stack Overflow 上此问题的版本,并在被禁用之前收到了一些建议,因为它“与编程无关”。但以下是针对建议中提出的一些问题的回答:

  • Mac 没有静态 IP(这就是为什么需要 DDNS!)。但是,路由器 DHCP 配置为始终为我的家用电脑和打印机分配相同的 LAN 地址,因此本地 LAN 地址不会改变。外部 WAN 地址很少改变,并且由 DDNS 透明处理。这似乎不是问题,因为当它停止工作时,即使从机器本身使用本地 LAN 地址,它也会停止工作(尽管如果localhost 指定,它会工作)。

  • 运行时ssh,它会停留很长时间并最终打印“操作超时”:

    (base) bash-3.2$ ssh 192.168.0.132
    ssh: connect to host 192.168.0.132 port 22: Operation timed out
    

    在完全详细模式下运行时,挂起之前会显示以下内容:

    (base) bash-3.2$ ssh -vvv 192.168.0.132
    OpenSSH_8.6p1, LibreSSL 3.3.6
    debug1: Reading configuration data /Users/jeff/.ssh/config
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: /etc/ssh/ssh_config line 21: include /etc/ssh/ssh_config.d/* matched no files
    debug1: /etc/ssh/ssh_config line 54: Applying options for *
    debug1: /etc/ssh/ssh_config line 58: Applying options for *
    debug2: resolve_canonicalize: hostname 192.168.0.132 is address
    debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts' -> '/Users/jeff/.ssh/known_hosts'
    debug3: expanded UserKnownHostsFile '~/.ssh/known_hosts2' -> '/Users/jeff/.ssh/known_hosts2'
    debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
    debug3: ssh_connect_direct: entering
    debug1: Connecting to 192.168.0.132 [192.168.0.132] port 22.
    debug3: set_sock_tos: set socket 3 IP_TOS 0x48
    

在的建议下harrymc,我尝试了ssh -o IPQoS=none <hostname>,但结果是一样的。

giacomo1968建议这可能与这个问题涉及 homebrew 和$PATH,但我不这么认为。首先,该问题是关于使用密钥进行身份验证失败,而在我的情况下,连接尝试只是挂起。我确实openssl在我的 shell 中检查了来自哪里,令我惊讶的是,它来自 anaconda 目录,因此我编辑了rc文件,注释掉了将 anaconda bin 目录添加到路径的行,但这没有什么区别。此外,当尝试从未安装 anaconda 的其他主机连接时会出现此问题(包括我手机上的终端仿真器,它没有 HomeBrew)。我不确定如何检查,但我会假设以root 身份运行的sshdssh-agent使用系统提供的版本。

相关内容