SSH 的替代品:Mosh

本文简要说明为什么要使用 Mosh 代替 SSH 以及 如何安装、使用 Mosh。

以前登录远程系统我们都使用 telnet,但它不安全,所以后来我们又使用 SSH。

SSH 可以密码登录/公钥登陆。它的主要优势是加密,这就避免了通信时被篡改或窃听。

SSH 的缺点

用简单的术语来表达 SSH 的工作,就是加密的 TCP 连接。

SSH 和 telnet 一样在客户端和服务端之间发送数据,但不一样的是,SSH 的所有报文都是加密的,包括你键盘输入的、你显示器上显示的所有内容,中间不会有任何缓冲和处理。

它只发送或接受加密的报文

但如果网络突然断开,或者网络很慢的时候会怎样呢?TCP 连接会断开,本地终端会卡死而没有任何错误提示。这不是通常意义上的 Linux 系统卡死,只是终端由于网络终端而卡住了。

你可能在以下时候遇到这种情况:

  1. 你的网络中断了,但 SSH 并没有提示任何内容。但你输入时,终端却没有响应。你就会去检查你的 Wifi 了
  2. 网络很慢时,也会如此。你输入的内容可能过了几秒才显示出来,糟糕的时候可能几分钟
  3. 当你长时间不操作终端,SSH 有时会自己停止工作,即使你的系统正在运行,网络也良好

总的来说,SSH 提供了安全性保障,但在高延迟时就不好用了。要想在 SSH 断开之后命令继续运行,就得使用 nohup 命令了(或者是 daemon 程序)。但这不是个好方案,更好的选择是使用 Mosh!(或者使用 screen 或者 tmux 这样的终端管理器,这是以后的话题)

Mosh:没有网络问题的 SSH

Mosh 的意思是是 MObile SHell。它简单地解决了上面说到的问题。使用的技术类似 用了 SSP 协议的对象缓存与同步。并且它使用 UDP 这个无状态的网络协议传输数据。

关于它的技术细节,你可以访问它的官网。

为了不造轮子,Mosh 使用 SSH 认证。所以你不用再生成密钥对或者用户等等了,并且 SSH 所有的安全性有点 Mosh 也都继承了。但这意味着你在使用 Mosh 之前要配置 SSH。

安装 Mosh

安装配置 SSH 想必你已经不在话下。在配置好 SSH 后,可以用包管理器安装 Mosh:

sudo apt update
sudo apt install mosh

其它 Linux 发行版的仓库里基本也都带 Mosh。用相应的包管理器安装就是了。

安装完成后,客户端就可以用了,但服务端还需要一些简单的配置。

配置 Mosh 服务端

还记得我说 Mosh 使用的是 UDP 不?默认情况 Mosh 使用 UDP 的 60000-61000 端口。如果你的系统上有防火墙,你得把这些端口打开,用 ufw 的话命令如下:

sudo ufw allow 60000:61000/udp

使用 Mosh 连接

Mosh 用起来很简单,跟 SSH 类似:

mosh seeni@LinuxHandBook.com

但是如果你想指定 SSH 端口或者其它选项,就得用 -ssh 参数把 SSH 的选项传过去。例如远程服务器的 SSH 端口是 2222:

mosh seeni@LinuxHandBook.com --ssh="ssh -p 2222"

要体验 Mosh 的威力,你可以在连上之后断开网络,然后再接上网络。你会发现 Mosh 依然能正常工作。这非常酷,对吧。

更多的用法,就留给你探索吧。

写在最后

这篇小文的主要内容来自 Get Rid of Network Connectivity Issues in SSH with Mosh

hah
Copyleft - All rights reversed. The internet is free and so is my content.