Jump Host en SSH, cómo usar un proxy
Hoy aprenderemos a realizar una conexión con Jump Host en SSH hacia un servidor remoto, mediante la conexión previa a uno o más Jump Hosts o Proxys.
Respondiendo una consulta de mis alumnos del curso de SSH, hoy voy a pasar a explicar el uso de proxys, jump hosts, o servidores intermedios para establecer un canal seguro SSH contra un servidor remoto.
Supongamos el siguiente caso práctico: Tenemos acceso SSH hacia un servidor en Internet, digamos, Server A, y desde ese servidor podemos conectar, también por SSH, a un segundo servidor, Server B.
Veamos una ilustración del caso.
Si necesitamos realizar regularmente conexiones hacia el Server B, deberíamos, en cada caso, realizar una conexión previa contra el Server A para, desde ahí, conectar al segundo servidor.
Veamos cómo podemos implementar, mediante el cliente ssh, este salto de manera automática.
Jump Host en SSH: práctica
Supongamos que el acceso SSH hacia el Server A es:
ssh diego@ip_server_A
Mientras que el acceso al Server B desde el Server A es:
ssh juan@ip_server_B
Podríamos utilizar la opción de Jump Host provista por el cliente SSH: -J
, de la siguiente forma.
Desde nuestra computadora cliente:
ssh -J diego@ip_server_A juan@ip_server_B
Así, el cliente SSH establecerá primero un túnel seguro contra el Server A, y desde ahí, automáticamente, realizará la conexión contra el Server B, y nos devolverá un prompt del Server B.
Jump Host en SSH con otros comandos
Como sabemos, SSH provee varias utilidades del lado del cliente, entre ellas, una que suelo utilizar mucho: scp (Secure Copy).
Esta herramienta permite copiar archivos, como si se tratase de un simple comando cp
, pero en lugar de realizar la copia local, lleva a cabo copias remotas entre hosts de la red.
Veamos un ejemplo simple: voy a copiar el archivo test.txt
desde mi directorio local, hacia el directorio home de mi usuario remoto en el sistema 192.168.0.150
:
scp test.txt diego@192.168.0.150
De esa forma, mi computadora creará un túnel seguro contra el host 192.168.0.150
, y copiará el archivo local, test.txt
, dentro del directorio Home del usuario diego en el equipo remoto.
Ahora bien, el comando scp
también tiene la posibilidad de usar un Jump Host para copiar archivos hacia y desde un equipo remoto que esté más allá del proxy.
Supongamos que ahora quiero copiar mi archivo local, test.txt
, dentro del Server B del caso práctico anterior, y no puedo hacerlo directamente, sino que necesito conectar primero con el jump host Server A.
Esto puede realizarse de la siguiente manera:
scp -J diego@ip_server_A test.txt juan@ip_server_B
Esto también es posible mediante el comando sftp
, esta utilidad pseudo-ftp que conecta al host remoto utilizando un túnel SSH.
sftp -J diego@ip_server_A test.txt juan@ip_server_B
Dentro del prompt de sftp
ahora se podrán subir o bajar archivos libremente.
En ambos casos, la conexión al jump host intermedio es totalmente transparente para el usuario.
Configuración persistente
SSH permite configurar los jump host de manera persistente, de modo que podríamos pedir una conexión contra un host remoto, y que el cliente ssh automáticamente detecte que dicha conexión es posible mediante un proxy, y realice la conexión previa.
Para ilustrar el caso práctico anterior, supongamos los siguientes dos bloques Host en la configuración de nuestro cliente SSH (~/.ssh/config
):
[...]
Host serverA
HostName ip_server_A
User diego
Host serverB
HostName ip_server_B
User juan
ProxyJump serverA
[...]
Así, podríamos establecer la conexión contra el Server B, pasando por el Server A como proxy, utilizando en nuestra terminal algo similar a esto:
ssh serverB
El cliente SSH realizará la conexión previa al Jump Host tal y como lo especificamos en la configuración.
Varios Jump Hosts en SSH?
Dato adicional, si entre origen y destino tuviéramos varios proxys o Jump Hosts, podemos cargarlos separando por comas en los comandos SSH anteriores, por ejemplo:
ssh -J diego@ip_server_A, miusuario@otro_proxy juan@ip_server_B
Para el caso de la configuración persistente, sólo será cuestión de añadir otro bloque de configuración al anterior:
[...]
Host serverA
HostName ip_server_A
User diego
Host otro_proxy
HostName ip_otro_proxy
User miusuario
ProxyJump serverA
Host serverB
HostName ip_server_B
User juan
ProxyJump otro_proxy
[...]
Conclusiones
Y hemos llegado al final! Espero que les resulte útil y práctico este tip de SSH, y les sirva para conocer una opción un tanto «rara» del cliente SSH.
Un dato adicional, yo en ningún momento he tenido que escribir la contraseña de mis servidores para realizar todos los túneles, dado que tengo configurado el acceso mediante clave pública y privada. De no tener estas configuraciones, el cliente ssh
nos solicitará la contraseña de autenticación contra cada uno de los Jump Hosts y contra el server final.
Si quieren saber dónde pueden obtener más info, nunca está de mas consultar el man ssh 🙂 #RTFM
Sin más, cualquier comentario saben dónde encontrarnos, no será molestia.
Será hasta la próxima!