Archivo de la etiqueta: openssh

Conectarse a un servidor ssh inaccesible atravesando otro servidor ssh intermedio

Estoy en casa cuando repentinamente recuerdo que dejé una tarea pendiente en la oficina para la cuál necesito acceder a mi equipo. Es viernes por la tarde y la inminente llegada del fin de semana representa un problema: en la oficina ya todos se fueron y nadie en su sano juicio regresaría para terminar el trabajo. Por suerte, estoy consciente de que la computadora está encendida y el servidor ssh está corriendo. Pero claro, cómo acceder remotamente cuando la máquina no es accesible desde Internet. La buena noticia es que hay un servidor en la red al que sí puedo conectarme por ssh desde casa y desde allí ingresar al equipo.

Este tipo de escenarios, que a mi me gusta llamar SSH Multi-Huésped, es algo común entre los administradores de sistemas y existen muchos métodos para resolver la conexión: desde un rudimentario, inseguro e ineficiente direccionamiento de puertos hasta una conexión ssh en escalas, algo así:

usuario@casa$ ssh usuarioservidor@servidor
Password for usuarioservidor@servidor:
Last login: Fri Dec  2 17:01:43 2016 from 'ip_casa'

usuarioservidor@servidor$ ssh usuariooficina@oficina
Password for usuariooficina@oficina:
Last login: Fri Dec  2 17:02:15 2016 from 'ip_servidor'

usuariooficina@oficina $

Está claro que no es la manera que una administrador de sistemas usaría. La alternativa es habilitar el direccionamiento del agente a través de los equipos y pasarle la opción -t para forzar la asignación de una pseudo-tty para contar con una shell interactiva.
 

usuario@casa $ ssh -A -t usuarioservidor@servidor ssh -A usuariooficina@oficina
Password for usuarioservidor@servidor:
Password for usuariooficina@oficina:
Last login: Fri Dec  2 17:05:39 2016 from 'ip_casa'

usuariooficina@oficina $

Bonito ¿no? No, es horrible. Basta imaginar que el camino entre el equipo de mi casa y el de la oficina tuviera tres o cuatro máquinas intermedias. Ni hablar si lo que buscamos es copiar un archivo desde un extremo al otro con scp. Sin duda, estos métodos carecen de toda elegancia. Lo que yo necesito es realizar esta operación de una manera simple, transparente y eficiente.

Para esto contamos con dos herramientas: por una lado, tenemos netcat (Netcat – Wikipedia, la enciclopedia libre), que debe estar instalado en las máquinas intermedias; por otro, la opción ProxyCommand habilitada en nuestro cliente ssh. Para configuralo, hay que añadir algunas líneas al final del archivo de configuración /etc/ssh/ssh_config en el equipo desde el cual iniciamos la conexión.
 

usuario@casa $ sudo nano /etc/ssh/ssh_config

/etc/ssh/ssh_config

[…]
Host oficina
User usuariooficina
HostName oficina
Port 22
ProxyCommand ssh -q usuarioservidor@servidor nc %h %p

Para explicar un poco el contenido agregado al archivo:
Host es un nombre arbitrario que nos servirá para identificar fácilmente el huésped al que buscamos conectarnos
User, Hostname y Port representan las variables que netcat usará para conectar los húespedes
ProxyCommand: aquí se ejecuta el comando requerido para iniciar la conexión. La opción -q (quiet mode) suprime los mensajes de advertencia y diagnóstico; nc ejecuta netcat propiamente dicho y los valores %h y %p se obtienen de User-HostName y Port respectivamente

 

usuario@casa $ ssh oficina
Password for usuarioservidor@servidor:
Password for usuariooficina@oficina:
Last login: Fri Dec  2 17:10:05 2016 from 'ip_casa'

usuariooficina@oficina $

El procedimiento es simple y transparente. Como es natural, la cadena de equipos intermedios puede poseer más de un huésped y por supuesto, es posible configurar un sin número de conexiones diferentes. Además, con este método es posible la copia de manera sencilla de archivos desde y hacia el equipo remoto con scp, el uso del protocolo sftp, la conexión a través del gestor de archivos y como si esto fuera poco, podemos dirigir aplicaciones gráficas a través de X-forwarding. Aquí algunos ejemplos:

usuario@casa $ scp oficina:/ruta/archivo_remoto /ruta/archivo_local
Copia del archivo_remoto desde el equipo en la oficina hacia la máquina en casa.

 

usuario@casa $ ssh -X oficina pcmanfm
Ejecutando el gestor de archivos pcmanfm del equipo en la oficina en la máquina en casa a través de X-forwarding.

 

De esta manera me ocupo de terminar el trabajo pendiente y me dispongo a disfrutar de una tarde de viernes como es debido.