ngrok, o cómo resolver problemas a distancia

Llevaba unos cuantos días intentando resolver un problema de configuración de Apache a otra persona, por email. Me enviaba detalles del problema, pantallazos en algún caso y yo le respondía con posibles soluciones, comandos que debería ejecutar y ficheros de configuración que debería editar. Se trataba de una máquina local, detrás de un NAT. Tras muchas idas y venidas, no conseguíamos resolver y pensando en cómo solucionarlo, me encontré con una herramienta que me ha permitido hacerlo en 2 minutos, ngrok 🙂 Permite exponer puertos tras el NAT de forma muy sencilla, de tal forma que si expone por ejemplo el puerto 22, yo pueda conectarme de forma remota a administrar su máquina. Lógicamente debe haber confianza entre ambas partes, para evitar sustos de seguridad.

Para ello, la persona con el problema de configuración ha tenido que realizar los siguientes pasos:
Instalar openssh (si no lo tiene ya instalado):
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install openssh-server

Poner en marcha openssh:

$ sudo service ssh start

Instalar ngrok (la aplicación que expone puertos tras el NAT)

Tras instalar, debe darse de alta: https://ngrok.com/signup
Una vez realizado ese paso,  ngrok le devolverá el comando a ejecutar para identificarse en ngrok. Algo como:
./ngrok authtoken XXXXXXX

Abrir el puerto 22 (ssh) al exterior: (magia!)

$ ./ngrok tcp 22
(Este comando te dará como resultado una dirección ngrok, que es la que tiene que enviar a la persona que le ayuda. Algo como:  tcp://0.tcp.ngrok.io:13011 )
La persona que le ayuda, en este caso yo 🙂  podrá conectarse así:
$ ssh -l usuario 0.tcp.ngrok.io -p13011

Lógicamente, la persona con el problema antes debe haberle enviado al ayudante un nombre de usuario y contraseña para conectar por ssh.

Una vez conectado, el ayudante puede abrir otras sesiones para tunelizar más puertos. Por ejemplo:

$ ssh -l usuario 0.tcp.ngrok.io -p13011 -L 8080:localhost:80

Ese comando permite tunelizar el puerto 80 de la máquina remota para dejarlo accesible a través del puerto 8080 de la máquina local. Es decir, si el ayudante en su navegador teclea ahora: http://localhost:8080 en realidad se estará conectando a través del túnel ssh al puerto 80 de la máquina remota (tras el NAT). Muy, muy interesante para permitir la administración remota de equipos. Lo dicho, en dos minutos he podido resolver así un problema que se estaba estirando ya unos cuantos días por la incomodidad de analizar el problema vía email…

6 comentarios en «ngrok, o cómo resolver problemas a distancia»

  1. ¿Y por qué no usar simplemente la opción -R de ssh? El que necesita ayuda ejecuta el túnel inverso hacia un ordenador que tú controles, y después solo tienes que utilizar ese túnel para entrar en su máquina.

    1. También valdría, sí.

      Con ngrok te ahorras la gestión de crear, configurar (para evitar que haga cosas que no debe) y darle una cuenta a la persona que necesita ayuda (y borrarla después de tu servidor, al acabar de ayudarle). También te ahorras explicarle qué son las claves ssh (en mis servidores no permito autenticación por password) y añadir el id_rsa.pub a authorized_keys. Bueno, bien pensado, son bastante cosas que me ahorro con ngrok 🙂

  2. Bueno saberlo (me lo guardo) Si me permites una petición

    ¿Existe algún plugin para algún explorador de archivos que permita compartir via NFS un directorio o un buen «how to» para hacerlo desde consola?

    Lo tengo hecho con thunar y su plugin via samba, pero me da rabia no saber hacerlo con NFS, al no encontrar ningún «how to» que funcione en mi Manjaro con systemd, y mucho menos un plugin.

    Y si tampoco lo encuentras, y sabes hacerlo, ¿Serías tan amable de publicar como?

    Gracias por anticipado

    1. Hola Miguel:

      No me suena ninguno, pero me parece un tema interesante para tratar en un post. Lo meto en la lista de ideas 🙂 Gracias!

  3. Como vuelvo a iniciar una secion ( en mi caso tcp ) cuando ya la e cerrado anteriormente . Es que cuando pongo otra ver el mismo LPORT (ej » ngrok tcp 4546 ) me habre un servidor pero ya no es el mismo de antes.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.