Universo Ssh III. Guía Completa de Túneles SSH y Port Forwarding: Acceso Seguro a Servicios Internos

Índice

Después de la primera entrega, llego la segunda entrega. Como dicen que no hay dos sin tres pues vamos con la tercera entrega. Esta vez toca hablar de los túneles, popularmente conocidos como “ la vpn del pobre “. Algo que te pude sacar de muchos apuros.

El port forwarding con SSH es una técnica esencial para administradores de sistemas y desarrolladores que necesitan acceder de forma segura a servicios internos, publicar aplicaciones o navegar por redes públicas sin riesgos. Sus funcionalidades son inmensas, se pueden aplicar en las mas variopintas situaciones. Ahora veremos varias de ellas con supuestos meramente prácticos. Un problema, una solución. Vamos a partir del siguiente esquema de red para poder explicar los casos de uso:

+----------+     +----------+     +----------+     +----------+     +----------+
| externo2 | --- | externo1 | --- | firewall | --- | interno1 | --- | interno2 |
+----------+     +----------+     +----------+     +----------+     +----------+

🔑 ¿Qué es el Port Forwarding con SSH?

El port forwarding permite redirigir tráfico TCP a través de un túnel seguro SSH, cifrando la conexión y habilitando accesos controlados a servicios internos.

Beneficios:

  • Cifrado de conexiones inseguras.
  • Acceso a servicios internos detrás de firewalls o NAT, ZeroConfig en el destino.
  • Publicación de servicios internos de manera segura.

ℹ️ Nota: Configura correctamente en tu servidor ssh, revisa tu sshd_config y revisa AllowTcpForwarding para mantener la seguridad.


🧭 Tipos de Túneles SSH

1. Local Port Forwarding (-L)

Redirige un puerto local a un destino remoto.

ssh -L 8080:servidor_interno:80 usuario@puente

2. Remote Port Forwarding (-R)

Redirige un puerto remoto hacia tu máquina local o un destino accesible desde esta.

ssh -R 9090:localhost:22 usuario@servidor

3. Dynamic Port Forwarding (-D)

Crea un proxy SOCKS dinámico para redirigir múltiples conexiones TCP.

ssh -D 1080 usuario@servidor

🌐 8 Escenarios de Túneles TCP/IP

A continuación se detallan los 8 escenarios clásicos de port forwarding con diagramas ASCII y comandos prácticos.

Escenario 1: externo1 → interno1

ssh -L 7900:localhost:5900 usuario@interno1
[externo1] --(SSH)--> [interno1:5900]
   ^
   | localhost:7900

Escenario 2: externo2 → interno1 (via externo1)

ssh -L 7900:localhost:7900 usuario@externo1
[externo2] --(L:7900)--> [externo1:7900] --(SSH)--> [interno1:5900]

Escenario 3: interno1 → externo1 (Remote Forwarding)

ssh -R 9000:localhost:80 usuario@externo1
[interno1:80] --(R:9000)--> [externo1:9000]

Escenario 4: interno2 → externo1 (via interno1)

[interno2] --> [interno1] --(R)--> [externo1]

Escenario 5: externo2 → interno2 (via externo1, interno1)

ssh -L 8000:interno2:80 usuario@externo1
[externo2] --> [externo1] --(SSH)--> [interno1] --> [interno2:80]

Escenario 6: interno2 → externo2 (via interno1, externo1)

ssh -R 8022:externo2:22 usuario@interno1
[interno2] --> [interno1] --(R:8022)--> [externo1] --> [externo2:22]

Escenario 7: Forwarding local encadenado (interno2 → externo2)

ssh -L 7000:externo2:22 usuario@interno1
ssh -L 7000:localhost:7000 usuario@interno2
[interno2] --(L:7000)--> [interno1] --(L:7000)--> [externo1] --(L:22)--> [externo2]

Escenario 8: Forwarding remoto encadenado (externo2 → interno2)

ssh -R 8500:interno2:80 usuario@externo1
ssh -R 8500:localhost:8500 usuario@externo2
[externo2] --(R:8500)--> [externo1] --(R:8500)--> [interno1] --(R:80)--> [interno2]

📊 Resumen de Escenarios y Comandos

Escenario Descripción Comando Principal
1 externo1 → interno1 ssh -L 7900:localhost:5900 usuario@interno1
2 externo2 → interno1 (via externo1) ssh -L 7900:localhost:7900 usuario@externo1
3 interno1 → externo1 (remote) ssh -R 9000:localhost:80 usuario@externo1
4 interno2 → externo1 (via interno1) Encadenado con -R en interno1
5 externo2 → interno2 (via externo1, interno1) ssh -L 8000:interno2:80 usuario@externo1
6 interno2 → externo2 (via interno1, externo1) ssh -R 8022:externo2:22 usuario@interno1
7 interno2 → externo2 (local encadenado) ssh -L 7000:externo2:22 usuario@interno1 + ssh -L 7000:localhost:7000 usuario@interno2
8 externo2 → interno2 (remote encadenado) ssh -R 8500:interno2:80 usuario@externo1 + ssh -R 8500:localhost:8500 usuario@externo2

💡 Casos de Uso Reales

1. Acceso a una base de datos interna

ssh -L 3306:localhost:3306 usuario@servidor_interno
[cliente_mysql_local] --(L:3306)--> [servidor_interno:3306]

2. Navegación segura desde una red pública

ssh -D 1080 usuario@servidor_remoto
[navegador_web] --(SOCKS5:1080)--> [ssh_túnel] --> [servidor_remoto] --> [Internet]

3. Publicar un servidor web local

ssh -R 8080:localhost:3000 usuario@servidor_publico
[navegador_colega] --> [servidor_publico:8080] --(R:8080)--> [tu_PC:3000]

4. Acceso remoto seguro a servicios de empresa

ssh -L 8443:intranet:443 usuario@bastion
[navegador] --(L:8443)--> [bastion] --> [intranet:443]

📝 Casos Prácticos Paso a Paso

Caso Práctico 1: Conectar a una base de datos remota

  1. Ejecuta el comando: ssh -L 3306:localhost:3306 usuario@servidor_interno.
  2. Abre tu cliente MySQL y conecta a localhost:3306.
  3. Verifica que puedes consultar las tablas internas.

Caso Práctico 2: Navegación segura

  1. Ejecuta el comando: ssh -D 1080 usuario@servidor_remoto.
  2. Configura el navegador para usar proxy SOCKS localhost:1080.
  3. Accede a cualquier página y verifica que el tráfico pasa por el túnel.

Caso Práctico 3: Compartir un proyecto web local

  1. Ejecuta: ssh -R 8080:localhost:3000 usuario@servidor_publico.
  2. Tu colega accede a http://servidor_publico:8080.
  3. Verifica que ve la aplicación en tiempo real.

Caso Práctico 4: Acceder a intranet de empresa

  1. Ejecuta: ssh -L 8443:intranet:443 usuario@bastion.
  2. Abre el navegador en https://localhost:8443.
  3. Confirma que puedes acceder a la aplicación interna.

⚠️ Riesgos de Seguridad

  • No abrir puertos a toda la red (0.0.0.0).
  • Revisar AllowTcpForwarding y GatewayPorts en sshd_config.
  • Aplicar mínimos privilegios.

📌 Conclusión

El port forwarding con SSH es imprescindible para administradores y desarrolladores. Permite acceso seguro a servicios, navegación cifrada y publicación de aplicaciones internas. Usa estas técnicas con responsabilidad y mantén la configuración segura.