Configurar SSH en el lado cliente – ProxyCommand

Estamos muy habituados a configurar el servidor SSH a través de su famoso fichero sshd_config pero, por lo menos en mi caso, nunca le había hecho mucho caso al fichero sin la «d», el ssh_config, donde configuramos las opciones usadas por el cliente OpenSSH.

El caso es que tiene multitud de opciones interesantes pero voy a destacar un par de ellas que a mí me han hecho la vida más fácil.

En primer lugar, decir que podemos usar el fichero de configuración genérico /etc/ssh/ssh_config o un fichero propio para cada usuario (~/.ssh/config) que será evaluado en primer lugar.

La gracia es que podemos definir secciones en función del host al que vayamos a conectarnos y definir en cada sección la serie de parámetros que queramos aplicar para cada caso.

Veamos un ejemplo sencillo:

Host prebbdd
	User root
	HostName 192.168.100.22

El «Host» no tiene porqué ser un nombre DNS, simplemente es un alias que le ponemos al nombre de la conexión.

El «HostName» puede ser una IP o un nombre DNS.

La pregunta obvia es ¿y porqué no simplemente usar «ssh root@192.168.100.22«?

Obtenemos varias ventajas:

  • Obvia: No es necesario recordar la IP. Con un nº elevado de máquinas hay que tenerlo en cuenta.
  • Si tenemos DNS, vale, recordaremos más facilmente el nombre de la máquina, pero el alias seguira siendo más corto que el FQDN.
  • La ventaja definitiva: Autocompletado: cuando en la consola estemos escribiendo «ssh pre…» y demos al tabulador nos completará el nombre de host automáticamente o nos sacará todos los host que tengamos configurados que empiecen por «pre«.

A partir de aquí podemos complicar el asunto cuanto queremos. Como siempre, lo mejor un man ssh_config.

ProxyCommand

Este parámetro es especialmente útil si tenemos que acceder a máquinas a las que no tenemos un acceso directo y para entrar en ellas, tenemos que hacer login primero en una máquina intermedia y a partir de ahí hacer un nuevo ssh a la máquina destino.

La cosa podría quedar así:

Host maquinadestino
	HostName 192.168.100.22
	ProxyCommand ssh -q root@maquinaintermedia nc -q0 %h 22

La línea es prácticamente autoexplicativa: «cuando vayas a conectar a máquina destino haz login primero en maquina intermedia y en ella ejecuta un netcat para ir a %h:22 donde %h es sustituido por la ip que tengamos en HostName (destino).

A esta técnica se la conoce con el nombre de «Tunnel Stacking» e incluso podríamos apilar N número de «saltos» simplemente definiendo el Proxy por el que hay que pasar en cada caso en la sección del Host.

Por ejemplo si tuvieramos una máquina que sólo fuese accesible desde maquinadestino, que llamaremos «aunmasremoto» definiremos en nuestra configuración:

Host maquinadestino
	HostName 192.168.100.22
	ProxyCommand ssh -q root@maquinaintermedia nc -q0 %h 22
Host aunmasremoto
	HostName 172.16.100.34
	ProxyCommand ssh -q root@maquinadestino nc -q0 %h 22

Para hacer que la conexión sea más transparente podemos configurar antes autenticación transparente en la máquina intermedia.

Posteriormente podremos también ir metiendo nuestra clave pública en las máquinas de salto y ya no tendremos que meter ninguna contraseña.

Con todo ello configurado podremos hacer por ej. un scp desde el origen hasta el destino de manera directa, transparente, teniendo además autocompletado con el tabulador… (potente, eh?) ;)

En el caso en que tengamos un gran pool de máquinas remotas accesibles todas ellas a través de la misma máquina intermedia podemos hacer que para acceder a todas ellas se aproveche un único túnel lanzado contra la máquina intermedia y no se abra una nueva sesión para cada una.

Esto lo podemos conseguir si añadimos a nuestro ssh_config:

ControlMaster auto
ControlPath   /home/ignacio/.ssh/tmp/%h_%p_%r

El directorio /home/ignacio/.ssh/tmp/ debe existir.

Con esto, cuando conectemos a una máquina remota se creará un socket en ese directorio con el nombre «hostname_puerto_usuario«, de tal manera que si para conectar a otra máquina remota tengo que pasar por el mismo proxy podrá reutilizar el túnel ya levantado.

En honor al gran supercoco:

:wq

tags: ,
Escrito en Redes por Ignacio Vazquez

Follow comments via the RSS Feed | Deja un comentario | Trackback URL

Leave Your Comment

 
desdelaconsola.es