Categorías
SSH

SSH: Saltar a través de túneles

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada.