Vamos a instalar AutoSSH de forma profesional y estable en Ubuntu, en este post vamos a realizar:
- Instalar desde repositorios oficiales.
- Crear un usuario dedicado para el túnel (seguridad).
- Usar llaves SSH sin password.
- Ejecutarlo como servicio systemd para reinicio automático.
- Configurar restart y monitoreo.
Te explico el procedimiento usado normalmente en producción.
Instalar AutoSSH
Primero actualiza los repositorios.
sudo apt update
Realizamos la instalación:
sudo apt install autossh -y
Verifica la instalación:
autossh -V
Respuesta: autossh 1.4g
Crear un usuario dedicado (recomendado)
En entornos profesionales no se ejecuta con root, creamos un usuario dedicado exclusivamente a un túnel SSH, puedes crear un usuario de sistema sin directorio home y sin shell interactiva.
sudo useradd \
--system \
--no-create-home \
--shell /usr/sbin/nologin \
ssh-tunnel
Esto crea el usuario ssh-tunnel con:
--system: usuario de sistema.--no-create-home: no crea/home/ssh-tunnel.--shell /usr/sbin/nologin: no permite login interactivo.ssh-tunnel: nombre del usuario.
Puedes verificarlo:
getent passwd ssh-tunnel
Resultado esperado similar a: ssh-tunnel:x:998:998::/home/ssh-tunnel:/usr/sbin/nologin
su - tunnel
Crear las llaves SSH
Nota: si esta trabajando con una instancia AWS EC2, Maquina de GCP o Azure, no es necesario realizar estos pasos.
Generar la nueva llave SSH
Ejemplo: crear una key llamada autossh_tunnel
ssh-keygen -t ed25519 -f ~/.ssh/autossh_tunnel -C "autossh tunnel key"
Explicación técnica:
| Parámetro | Función |
|---|---|
-t ed25519 |
algoritmo moderno y seguro |
-f |
nombre del archivo |
-C |
comentario para identificar la llave |
Durante el proceso verás:
Enter passphrase (empty for no passphrase):
Nota: Para túneles automáticos con AutoSSH, normalmente se deja vacío.
Archivos generados
Se crearán dos archivos:
~/.ssh/autossh_tunnel
~/.ssh/autossh_tunnel.pub
| Archivo | Uso |
|---|---|
| autossh_tunnel | llave privada |
| autossh_tunnel.pub | llave pública |
Permisos correctos
Aunque normalmente ya se asignan bien, puedes asegurar:
chmod 600 ~/.ssh/autossh_tunnel
chmod 644 ~/.ssh/autossh_tunnel.pub
Copiar la llave al servidor remoto
ssh-copy-id -i ~/.ssh/autossh_tunnel.pub usuario@servidor
Ejemplo:
ssh-copy-id -i ~/.ssh/autossh_tunnel.pub ubuntu@3.230.182.38
Crear el comando del túnel
Ejemplo de túnel inverso (muy común para exponer un servidor local).
Servidor local: localhost:3000
Servidor remoto: puerto 26000
Comando:
autossh -M 0 -N \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-i /code/n8n-docker/sitios.pem \
-R 26000:localhost:5678 \
ubuntu@codigoelectronica.com
Significado:
-R puerto_remoto:host_local:puerto_local
Ejemplo real:
-R 26000:localhost:5678
| Elemento | Significado |
|---|---|
| 26000 | puerto en el servidor |
| localhost | máquina local |
| 5678 | puerto local |
autossh -M 0 -N -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -R 25000:localhost:3000 usuario@servidor-remoto
Explicación:
| Parámetro | Función |
|---|---|
-M 0 |
desactiva puerto monitor |
-N |
no ejecuta comandos remotos |
-R |
túnel inverso |
ServerAliveInterval |
keepalive |
ServerAliveCountMax |
reconexión automática |
Crear un servicio systemd (forma profesional)
Crear servicio:
sudo nano /etc/systemd/system/autossh-tunnel.service
Contenido:
[Unit]
Description=AutoSSH Reverse Tunnel
After=network.target
[Service]
User=tunnel
Environment="AUTOSSH_GATETIME=0"
ExecStart=autossh -M 0 -N \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-R 26000:localhost:3000 \
usuario@servidor-remoto
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Activar el servicio
Recargar systemd:
sudo systemctl daemon-reload
Habilitar en arranque:
sudo systemctl enable autossh-tunnel
Created symlink '/etc/systemd/system/multi-user.target.wants/autossh-tunnel.service' → '/etc/systemd/system/autossh-tunnel.service'.
Iniciar:
sudo systemctl start autossh-tunnel
Ver estado:
sudo systemctl status autossh-tunnel
Logs:
journalctl -u autossh-tunnel -f
jul 20 20:46:13 ce-web systemd[1]: autossh-tunnel.service: Main process exited, code=exited, status=217/USER
jul 20 20:46:13 ce-web systemd[1]: autossh-tunnel.service: Failed with result 'exit-code'.
jul 20 20:46:23 ce-web systemd[1]: autossh-tunnel.service: Scheduled restart job, restart counter is at 11.
jul 20 20:46:23 ce-web systemd[1]: Started autossh-tunnel.service - AutoSSH Reverse Tunnel.
jul 20 20:46:23 ce-web autossh[9179]: port set to 0, monitoring disabled
jul 20 20:46:23 ce-web autossh[9179]: starting ssh (count 1)
jul 20 20:46:23 ce-web autossh[9179]: ssh child pid is 9182
jul 20 20:46:23 ce-web autossh[9182]: ** WARNING: connection is not using a post-quantum key exchange algorithm.
jul 20 20:46:23 ce-web autossh[9182]: ** This session may be vulnerable to "store now, decrypt later" attacks.
jul 20 20:46:23 ce-web autossh[9182]: ** The server may need to be upgraded. See https://openssh.com/pq.html
Verificar que el túnel funciona
En el servidor remoto:
ss -tulpn | grep 25000
o
netstat -tulpn | grep 25000
Luego probar:
http://IP_SERVIDOR:25000
Recomendaciones profesionales
Limitar acceso SSH
En el servidor remoto: sshd_config
sudo nano /etc/ssh/sshd_config
Agregar:
GatewayPorts yes
y reiniciar ssh.
Firewall
Abrir el puerto:
sudo ufw allow 25000/tcp
Usar llaves dedicadas
Puedes crear una llave específica:
~/.ssh/id_autossh
Arquitectura típica (tu caso con EC2)
Usuario Internet
│
│
Nginx EC2
│
│ localhost:25000
│
AutoSSH Tunnel
│
│ SSH
│
Servidor local
localhost:3000
NextJS