Mosh necesita la conexión SSH inicial (TCP 22 por defecto) y un puerto UDP por sesión, que elige entre 60000 y 61000. Para no exponer el rango completo, fija un rango corto con mosh -p 60000:60010 y permite solo ese rango en ufw, iptables o el grupo de seguridad del proveedor.

Qué puertos usa Mosh: TCP para SSH y UDP 60000-61000 para la sesión

Mosh arranca mosh-server a través de una conexión SSH inicial y, a partir de ese momento, toda la sesión viaja por UDP. Eso implica dos aperturas distintas en el servidor: el puerto de SSH (TCP 22 por defecto en OpenSSH) y un puerto UDP dentro del rango 60000-61000.

El rango por defecto son 1001 puertos. Cada mosh-server escucha en un puerto propio, así que el rango solo tiene que cubrir las sesiones simultáneas que esperas en esa máquina. En un VPS que administras tú solo, eso son unas pocas sesiones, no mil.

Si la conexión SSH funciona pero los paquetes UDP no llegan, el cliente se queda esperando: la autenticación ha ido bien y la terminal no responde. Es el síntoma típico de un firewall que deja pasar el puerto 22 y bloquea el rango UDP.

Fijar el puerto UDP de Mosh con mosh -p: un puerto o un rango corto

La opción -p (o --port) del cliente indica a mosh-server qué puerto UDP usar, o en qué rango buscar uno libre, con la forma PUERTO o PUERTO:PUERTO2. Sin ella, Mosh elige un puerto entre 60000 y 61000.

# Un puerto UDP concreto
mosh -p 60001 usuario@servidor

# Un rango corto: mosh-server toma el primero libre
mosh -p 60000:60010 usuario@servidor

# SSH en un puerto distinto del 22
mosh --ssh="ssh -p 2222" -p 60000:60010 usuario@servidor

Un puerto fijo es lo más restrictivo, pero solo admite una sesión a la vez: una segunda conexión con el mismo -p no podrá enlazarlo mientras la primera siga viva. Un rango de once puertos deja margen para varias sesiones y algún mosh-server huérfano sin abrir el bloque entero. La sintaxis completa de cliente y servidor está en la documentación oficial de Mosh.

Reglas ufw para Mosh: por qué 60000:61010/udp abre más de lo necesario

sudo ufw allow 60000:61010/udp es una regla que se copia a menudo entre tutoriales, y abre diez puertos más allá del rango por defecto de Mosh, que termina en 61000. Si además fijas el rango con mosh -p, lo coherente es abrir exactamente ese rango y nada más.

# SSH primero, para no perder el acceso al activar ufw
sudo ufw allow 22/tcp

# Solo el rango que usará mosh -p
sudo ufw allow 60000:60010/udp

# Retirar la regla amplia si ya estaba
sudo ufw delete allow 60000:61010/udp

sudo ufw enable
sudo ufw status numbered

ufw exige indicar el protocolo cuando se abre un rango de puertos, por eso la regla lleva /udp. Antes de ejecutar ufw enable en un servidor remoto, comprueba que la regla de SSH está en la lista: sin ella pierdes también la conexión inicial que Mosh necesita para lanzar mosh-server.

Mosh en grupos de seguridad de la nube y con iptables

Un grupo de seguridad de la nube filtra antes de que el paquete llegue a la máquina, y ufw o iptables filtran dentro de ella: Mosh necesita el rango UDP abierto en las dos capas. Abrirlo en una sola produce el mismo síntoma de sesión que autentica y luego no responde.

# iptables, dentro del servidor
sudo iptables -A INPUT -p udp --dport 60000:60010 -j ACCEPT

# Grupo de seguridad en AWS, con la CLI
aws ec2 authorize-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --protocol udp --port 60000-60010 \
  --cidr 0.0.0.0/0

El origen 0.0.0.0/0 es deliberado: un móvil que pasa de wifi a datos cambia de dirección IP, y Mosh mantiene la sesión desde la nueva dirección. Limitar el origen a la IP de casa u oficina rompe justo ese cambio de red. Si necesitas que el servidor no acepte tráfico de Internet, la alternativa es una red privada, no una lista de IPs.

