MOSH, mas allá del SSH

A día de hoy, no creo que sea necesario mencionar qué es el protocolo SSH (Secure Socket Shell) ya que sería realmente complicado vivir actualmente sin él. Por ello, se considera SSH a nivel global como la “mega” herramienta indispensable para cualquier labor de administración. Entre las ventajas de su uso podemos encontrar: acceso seguro a máquinas remotas, acceso a servicios en otras máquinas mediante la creación de túneles directos o reversos, creación de proxy socks, creación de canales seguros para la encapsulación de trafico de aplicaciones no seguras… etc.

Entre las inumerables ventajas de este protocolo, existe un punto que en ocasiones puede ser un gran inconveniente, el rendimiento de la conexión.

Para intentar dar solución a éste problema y añadir mejoras, surgió Mosh (mobile shell), aplicación que aporta diversas ventajas sobre la conexión SSH tradicional. Fue presentada en el USENIX Annual Technical Conference 2012 por Keith Winstein & Hari Balakrishnan, M.I.T. Computer Science and Artificial Intelligence Laboratory.

Como principales características de la herramienta, tenemos las siguientes:

  • Funcionamiento bajo el protocolo UDP, lo cual incrementa notablemente la velocidad de respuesta.
  • Permite itinerancia entre redes aunque haya cambios de direccion IP entre la conexión.
  • Soporta conectividad intermitente y recuperación automática de sesión.
  • Interaccion de escritura totalmente ágil con el servidor debido a que no espera respuesta de cada pulsación de teclado, evitando lag de escritura y posibililitando la edición y corrección de órdenes.
  • Cliente y el servidor bajo privilegios no administrativos.
  • Diseñado desde cero y con soporte únicamente sobre UTF-8.

Para establecer la conexión, Mosh no levanta ningun servicio, sino que se apoya sobre SSH para inicializarla por lo que las credenciales y el tipo de autenticación (password, clave pública o certificados) serán los mismos que mediante SSH. Una vez satisfecha la autenticación, la conexión pasa a ser UDP e intercambia toda la comunicación sobre datagramas UDP cifrados haciendo la conexión más resiliente.

Existen paquetes compilados para las principales distribuciones de Linux, por lo que bastará utilizar el gestor de paquetes adecuado en función de la distribución. En debian y derivados bastará con un simple apt-get install mosh.

Para la correcta configuración, únicamente se deberá realizar un cambio en el firewall para permitir conexiones entrantes UDP entre los puertos 60000-61000 en la máquina donde se encuentre Mosh.

La configuración básica para un sistema con Iptables en la misma máquina que Mosh es la siguiente:

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

La sintaxis de uso es similar a SSH, por lo que el cambio no supone ningún esfuerzo.

ssh user@example.com  ? mosh user@example.com

En caso de necesitar pasar argumentos específicos de SSH se hará de la siguiente forma:

mosh --ssh="ssh -p 2470" user@example.com

Una vez realizada la conexión veremos un proceso de Mosh en el sistema

para comprobarlo, veremos que efectivamente se está generando trafico UDP

Y además dicho tráfico no es legible.

En caso que se produzca una interrupción de la conexión aparecerá una barra notificándonos la desconexión. En este caso forzaremos la interrupción desconectando la interfaz de red.

Una vez recuperemos la conexión, la terminal se mantendrá intacta.

Mosh es software libre y se encuentra disponible bajo las siguientes plataformas GNU/Linux, BSD, macOS, Solaris, Android, Chrome, and iOS. Por último, se recomienda usar Mosh en conjunto con screen o tmux debido a que no guarda scroll en pantalla puesto que solo sincroniza los cambios en la pantalla.

Os dejo unos enlaces para ampliar información así como el vídeo de presentación de la herramienta.

Para más información acceder a la página oficial del proyecto https://mosh.org/

Presentración del ACT 2012 https://www.usenix.org/conference/atc12/technical-sessions/presentation/winstein