MOSH как альтернатива openSSH

В этой статье рассмотрим альтернативу openSSH называемый mosh. Посмотрим как он работает и попробуем установить.

О MOSH

В принципе это тот же openssh, но данные передаются по UDP/60000-61000, что позволяет ssh сессии быть менее восприимчивым к потерям пакетов, а значит меньше лагает, имеет собственный heartbeat, таким образом он сам распознает когда падает сессия или туннель и восстанавливает подключение. Но это не значит что надо удалять openssh поскольку все же он его использует и все конфиги считываются с конфигов openssh.

Основным отличием является наличие функции роуминга т.е. если вы сидели подключенным к Wi-Fi сети, затем отключились от него и устройство автоматически переключилось на 4G, то связь не прервется и сессия не разорвется т.е. даже при смене IP-адреса пользователь остается подключенным к серверу.
Плюсов конечно много, но и минусов хватает. На сайте разработчка написано, что он совместим с openssh, но это немного лукаво. При попытке поднять reverse tunnel оказалось, что он не понимает параметр -R. Также при попытке поднять туннель используя autossh выяснилось, что и некоторые другие ключи тоже не понимает. Еще было выявлено, что на Amazon Linux как и на macOS не запускаются версии установленные с EPEL и BREW, но работает если собрать с исходных кодов. Еще один из минусов это то, что не нашел клиента под Windows, кроме расширения для браузера Chrome, но к сожалению я его не юзаю. Приступим к практике.

Установка

Будем считать, что openssh уже установлен. Ставим mosh:

yum install mosh

Да, совсем не интересно, так что давайте рассмотрим как собрать с исходников:

git clone https://github.com/mobile-shell/mosh
cd mosh
yum groupinstall 'Development Tools'
yum install protobuf-devel protobuf-compiler ncurses-devel openssl-devel
./autogen.sh
./configure
make
make install
ln -s /usr/local/bin/mosh /usr/bin/

Устанавливать необходимо как на клиенте так и на сервере. На сервере еще надо настроить фаервол (на примере iptables):

#MOSH
iptables -A INPUT -p udp -m multiport --dports 60000:61000 -j ACCEPT
iptables -A OUTPUT -p udp -m multiport --sports 60000:61000 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dports 60000:61000 -j ACCEPT
iptables -A OUTPUT -p udp -m multiport --sports 60000:61000 -j ACCEPT

Далее просто вместо привычного ssh набираем mosh:

mosh username@server.name

P.S.

Забыл написать что в mosh также не работает скроллинг (page up/page down тоже) так что надо пользоваться less или more.

UPDATE

Разрешаем работу mosh на firewalld. Создаем файл /etc/firewalld/services/mosh.xml:

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>MOSH</short>
  <description>Mosh (mosh.mit.edu) is a free replacement for SSH that allows roaming and supports intermittent connectivity.</description>
  <port protocol="udp" port="60001-60100"/>
</service>

Выполняем:

firewall-cmd --add-service=mosh --permanent
firewall-cmd --reload