ssh 连接“client_loop:发送断开连接:管道损坏”或“通过 <IP> 端口 22 重置连接”

Ash*_*hah 15 ssh port-forwarding macos

几个月来我一直在使用 ssh 访问远程服务器,但最近我一直无法建立可靠的连接。有时我无法登录并收到消息“通过端口 22 重置连接”,当我可以登录时,我会在几分钟内收到错误消息“client_loop: send disconnect: Broken pipe”(即使终端未空闲)。

我的 ~/.ssh/config 文件有:

Host *  

     ServerAliveInterval 300
     ServerAliveCountMax 2
     TCPKeepAlive yes
Run Code Online (Sandbox Code Playgroud)

我的 /etc/ssh/sshd_config 文件有:

#ClientAliveInterval 300
#ClientAliveCountMax 3
Run Code Online (Sandbox Code Playgroud)

我最近将我的 xfinity 计划升级到了更快的速度,然后问题就开始发生了。但 xfinity 坚持认为问题出在我这边。请注意,我的室友也有同样的 ssh 问题...

有什么我遗漏的吗?任何帮助将不胜感激!(我在 Mac 上运行)

小智 15

David的回答是可以的,但是下面会解释更全面的解决方案。

\n

您可以在客户端或服务器上解决此问题。

\n

你怎么知道在哪里做呢?

\n
    \n
  • 如果您通过 SSH 连接到多个服务器,请在您的计算机上设置它。

    \n
  • \n
  • 如果您是系统管理员\n并且有几个用户抱怨 SSH 连接频繁断开,\n您可以在服务器上进行设置。

    \n
  • \n
\n

客户端

\n

连接到服务器时,使用以下-o选项:

\n
ssh -o ServerAliveInterval=600 username@example.com\n
Run Code Online (Sandbox Code Playgroud)\n

该值600代表600\xc2\xa0秒;即\xc2\xa010\xc2\xa0分钟。

\n

或者,将其添加到您的 ssh 配置文件中:

\n
    \n
  1. 创建 ssh 配置文件(如果不存在):\n
    touch ~/.ssh/config\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 设置权限:\n
    chmod 600 ~/.ssh/config\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 在配置文件中设置参数。\xe2\x80\x82例如:\n
    echo "ServerAliveInterval 600" >> ~/.ssh/config\n
    Run Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6\xc2\xa0 或使用编辑器。
  6. \n
\n

服务器端

\n
    \n
  1. 打开位于 的 sshd 配置文件/etc/ssh/sshd_config。
  2. \n
  3. 将参数ClientAliveInterval和设置ClientAliveCountMax为所需的值。
  4. \n
\n

例如,ClientAliveInterval=200和ClientAliveCountMax=3表示服务器将在 200 秒后发送一条活动消息。如果客户端没有响应,它将在 400 秒后再次发送一条活动消息。如果客户端仍然没有响应,则会在 600 秒后发送另一条存活消息。\xc2\xa0\n如果\xc2\xa0仍然没有响应,则 SSH 连接将被断开。

\n

来源:修复 SSH 连接的损坏管道错误\nat\xc2\xa0 Linux\xc2\xa0Handbook。

\n


Dav*_*rom 13

我通过编辑文件 ~/.ssh/config 解决了同样的问题:

Host *
    ServerAliveInterval 20
    TCPKeepAlive no
Run Code Online (Sandbox Code Playgroud)

动机:

TCPKeepAlive no表示“不向服务器发送 keepalive 消息”。如果设置了相反的 TCPKeepAlive yes,则客户端向服务器发送 keepalive 消息并需要响应以维持其连接结束。这将检测服务器是否出现故障、重新启动等。这样做的问题是,如果客户端和服务器之间的连接在短时间内中断(由于网络连接不稳定),这将导致保持活动消息失败,客户端将用“断管”结束连接。

设置TCPKeepAlive no告诉客户端只假设连接仍然良好,直到用户请求证明否则,这意味着当您的 ssh 术语在后台闲置时临时连接中断不会终止连接。

  • 该设置是针对客户端的。 (7认同)
  • 我的经验是“TCPKeepAlive”在大多数情况下(不仅仅是 ssh 连接)没有用。有两个地址转换防火墙/路由器和负载均衡器会忽略 TCP keepalive 数据包并丢弃“空闲”连接。TCP Keepalive 在 90 年代和 2000 年代是一个好主意,但现在已经不再是了。不过,“ServerAliveInterval”非常好。它在应用层而不是 TCP 层交换握手,通常可以防止网络设备丢失连接。 (6认同)
  • 这是针对服务器还是客户端的设置? (4认同)
  • @ljden 是的。两种不同的保持活动机制。来自“man ssh_config”:“需要注意的是,服务器活动消息的使用与 TCPKeepAlive(如下)有很大不同。服务器活动消息通过加密通道发送,因此不会被欺骗。TCPKeepAlive 启用的 TCP keepalive 选项是可欺骗的。当客户端或服务器依赖于了解连接何时变为非活动状态时,服务器活动机制非常有价值。` (3认同)