mosh基于udp的ssh 安装和使用

Mosh

0x01 介绍mosh

Mosh表示移动Shell(Mobile Shell),是一个用于从客户端跨互联网连接远程服务器的命令行工具。它能用于SSH连接,但是比Secure Shell功能更多。它是一个类似于SSH而带有更多功能的应用。程序最初由Keith Winstein 编写,用于类Unix的操作系统中,发布于GNU GPL V3协议下。

Mosh最大的特点是基于UDP方式传输,支持在服务端创建一个临时的Key供客户端一次性连接,退出后失效;也支持通过SSH的配置进行认证,但数据传输本身还是自身的UDP方式。

另外,Mosh还有两个我觉得非常有用的功能

  • 会话的中断不会导致当前正在前端执行的命令中断,相当于你所有的操作都是在screen命令中一样在后台执行。
  • 会话在中断过后,不会立刻退出,而是启用一个计时器,当网络恢复后会自动重新连接,同时会延续之前的会话,不会重新开启一个。

Mosh的功能

  • 它是一个支持漫游的远程终端程序
  • 在所有主流的类 Unix 版本中可用,如 Linux、FreeBSD、Solaris、Mac OS X和Android
  • 支持不稳定连接
  • 支持智能的本地回显
  • 支持用户输入的行编辑
  • 响应式设计及在 wifi、3G、长距离连接下的鲁棒性
  • 在IP改变后保持连接。它使用UDP代替TCP(在SSH中使用),当连接被重置或者获得新的IP后TCP会超时,但是UDP仍然保持连接
  • 在很长的时候之后恢复会话时仍然保持连接
  • 没有网络延迟。立即显示用户输入和删除而没有延迟
  • 像SSH那样支持一些旧的方式登录
  • 包丢失处理机制

0x02 安装mosh

  • centos7 上安装

    yum install mosh

  • deepin debian ubuntu 上安装

    apt-get install mosh

  • 源码安装

$ git clone https://github.com/mobile-shell/mosh
$ cd mosh
$ ./autogen.sh
$ ./configure
$ make
# make install

0x03 防火墙设置

要在服务器的防火墙上面设置开启 60000 到 61000 upd 端口。mosh 不安全的一点就在于这里它服务端的端口是固定的这个范围。默认是从 60000 开始然后 +1 的增加。比如第一个连接是 60001,这个连接没断后面就会是 60002 端口连接,以此类推。

现在开始设置服务端防火墙

如果是 iptables

sudo iptables -I INPUT 1 -p udp --dport 60000:61000 -j ACCEPT

如果是 ufw

sudo ufw allow 60000:61000/udp

我的是 firewalld

# 先确定活动区域
[root@ivoivo ~]# firewall-cmd --get-active-zones
public
  interfaces: eth0

# 编辑防火墙规则
[root@ivoivo ~]# firewall-cmd --permanent --zone=public --add-port=60000-61000/udp

# 让防火墙生效
[root@ivoivo ~]# firewall-cmd --reload

0x04 使用MOSH

采用临时key一次性认证

  • 采用临时Key的方式进行一次性认证

先需要在服务端创建Key,然后客户端通过这个Key进行登录,该Key会在会话结束十分钟后自动失效。

创建一个临时的Key和端口供Client登录

$ mosh-server

MOSH CONNECT 60001 S7KI+lnT56j4efWRhMc23g

mosh-server (mosh 1.3.2) [build mosh 1.3.2]
Copyright 2012 Keith Winstein <mosh-devel@mit.edu>
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 = 141741]

定义好MOSH_KEY的值

$ export MOSH_KEY=S7KI+lnT56j4efWRhMc23g

使用临时Key进行登陆

$ mosh-client 10.1.1.1 60001
$ exit
logout
[mosh is exiting.]

注:mosh-client后面只能跟服务器具体的IP地址和临时端口,不支持主机名或域名方式

假设服务器地址为 10.1.1.1

ssh 私钥存放在 /root/.ssh/id_rsa

  • 没有更改ssh 22 端口的用法
mosh root@10.1.1.1
  • 没有更改ssh 22 端口,但是想用服务端某个特定的端口
    这种情况是在防火墙上面只开启了 60000-61000 中间的 1 个或几个端口比如只开启了 60010 这一个端口,那么用的时候在客户端上后面要加 -p 的参数
mosh -p 60010 root@10.1.1.1
  • 如果改动过ssh端口 22 改为 2500
mosh --ssh="ssh -p 2500" root@10.1.1.1
  • 如果改动过ssh端口 22 改为2500还要用服务端 60010 udp 端口
mosh -p 60010 --ssh="ssh -p 2500" root@10.1.1.1
  • 不用密码使用的秘钥登录
mosh --ssh="/usr/bin/ssh -i /root/.ssh/id_rsa" root@10.1.1.1
  • 不用密码使用的秘钥登录,改 22 为 2500
mosh --ssh="/usr/bin/ssh -i /root/.ssh/id_rsa -p 2500" root@10.1.1.1
  • 不用密码使用的秘钥登录,改 22 为 9999,且使用服务端 60010 udp 端口
mosh -p 60010 --ssh="/usr/bin/ssh -i /root/.ssh/id_rsa -p 2500" root@10.1.1.1

utf-8编码问题,解决方案

In my case, put these lines in ~/.bashrc
(both on server and local machine)

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

Edit: recently, when I try on another machine, I have to put those line in ~/.profile. So, you should try with ~/.bashrc and ~/.profile

引用

https://mosh.org/

https://www.hi-linux.com/posts/23118.html

posted @ 2020-02-17 20:41  lvusyy  阅读(1308)  评论(0编辑  收藏  举报