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:
-
El cliente puede conectarse al jump host mediante SSH.
-
El jump host tiene acceso a la red privada.
-
Desde el jump host se permite la conexión al servidor interno.
-
El cliente no tiene conectividad directa con el servidor interno.
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:
-
bastionrepresenta el host bastión accesible desde Internet. -
internoes el servidor ubicado en la red privada. -
ProxyJump bastionindica que cualquier conexión ainternodebe 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:
-
Conectarse al host bastión.
-
Establecer el salto hacia el servidor interno.
-
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:8080de la máquina local se redirige alocalhost:80del 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
-
SSH to remote hosts through a proxy or bastion with ProxyJump
-
Bastion Host. Wikipedia.
-
Proxyjump, la opción de SSH de la que probablemente nunca hayas escuchado hablar
-
How I Used SSH ProxyJump to Access a Website on a Private EC2 Instance
-
Replacing a Bastion Host with Amazon EC2 Systems Manager. AWS.