MoSH - 移动设备上的Shell

openkk 12年前
   <div id="news_body">     <p> <a href="/misc/goto?guid=4958340128822659213">Mobile Shell</a>,或简称为<em>MoSH</em>,在 <a href="/misc/goto?guid=4958340129627563240">GitHub 上发布</a>,是移动设备上 SSH 的替代品。阐释 MoSh 背后的原则的<a href="/misc/goto?guid=4958340130435114999">技术论文</a>将在下月召开的<a href="/misc/goto?guid=4958340131224345323">2012 USENIX 年度技术会议</a>上发布。</p>     <p> 下述两个重要特性是 MoSH 有别于其它类似产品的:</p>     <ul>      <li>第一,连接的 IP 地址不可知;而不是采用 TCP/IP 连接,数据通过 UDP/IP 发送。好处是,如果移动设备无信号或设备的 IP 地址改变(因为移动设备可以在 WiFi 网络和蜂窝网络间漫游),那么在传输层保持有状态连接就不那么可靠。</li>      <li>第二,MoSH 没有在客户端与服务器之间提供一个透明的加密字节流,让服务器通过重绘屏幕来响应的机制;MoSH 客户端提供了一个本地 echo 的变体。这意味着,当用户通过键盘输入了一个‘X’,MoSH 不会通过客户端将‘X’发送给服务器,再由服务器传输回客户端在屏幕上显示这种方式,而是立即在客户端屏幕上显示‘X’。</li>     </ul>     <p> 这两个改变显然与层次架构的连接流,如 SSH,区别明显;SSH 提供了只在两个端点之间的加密字节流,然后要远程服务器程序重绘屏幕。因为 SSH 完全不知道连接各个端点如何使用数据,任何击键都至少要在客户端与服务器间往返一次才能显示。</p>     <p> MoSH 在服务器创建一个进程,运行于用户空间,监听 UDP 包。然后将服务器地址(和 UDP 端口)告知 MoSH 客户端,并通过以数据包的形式发送数据来初始化连接。然而,因为连接本身在网络层是无状态的,如果客户端 IP 地址发生变化,则 UDP 包可以来自一个不同的 IP 地址(发送给同一服务器)而不会失去连接。</p>     <p> 采用 UDP,而非 TCP,同样意味着 MoSH 客户端/服务器需要各自管理状态。连接中的每一个数据包都有一个自增长的数字,同时客户端和服务器都建立一个已知数据包的列表,当需要的时候 MoSH 库会重新发送数据包。(这基本上就是 TCP 原理的精髓。)也因为如此 MoSH 客户端可以在不同的 IP 地址或(将来)在 IPv4 与 IPv6 之间切换。服务器端的 IP 地址必须保持不变。</p>     <p> 通过 MoSH 连接发送的数据包采用 <a href="/misc/goto?guid=4958340132018101765">AES-128 OCB 模式</a>加密。该加密算法提供了采用固定密钥的加密端点,密钥在服务器启动时生成,并在连接信息中显示:</p>     <blockquote>      <blockquote>      $ mosh-server MOSH CONNECT 60004 4NeCCgvZFe2RnPgrcU1PQw…     </blockquote>     </blockquote>     <p> 虽是新方法,但 AES-128 OCB 已经出现了一段时间,并且该算法作者指出他们正在<a href="/misc/goto?guid=4958340132821960807">邀请更进一步的审查</a>:</p>     <blockquote>      <p><strong>你们的安全数据报协议已经通过专家审核了吗?</strong></p>      <p>还没有。MoSH 开始被越来越多的使用,并且代码被有强烈安全意识的加密极客阅读过,他们认为 MoSH 的设计是合理的,但是任何新的数据报协议都要自我证明其安全性,SSP 也不例外。我们使用了 AES-128和 OCB 的参考实现,同时我们也欢迎人们来审阅代码。我们认为设计的简单性是个显著的优势,然而,当然别人也可能认为这是错误的。我们毫不怀疑需要花些时间(这是当然的!)才能让安全社区对 MoSH 的安全性感到满意。</p>     </blockquote>     <p> 另一个重大改变是在客户端与服务器进程间同步屏幕状态。绝大多数时候,当用户输入一个字符后(比如字符‘X’),希望看到X显示在屏幕上;并且当他们按下退格键,用户希望字符被立即删除。对于上/下/左/右键来说也类似,通常要移动一个字符。</p>     <p> 为了达到这个目标,MoSH 服务器存储了一个客户端的模拟屏幕(反之亦然),并基于在“正常”情况下按键是否会改变屏幕显示来<em>预测</em>。如果预测失效,MoSH 客户端将会等待与服务器间往返的时间以确认屏幕显示状态(本质上说是减少老的 SSH 机制),但如果 MoSH 确信击键会引发屏幕更新,那么 MoSH 将会直接在本地显示。在类 shell 环境中(大部分击键都要回显),这将会减少服务器端引起的感知延迟,另外也可减少网络发送的传输量,因为击键可以批量发送,而非像大多数交互式连接那样每次按键发送一个数据包。</p>     <p> 一个限制是输入只支持 UTF-8,因为多次按键可以转化为单一字符(反之亦然)。MoSH 不是要试图解决所有的编码和输入法的问题,而只专注于 UTF-8并保证其工作正常。更多细节可参考<a href="/misc/goto?guid=4958340133613045823">技术信息</a>页面。</p>     <p> MoSH 带来了一种在移动设备和服务器间连接的新方法。每个客户端连接使用一个单独的 UDP 端口(UDP 必须在两个端点间可达),然而通道是用私钥加密。因为连接可以转换到其它 IP 地址上,自然会引发对于连接可能被侵入的担忧,并且事实上“连接”在客户端断开后仍可保持对一些人来说也值得担心。</p>     <p> 然而,它的优势,特别是提高了响应时间的感知,可能激发人们关注这个系统。同时因为两边的进程都是用户进程,MoSH 可以很容易的安装在已有的环境中,而无需提升权限进行安装。</p>     <p> <strong>查看英文原文:</strong><a href="/misc/goto?guid=4958340134400897858">MoSH - The Mobile Shell</a></p>     <div id="come_from">     来自:      <a id="link_source2" href="/misc/goto?guid=4958340135222215801" target="_blank">InfoQ</a>     </div>    </div>