Mosh frente a SSH y redes en malla: qué expone cada opción

Mosh no hace reenvío de puertos ni reenvío X11, así que no sustituye a SSH en túneles con -L o -R. La tabla resume qué abre cada opción en el servidor y cómo se comporta desde el móvil.

Forma de accesoPuertos entrantes en el servidorCambio de wifi a datosReenvío de puertos
Solo SSHTCP 22La conexión se corta; tmux conserva lo que corríaSí, con -L y -R
Mosh, rango por defectoTCP 22 y UDP 60000-61000La sesión continúaNo
Mosh con -p 60000:60010TCP 22 y UDP 60000-60010La sesión continúaNo
Red privada en mallaNinguno abierto a InternetMosh funciona igual dentro de la redEl de SSH, si lo usas

Con una red privada en malla sin puertos como Prialo, o con Tailscale, se llega a equipos sin IP pública ni puertos abiertos a Internet; Mosh y SSH usan sus mismos puertos, pero solo dentro de esa red.

4 errores al abrir los puertos UDP de Mosh

  1. Copiar 60000:61010 sin revisarlo. El rango por defecto de Mosh acaba en 61000; si fijas otro con -p, abre exactamente ese.
  2. Abrir una sola capa. Regla en ufw pero no en el grupo de seguridad, o al revés: SSH entra y UDP no.
  3. Filtrar por IP de origen. El móvil cambia de IP al pasar de wifi a datos y la regla corta la sesión que Mosh intentaba conservar.
  4. Quedarse sin puertos libres. Los mosh-server de sesiones abandonadas siguen ocupando puertos del rango. Localízalos con ss -ulpn | grep mosh-server y ciérralos con kill y su PID.

Mosh desde iOS y Android con termi1

termi1 mantiene la sesión con Mosh al pasar de wifi a datos y usa tmux para que lo que dejas corriendo siga ahí al volver; en el servidor solo hay que preparar las reglas anteriores. El teclado propio de termi1 trae Esc, Ctrl, Tab y flechas, útiles para editar reglas largas o salir de ufw status paginado sin pelear con el teclado del sistema.

La IA de termi1 convierte una frase como «abre los puertos UDP de Mosh del 60000 al 60010 en ufw» en el comando y lo escribe en el prompt sin pulsar Intro, para que revises el rango antes de ejecutarlo. En conexiones etiquetadas como producción, Production Guard retiene lo que cambia algo, como una regla de firewall, antes de que llegue al prompt. La IA no abre la sesión ni recibe claves, y la clave privada no sale del móvil. Más detalles en la terminal SSH y Mosh móvil.

Si el servidor es un Mac, termi1 Companion (macOS 14 o posterior) comprueba que el inicio de sesión remoto, mosh-server y tmux están disponibles antes de conectar.

Preguntas frecuentes

¿Qué puertos necesita Mosh en el firewall?

Mosh necesita el puerto TCP de SSH, el 22 por defecto, para la conexión inicial, y un puerto UDP por sesión en el rango 60000-61000. Si fijas un rango con mosh -p, basta con abrir ese rango UDP en el firewall y en el grupo de seguridad.

¿Cómo se indica a Mosh qué puerto UDP usar?

El puerto UDP de Mosh se indica con la opción -p o --port del cliente, por ejemplo mosh -p 60001 usuario@servidor para un puerto fijo o mosh -p 60000:60010 para un rango. mosh-server toma el primer puerto libre dentro del rango indicado.

¿Por qué Mosh autentica por SSH y luego no responde?

Mosh autentica por SSH sobre TCP y después cambia a UDP; si la terminal se queda congelada tras autenticar, el firewall o el grupo de seguridad está bloqueando el rango UDP. Comprueba ambas capas y que el rango abierto coincide con el usado en mosh -p.

¿Mosh permite reenvío de puertos como SSH?

Mosh no hace reenvío de puertos ni reenvío X11. Para túneles con -L o -R hay que abrir una conexión SSH aparte, o usar una red privada en malla como Prialo o Tailscale para llegar directamente al servicio interno sin abrir puertos.