1. Introducción

En entornos donde la seguridad es prioritaria, no es habitual exponer todos los servidores directamente a Internet. En su lugar, se utiliza un host bastión o jump host que actúa como punto único de entrada a la infraestructura mediante SSH.

Este bastión es el único servidor accesible desde el exterior. A partir de él, se permite el acceso a los servidores internos, los cuales no tienen el puerto SSH expuesto públicamente y solo aceptan conexiones desde la red interna o desde el propio bastión.

Este enfoque reduce la superficie de ataque, centraliza los controles de acceso y facilita la auditoría de conexiones.

1.1 ¿Qué es ProxyJump?

ProxyJump es una funcionalidad de OpenSSH (disponible desde la versión 7.3) que permite al cliente SSH encadenar uno o varios hosts intermedios de forma automática.

Gracias a ProxyJump, el cliente:

  • Establece primero la conexión con el bastión

  • Utiliza esa conexión como salto hacia el servidor interno

  • Presenta la sesión como una única conexión SSH transparente para el usuario

Todo ello sin necesidad de abrir sesiones SSH manuales en cada salto, lo que simplifica el acceso y reduce errores operativos.

1.2 Arquitectura de acceso mediante host bastión

En una arquitectura con host bastión, el cliente no puede conectarse directamente al servidor interno, ya que este se encuentra en una red privada.
El único sistema accesible desde el exterior es el jump host, que actúa como intermediario.

El flujo de conexión es el siguiente:

  1. El cliente puede conectarse al jump host mediante SSH.

  2. El jump host tiene acceso a la red privada.

  3. Desde el jump host se permite la conexión al servidor interno.

  4. El cliente no tiene conectividad directa con el servidor interno.

Arquitectura básica con jump host
Figura 1. Arquitectura básica con jump host

2. Conexión mediante ProxyJump

La forma más sencilla de usar ProxyJump es indicando el host bastión mediante la opción -J:

ssh -J usuario@IP_PUBLICA_BASTION usuario@IP_PRIVADA_SERVIDOR_INTERNO

En este caso:

  • El cliente SSH se conecta primero al bastión

  • Desde el bastión, establece automáticamente la conexión al servidor interno

  • El usuario obtiene una sesión directa en el servidor interno, como si se tratara de una única conexión

3. Configuración de ~/.ssh/config

Para simplificar el uso de ProxyJump y evitar repetir opciones en cada conexión, es recomendable definir los hosts en el archivo ~/.ssh/config.

3.1 Ejemplo de configuración

Host bastion
    HostName IP_PUBLICA_BASTION
    User usuario

Host interno
    HostName IP_PRIVADA_SERVIDOR_INTERNO
    User usuario
    ProxyJump bastion

En esta configuración:

  • bastion representa el host bastión accesible desde Internet.

  • interno es el servidor ubicado en la red privada.

  • ProxyJump bastion indica que cualquier conexión a interno debe realizarse pasando previamente por el bastión.

3.2 Conexión al servidor interno

Una vez definida la configuración, podemos ejecutar:

ssh interno

El cliente SSH se encargará automáticamente de:

  1. Conectarse al host bastión.

  2. Establecer el salto hacia el servidor interno.

  3. Presentar la sesión como una única conexión SSH transparente para el usuario.

4. Port Forwarding mediante ProxyJump

Además de acceder por SSH, ProxyJump permite crear túneles SSH hacia servicios que se ejecutan en servidores internos, como aplicaciones web, APIs o paneles de administración.

4.1 Acceso a un servicio HTTP en el servidor interno

El siguiente comando crea un túnel local que expone el puerto 80 del servidor interno en el puerto 8080 de la máquina local:

ssh -J usuario@IP_PUBLICA_BASTION \
    -L 8080:localhost:80 \
    usuario@IP_PRIVADA_SERVIDOR_INTERNO

En este caso:

  • El cliente SSH se conecta al bastión.

  • Desde allí accede al servidor interno.

  • El puerto localhost:8080 de la máquina local se redirige a localhost:80 del servidor interno.

El destino del túnel (localhost:80) se resuelve desde el servidor interno, no desde la máquina local. Por tanto, el servicio debe estar escuchando en ese puerto en el propio servidor interno.

4.2 Ejemplo práctico

ssh -J ubuntu@172.16.13.235 -L 8080:localhost:80 ubuntu@10.0.0.52

Tras ejecutar el comando, el servicio será accesible desde el navegador local en:

http://localhost:8080

4.3 Uso del archivo ~/.ssh/config

Si el archivo ~/.ssh/config está correctamente configurado, el comando puede simplificarse significativamente:

ssh -L 8080:localhost:80 interno

El cliente SSH utilizará automáticamente el bastión definido mediante ProxyJump.


4.4 Crear solo el túnel sin sesión interactiva

Si no se necesita una shell remota y solo se desea mantener el túnel activo, se puede usar la opción -N:

ssh -N -L 8080:localhost:80 interno

4.5 Ejecutar el túnel en segundo plano

Para ejecutar el túnel en segundo plano, añade la opción -f:

ssh -f -N -L 8080:localhost:80 interno

Esto es especialmente útil para acceder a servicios web o APIs mientras se continúa trabajando en la terminal.

Referencias