En algún momento, todos hemos estado en un entorno similar al que se muestra abajo y hemos tenido la divertida experiencia de pasar por SSH de un salto a otro para acceder al Servidor en un entorno más seguro.
Ahora bien, si esto es una ocurrencia rara, no es un gran problema. La verdadera molestia viene cuando es un proceso constante y el tiempo para saltar entre las máquinas comienza a sumar e impactar la productividad.
Aquí es donde ~/.ssh/config y ProxyJump vienen a hacer la vida más fácil.
~/.ssh/config
Se trata de un archivo de configuración para ssh que permite especificar configuraciones personalizadas y asignarles un alias. A continuación un ejemplo simple que establece algunos parámetros para todos los hosts, y define el alias para Bastión.
Host * ServerAliveInterval 60 TCPKeepAlive no ForwardAgent yes Host bastion Hostname bastion.midominio.edu.ar User daniel Port 3107 IdentityFile ~/.ssh/id_daniel.pub
Lo anterior permite a un operador ingresar simplemente ssh bastion y tener la información de usuario y nombre de host suministrada automáticamente. Esto es útil para simplificar el proceso en general y reduce la necesidad de recordar complejos y largos nombres dns o direcciones IP cuando se trata de SSH.
Pero aún me queda un paso para llegar al Servidor. Entones, ¿qué pasa si tenemos varios saltos previos antes de llegar al Servidor? Con la configuración básica mostrada arriba un operador todavía tendría que hacer ssh salto1 luego ssh salto2 luego ssh salto3 luego ssh bastion. Es mejor, pero requiere múltiples comandos, y múltiples configuraciones SSH (una en cada máquina intermedia) así como claves SSH almacenadas en cada máquina.
ProxyJump
Aquí es donde entra ProxyJump. Si modificamos un poco nuestra configuración SSH anterior y tenemos todas las claves SSH asociadas en nuestra máquina local, podemos simplificar bastante el proceso. La configuración de abajo simplemente se añade la directiva ProxyJump a cada máquina, indicando a través de qué máquina hay que saltar para llegar a la máquina de destino.
Host * ServerAliveInterval 60 TCPKeepAlive no Host salto1 HostName salto1.midominio.edu.ar User admin IdentityFile /home/usuario/.ssh/salto1.pub Host salto2 HostName 10.236.156.12 User admin IdentityFile /home/usuario/.ssh/salto2.pub ProxyJump salto1 Host Bastion HostName sec.dx.prod.c1.az1.r1a.dc1.vsp.ejemplo.edu.ar User admin IdentityFile /home/usuario/.ssh/salto3.pub ProxyJump salto2 Host servidor HostName dep1.dx.prod.c1.az1.r1a.dc1.vsp.ejemplo.edu.ar User daniel IdentityFile /home/usuario/.ssh/servidor.pub ProxyJump bastion
Este simple cambio permite a un operador hacer ssh a servidor, esperar un poco a que se realicen todas las conexiones, y entrar en una terminal en la máquina Servidor.
Eventualmente, esto se podría hacer desde la línea de comandos, separando cada host con una coma.
$ ssh -J host1,host2,host3 destino
Modificar el reenvío de puertos dentro de una sesión con ~C
Es posible modificar el reenvío de puertos sobre la marcha dentro de una sesión ssh existente. Imaginemos este escenario de ejemplo. Estamos en lo profundo de una red; tal vez ya hemos saltado a través de media docena de equipos y necesitamos un puerto local en nuestra estación de trabajo reenviado a algún sistema.
Después de pulsar enter, ingresamos ~C en la terminal. Esta es una secuencia de escape de control dentro de la sesión que permite realizar cambios en la conexión existente.
$ ~C ssh> -h Commands: -L[bind_address:]port:host:hostport Request local forward -R[bind_address:]port:host:hostport Request remote forward -D[bind_address:]port Request dynamic forward -KL[bind_address:]port Cancel local forward -KR[bind_address:]port Cancel remote forward -KD[bind_address:]port Cancel dynamic forward ssh> -L 9980:equipo-remoto:80 Forwarding port.
Con esto reenviamos nuestro puerto local 9980 al 80 de un host en la red interna y ya podemos acceder con el navegador al localhost:9980