MOSH-ssh的更好替代

时间:2020-03-21 11:49:37  来源:igfitidea点击:

SSH是目前可用的最佳方法,用于以安全的方式与远程服务器建立连接。
系统管理员也经常使用ssh来执行管理任务。
SSH是真正的革命性协议,可以远程使用Shell并非常安全地执行操作。

但是,由于开销和设计限制,协议中存在一些缺点。
下面列出了其中一些。

  • 假设我们正在远程操作关键计算机,并且连接速度很慢。然后,ssh控制台会话将滞后很多。
  • 万一连接断开,我们永远都不能期望ssh连接状态保持不变。
  • SSH通过TCP起作用,因此,不支持IP地址漫游。
  • 较大的网络延迟和往返时间,将影响ssh的操作。

Keith Winstein以及Anders Kaseorg,Quentin Smith,Richard Tibbetts和Keegan McAllister提出了解决这些问题的好方法。
它叫Mosh或者称它为Mobile Shell。

什么是MOSH-Mobile Shell?

Mosh是一个远程终端应用程序,类似于ssh,可用于获取远程shell。
但是它解决了SSH中可用的大多数限制。

在MOSH中,我们很少会遇到诸如终端响应慢的问题。

MOSH通过过于重视从服务器传输到客户端的数据来实现此目的。
在正常的ssh会话中,服务器将永远不会关心客户端的网络连接速度,由于服务器和客户端连接速度的这种差异,客户端终端将遇到缓慢的响应。

通过采用取决于连接速度的通信帧速率,可以在MOSH中解决此问题。

MOSH(移动shell)如何实现这一目标?

MOSH使用状态同步协议。
该协议在UDP上工作,这有助于保持双方的屏幕状态几乎相同。

在客户端按下每个按键后,客户端会对屏幕状态做出一些预测。
有时还会根据错误的预测进行更正。

即使更改了IP,MOSH连接如何保持不变?

这是由于所谓的初始序列号。
初始序列号允许确定数据包计数及其顺序。
每当服务器收到带有递增的ISN(初始序列号)的数据报时,服务器会将新的目标IP更改为数据报中的IP。

如何安装MOSH手机shell ?

安装MOSH非常容易。
epel repo提供了mosh rpm,因此我们可以通过YUM轻松安装它。

注意:我们需要启用rpmforge和epel repo才能安装它。

================================================================================
 Package             Arch         Version                Repository        Size
================================================================================
Installing:
 mosh                i386         1.2.3-1.el5            epel             385 k
Installing for dependencies:
 perl-IO-Tty         i386         1.08-2.el5.rf          rpmforge          64 k

Transaction Summary
================================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 449 k
Is this ok [y/N]: y

我们也可以从http://cloud.github.com/downloads/keithw/mosh/mosh-1.2.3.tar.gz下载tar包。

并使用以下命令安装它,如下所示。

步骤1:从上述链接下载tar文件。

步骤2:使用tar -xvf mosh-1.2.3.tar.gz提取

步骤3:切换到解压缩的目录,然后运行以下命令进行配置和安装。

./configure

make

make install

如何使用MOSH进行连接?

我们可以像使用ssh一样使用mosh连接到远程计算机。
只需使用远程IP地址或者主机名键入mosh。

[root@theitroad2 ~]# mosh 192.168.0.103
The authenticity of host '192.168.0.103 (<no hostip for proxy command>)' can't be established.
RSA key fingerprint is c7:14:f4:85:5f:52:cb:f9:53:56:9d:b3:0c:1e:a3:1f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.103' (RSA) to the list of known hosts.
[email protected]'s password:
[root@theitroad1 ~]#

在上面的示例中,我使用mosh从theitroad2登录到计算机theitroad1.
我们可以看到,它的工作方式与ssh完全相同。

现在,登录theitroad1后,我可以看到一个名为mosh-server的进程,该进程在udp端口60001上运行,如下所示。

root@theitroad1 ~]# ps aux | grep mosh
root      2634  5.3  0.8  14960  4144 pts/0    S+   06:58   0:00 mosh-client 192.168.0.102 | 192.168.0.102 60001
root      2642  6.2  0.4  14876  2524 ?        S    06:58   0:00 mosh-server new -s -c 8 -l LANG=en_US.UTF-8
root      2675  0.0  0.1   3912   668 pts/3    R+   06:58   0:00 grep mosh
[root@theitroad1 ~]# lsof -i :60001
COMMAND    PID USER   FD   TYPE DEVICE SIZE NODE NAME
mosh-serv 2642 root    3u  IPv4   7330       UDP 192.168.0.102:60001

在上述情况下,mosh并不是一直在远程服务器上作为进程运行。
但是,每当使用mosh连接到远程计算机时,mosh所做的就是使用ssh连接到服务器,然后在远程服务器上运行mosh-server命令以打开该服务器上的高UDP端口(默认为60001),然后让客户端在该UDP端口上讲话。

注意:我们必须在两台机器上都安装mosh软件包,此软件才能正常工作。
Mosh服务器的默认端口范围是60001至61000

如前所述,在上面的示例中,我们看到客户端与theitroad1计算机建立了mosh连接,但最初是通过ssh连接,并在服务器上运行了mosh-server二进制文件,后来连接到mosh-server报告的UDP端口。

我们也可以如下所示启动mosh服务器。
但是我们手动启动的该mosh服务器将仅持续60秒,如果在该60秒的时间内没有建立连接,mosh服务器进程将被其自身杀死。

[root@theitroad1 ~]# mosh-server
MOSH CONNECT 60001 cCBMJe5UDo6UvINhpWhJow
mosh-server (mosh 1.2.3)
Copyright 2012 Keith Winstein <[email protected]>
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[mosh-server detached, pid = 2995]

如上所示,当我们如上所述手动启动mosh-server二进制文件时,它将向我们报告客户端必须用来连接到它的加密密钥以及端口号60001.
此过程仅存在60秒钟,并且将如果没有建立连接,则会被自己杀死。

[root@theitroad2 ~]# MOSH_KEY=cCBMJe5UDo6UvINhpWhJow mosh-client 192.168.0.102 60001
[root@theitroad1 ~]#

在上面的示例中,我使用了服务器提供给我的密钥进行连接。
但是它不切实际,因为mosh-server进程仅等待60秒。
这与mosh的作用相同,当我们使用mosh命令直接从客户端连接时,它将启动mosh服务器进程并通知客户端有关端口和密钥的信息,客户端将使用该端口和密钥进行通信。

假设mosh-server二进制文件位于默认位置以外的其他位置。
我们可以将该路径作为来自客户端的mosh命令的参数传递,如下所示。

mosh --server=/path/to/mosh-server-binary <hostname>

现在,正如我在mosh之前所讲的那样,最初是使用ssh进行连接的。
那么,如果服务器使用的是默认端口以外的其他ssh端口,该怎么办?
在这种情况下,我们可以将ssh端口指定为mosh命令。

$mosh --ssh="ssh -p 1000" <hostname>

测试表明,mosh将键击响应从550ms减少到170ms。
这是一个不错的成就。
Mosh使用OCB(偏移密码本模式)的AES-128(高级加密标准)。
OCB帮助删除两种身份验证方法(MAC用于身份验证和加密用于隐私)。

但是,Linux安全社区尚未完全准备好采用它。
我们希望mosh在将来会成为默认设置,因为它比ssh具有优势。