SwiftServer
终端

Mosh

会话在网络切换和设备休眠后继续存活,SwiftServer 如何引导 mosh-server,以及 UDP 出问题时怎么排查。

网络切换、信号变差、设备休眠,Mosh 都能让终端会话活着。会话进行中从 Wi-Fi 切到蜂窝网络, shell 还在原处。SwiftServer 原生实现了 Mosh 协议,服务器上只需要装好 mosh-server。

为一台机器启用 Mosh

Mosh 是逐台机器设置的连接模式:

  1. 编辑这台机器,把连接设为 Mosh。
  2. 需要的话调整服务器可执行文件(默认是 PATH 上的 mosh-server; 如果你的装在别处,就填绝对路径)。
  3. 保存。这台机器的终端操作随之变成启动 Mosh 终端。

一次会话是怎么起来的

SwiftServer 先照常用 SSH 连接(同样的认证,同样的主机密钥校验),通过这条连接启动 mosh-server,然后把会话交给 UDP 并关闭 SSH 通道。Mosh 协议本身不带密码: 会话密钥是在加密的 SSH 引导过程中交换的,之后所有 Mosh 流量都用它加密。

机器编辑页里的测试连接只验证 SSH 引导,UDP 那一侧在你第一次启动终端时才会验证。

前提条件

  • 服务器上装有 mosh-server(apt install mosh、dnf install mosh、 brew install mosh 等等)。
  • 从你的设备到服务器,协商出的那个端口上 UDP 可达。默认情况下 mosh-server 在它的标准范围(60000–61000)里挑一个端口,请放通这个范围,或者自己指定一个。

要固定端口范围,在机器编辑页打开使用自定义 UDP 端口范围,设置起始 UDP 端口和 结束 UDP 端口。SwiftServer 会把它们传给 mosh-server,这样你在防火墙上只需要放通 一个很小的范围。

跳板机与代理

Mosh 的引导过程会经过你配置的跳板机或代理,但 UDP 会话是直连的。 如果这台机器的地址只能通过代理到达,请在这台机器的 Mosh 设置里填一个可以直连的 UDP 主机。

一次 Mosh 会话的生命周期

  • 换了网络,会话会跟着走:SwiftServer 把 UDP 流固定到一个解析好的地址上,并在路径变化时重建连接。 你可能会短暂看到「Mosh is rebuilding its UDP connection」,接着是 「Mosh UDP connection restored」。
  • 服务器一直没有动静时,状态行会把时间数出来:「No Mosh server contact for N seconds」。
  • 服务器结束了会话时(例如 mosh-server 被杀掉),终端会报 「The Mosh server ended the session.」。重新连接会开一次新的会话。

故障排查

「mosh-server exited with status 127」(或者其他带「command not found」的类似消息): mosh-server 没有安装,或者不在非交互 SSH 的 PATH 上。装上 Mosh, 或者在服务器可执行文件里填绝对路径。

「mosh-server did not print MOSH CONNECT within 8 seconds」:引导跑起来了, 但没有产生会话行。通常是某个 shell 启动脚本在打印多余的东西或者卡住了; 可以通过 SSH 手动运行一次 mosh-server,看看它的输出。

连上了,但终端一片空白卡住:SSH 引导成功了,UDP 被挡住了。 请在你和服务器之间的每一道防火墙上放通那段 UDP 端口范围(包括云上的安全组), 或者改成一段你能放通的自定义范围。

「Could not resolve the Mosh UDP host」:这个主机名在你的设备上解析不到 IPv4/IPv6 地址。改用 IP,或者显式设置 UDP 主机。

Mosh 会话的断开对话框里有一节 Mosh 诊断,包含完整的引导与连接日志。 先看它;如果你要写信给支持,也请把它附上。

本页内容