MOSH-ssh的更好替代
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具有优势。