Saltar al contenido
infraestructura / · 4 min

Ver tus paneles internos sin abrir un solo puerto: tunel SSH y Tailscale

Monitoreo, consolas de administracion y editores de automatizacion accesibles desde tu maquina y desde el celular, sin publicarlos a internet. Con las dos trampas que hacen perder mas tiempo.

Administrador · Desarrollador Laravel
Ver tus paneles internos sin abrir un solo puerto: tunel SSH y Tailscale

Tienes un panel de monitoreo, una consola de administración de almacenamiento y un editor de automatizaciones corriendo en tu servidor. Ninguno debería estar en internet, y aun así quieres entrar — a veces desde el celular.

Dos herramientas resuelven esto sin abrir un solo puerto. Este tutorial cubre las dos y cuándo usar cada una.

Antes: publica en loopback

Nada de esto sirve si el servicio está expuesto. En tu compose:

ports:
  - "127.0.0.1:9001:9001"   # y no "9001:9001"

Sin el prefijo, Docker escribe reglas de iptables que se saltan tu firewall. Puedes tener firewalld perfecto y el puerto abierto igual. Compruébalo desde otra máquina, no desde el servidor:

nmap -Pn -p 9001 tu-servidor.com     # debe salir filtered o closed

Opción A: túnel SSH, para ratos cortos

Un túnel toma un puerto de tu máquina y lo conecta a un puerto del servidor, por dentro de la conexión SSH que ya tienes.

ssh -L 9001:127.0.0.1:9001 usuario@tu-servidor.com

Se lee de derecha a izquierda: conéctate al servidor y, una vez ahí, alcanza 127.0.0.1:9001 —loopback del servidor— y tráemelo a mi puerto 9001.

Deja esa ventana abierta: mientras viva, el túnel vive.

Y ahora el detalle que hace perder más tiempo de toda esta guía. En el navegador escribe:

http://127.0.0.1:9001

Con 127.0.0.1, no con localhost. Chrome y Edge en Windows resuelven localhost a ::1, que es IPv6, y el túnel de ssh escucha en IPv4. La página no carga, el error no menciona nada de IPv6, y parece que el túnel falló. No falló: le estás tocando la puerta equivocada.

Varios servicios a la vez, repitiendo la bandera:

ssh -L 9001:127.0.0.1:9001 -L 19999:127.0.0.1:19999 usuario@tu-servidor.com

Y si solo quieres el túnel, sin sesión interactiva:

ssh -N -L 9001:127.0.0.1:9001 usuario@tu-servidor.com

Se cierra con Ctrl+C, o cerrando la ventana.

Opción B: Tailscale, para el celular

El túnel es perfecto desde la computadora y muy incómodo desde el teléfono. Tailscale crea una red privada entre tus dispositivos: cada uno recibe una IP que solo existe dentro de esa red.

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Te da una URL para autenticarte. Instala la app en el teléfono con la misma cuenta y listo: el servidor aparece con una IP tipo 100.x.y.z, alcanzable desde el celular esté donde esté, sin abrir nada al mundo.

tailscale status    # ves tus nodos y sus IPs

La trampa de Tailscale con Docker

Aquí es donde casi todos tropiezan. Un servicio publicado como 127.0.0.1:9001 no se alcanza por la IP de Tailscale. Loopback es loopback: solo responde a peticiones que nacen dentro de la máquina, y una que llega por la interfaz de Tailscale viene de fuera.

Dos salidas. La primera, mapear el puerto también a esa IP:

ports:
  - "127.0.0.1:9001:9001"
  - "100.99.206.97:9001:9001"   # la IP Tailscale del servidor

La segunda, dejar que el servicio escuche en todas las interfaces y confiar en el firewall para bloquear las públicas. Para eso, mete la interfaz de Tailscale en la zona de confianza:

sudo firewall-cmd --permanent --zone=trusted --add-interface=tailscale0
sudo firewall-cmd --reload

Con eso, lo que llega por la red privada pasa y lo que llega de internet sigue bloqueado. Es lo que uso para el monitoreo, que quiere ver el host entero.

Cuál usar

Túnel SSH cuando es puntual, desde tu computadora, y no quieres instalar nada en el servidor. Cero configuración permanente.

Tailscale cuando quieres entrar desde el celular, o revisar algo sin abrir una terminal primero. Requiere un demonio corriendo y una cuenta.

Yo tengo las dos. La consola de almacenamiento la abro por túnel dos veces al mes; el monitoreo lo veo por Tailscale desde el teléfono cuando algo huele mal.

Comprueba que sigue cerrado

Después de configurar, la prueba que importa es desde fuera:

curl -sI --max-time 5 http://tu-servidor.com:9001 || echo "cerrado, como debe ser"

Si eso responde algo, sigues publicando el panel a internet.

#seguridad #despliegue
Comentarios 0

Nadie ha comentado todavía. Estrena la sección.

Deja tu comentario
Tu correo no se publica. Reviso los comentarios antes de publicarlos.

Seguir leyendo