Conexión remota usando SSH inverso

The following two tabs change content below.

Nerd Monkey

Me gusta el software. email: nerdmonkey@monkeytips.es

Latest posts by Nerd Monkey (see all)

Supongamos que quiero acceder remotamente a una máquina conectada a Internet. Puedo usar el protocolo SSH, solamente necesito saber su dirección IP (y tener credenciales de acceso como usuario, claro).

Pero, ¿que ocurre si no puedo conocer de antemano su dirección? Aquí es donde entra en juego SSH inverso.

Casos de uso

Una conexión SSH inversa puede resultar útil en varios escenarios, cuando la máquina remota:

  • No sea accesible directamente (porque está en una red local detrás de un NAT).
  • Sea accesible pero con dirección variable (IP dinámica), que no es conocida en todo momento.
  • Tenga una conexión inestable a Internet, como un enlace 2G/3G/4G. Cuando recupere la conexión, puede encargarse ella de reconectar, y no esperar a que otra máquina lo intente.

También es posible, como alternativa, conectar las máquinas a través de una VPN. Sin embargo, esa solución trae consigo una serie de implicaciones adicionales que no voy a explicar aquí. Basta con decir que aporta funcionalidades que no necesitamos y posibles problemas, aparte de un mayor consumo de red.

Entorno de ejemplo

Llamaré a la máquina remota (a la que quiero acceder) simplemente remota, y al equipo que uso para conectarme cliente. Pero hace falta un elemento más, un intermediario entre ambos cuya dirección sea conocida por las otras máquinas en todo momento. A esa máquina la voy a llamar servidor.

Tendrán las siguientes direcciones:

  • remota – 10.0.0.5 (dirección de red local)
  • servidor – 87.148.67.6 (dirección pública fija)
  • cliente – cualquiera, es irrelevante

Esquema del entorno de ejemplo

Pasos para conectar

Para poder preparar las conexiones, antes de nada es necesario conectarse directamente (por SSH o de manera local, con monitor y teclado) a las máquinas remota y servidor, para ejecutar algunos comandos. Supongo que conocéis como hacer esto, por lo que no entraré en ese tema.

En servidor

Para permitir la redirección hacia la máquina remota, es necesario cambiar un valor de configuración del servidor SSH. Solo hay que acceder a la máquina y dirigirse al fichero /etc/ssh/sshd_config, para asignar el valor del parámetro GatewayPorts a yes o a clientspecified (ambos son válidos para este cometido).

En remota

Tras acceder, ejecuto los siguientes comandos:

su usuarioRemota
ssh -R \*:8123:localhost:22 -NCf usuarioServidor@87.148.67.6

Con los anteriores comandos, me aseguro de que soy un usuario concreto (usuarioRemota) en la máquina remota, y acto seguido conecto hacia servidor con un usuario local en ella (usuarioServidor). Será necesario conocer las credenciales de dichos usuarios, para acceder mediante password o sus pares de claves pública y privada.

Los flags utilizados tienen el siguiente significado:

  • -R: Define la redirección, desde una dirección y un puerto (\*:8123) a otra dirección y puerto (localhost:22). Es decir, dirige a cualquier dirección que conecte a través del puerto 8123 en servidor hacia el puerto 22 (SSH) propio. Puedes cambiar el puerto 8123 a cualquier otro disponible en servidor.
  • -N: Indica que no se enviará ningún comando a través de SSH, la conexión solo se usará para mantener el túnel.
  • -C: Comprime la información que pase a través del túnel.
  • -f: Tras conectar, pasa el proceso a segundo plano.

En cliente

Ya solo resta usar la infrastructura montada para acceder desde cliente hasta remota:

ssh usuarioRemota@87.148.67.6 -p 8123

Como veréis, conecto con el usuario de la máquina remota (usuarioRemota), a la dirección de la máquina servidor (87.148.67.6) en el puerto que ha sido definido para la redirección (8123).

Si todo ha ido correctamente, deberías poder acceder con las credenciales de usuarioRemota tal y como lo harías directamente hacia remota.

Y por hoy me despido, espero haberte enseñado algo nuevo y de utilidad. Si tienes cualquier duda o sugerencia puedes dejar un comentario o escribir un correo a nerdmonkey@monkeytips.es. Si te ha gustado este post compártelo, y para estar al tanto de las novedades síguenos en las redes sociales. ¡Que vaya bien!


Fuentes:
Si te ha gustado, ¡compártelo! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInEmail this to someone

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *