Script para tunel SSH inverso

Muchos de los equipos a los que tengo que hacer pequeñas intervenciones o mantenimientos en el trabajo van rodando por el mundo, es decir, o son portátiles o son equipos tras routers/firewalls no controlados por mi. Así­ que tengo el problema de no poderme conectar por SSH a (supongamos) un portátil de un gerente que anda en algún hotel del mundo usando a saber que conexión a internet.

La opción más rápida era montar un script que hiciese un tunel ssh inverso hacia “mi máquina” y a partir de ahí­ tener acceso completo a cualquier equipo fuera de mis dominios de BOFH.

Pero para entenderlo mejor, voy a poner un caso práctico. Tenemos un amigo que se ha puesto una KUBUNTU. Nos llama para decirnos que no sabe como instalarse un programa, como es normal, no tenemos acceso SSH al equipo de nuestro amigo, por que no tiene ni idea de configurarse un NAT en su router, así­ que le enviamos el siguiente script por mail:


#!/bin/bash
# Script para hacer tunel ssh inverso
# Por David Martí­n :: Suki_ ::
# http://sukiweb.net

USUARIO_TUNEL="remoto"
PUERTO_TUNEL="22222"

SERVIDOR_REMOTO="servidor.remoto.com"
PUERTO_SERVIDOR_REMOTO="22"

TEXTO="echo ' ADMINISTRACIí“N REMOTA';
echo 'Se va a proceder a la conexión remota de este equipo con el servidor:';
echo $SERVIDOR_REMOTO;
echo;
echo 'Mantenga esta ventana abierta mientras desee mantener la conexión.';
echo;
echo 'Teclee a continuación la clave del usuario $USUARIO_TUNEL.';
echo;
echo"

TUNEL="ssh -l $USUARIO_TUNEL -R $PUERTO_TUNEL:localhost:$PUERTO_SERVIDOR_REMOTO -N $SERVIDOR_REMOTO"

xterm -title "Administración Remota" -e "$TEXTO;$TUNEL"

En nuestra máquina, creamos un usuario llamado “remoto” con una clave que luego le daremos a nuestro amigo. Vamos a suponer que nuestra máquina es accesible desde internet a través del dominio servidor.remoto.com (aunque también puedes usar tu IP pública) y que tienes el servidor SSH a la escucha en el puerto 22.

Bien, le dices a nuestro amigo que ejecute ese script (recuerda explicarle como darle permisos de ejecución) y le aparecerá una ventana como esta en su escritorio:

tunel_SSH_inverso

Le decimos que teclee el password que hemos asignado al usuario remoto y que mantenga esa ventana abierta. En este momento, nosotros nos vamos a nuestra consola y hacemos un ssh al puerto 22222 de nuestra máquina, con el usuario de nuestro amigo, algo como:

:~$ ssh -p 22222 amigo@localhost

Nuestro amigo nos da su password (o el de otro usuario de su máquina) y ya estamos dentro. De esta forma, podemos instalarle la aplicación que querí­a o lo que sea necesario.

El script se puede mejorar mucho, aunque es lo suficientemente funcional como para utilizarlo en estos casos. Yo de momento lo voy a ir utilizando con todas esas máquinas GNU/Linux que andan sueltas por el mundo fuera de mis dominios de BOFH. :P

Publicado por

Suki_

CEO en Damavis Studio, proyectos I+D y BigData. Jugando con bits y software libre desde hace ya demasiado tiempo...

14 comentarios sobre “Script para tunel SSH inverso”

  1. Hola

    Buen articulo.
    Solo un pequeño apunte: si se usa la opcion -f en el comando ssh este pasa a background inmediatamente por lo que no hace falta que la ventana este abierta para que el tunel siga activo. Tambien se puede usar el formato usuario@server para que quede mas compacto. El comando quedarí­a asi:

    TUNEL=”ssh -N -f -R $PUERTO_TUNEL:localhost:$PUERTO_SERVIDOR_REMOTO $USUARIO_TUNEL@$SERVIDOR_REMOTO”

  2. Tienes toda la razón Miguel, pero existe unos pequeños inconvenientes con esa opción.

    El usuario (nuestro amigo) tenderá a pinchar varias veces en el icono por que le parecerá que no hace nada (la ventana se abre y se cierra de inmediato).

    Por otro lado, si lo haces así­, el tunel se queda establecido, por lo que nuestro amigo no tiene el control de “cortarnos” la comunicación cuando él desee.

    Precisamente por eso no lo pongo en background, aunque es buena opción tenerlo en cuenta.

    Gracias por tu aportación. :)

  3. Hola, leyendo el artí­culo me planteé una pregunta ¿y si queremos dar administración remota a un equipo que no sea Linux? Pues creo que habrí­a una solución posible:

    (1) Establecer un túnel inverso desde windows con un cliente SSH, Putty por ejemplo

    (2) Montar un servidor de escritorio remoto, VNC?

    (3) Ejecutar desde el servidor Linux el cliente VNC apuntando al localhost:22222 La pregunta es ¿en qué puerto tiene que escuchar el servidor VNC en la máquina windows?

    Supongo que estoy diciendo una barbaridad pero si fuera posible hacerlo serí­a muy útil…

    Un saludo.

  4. Pingback: piffall.net
  5. Muchísimas gracias realmente tu script me ayudó a resolver cómo dejar el ssh inverso vivo, gracias a la última línea “xterm -e “$COMMAND”, yo utilizo command en vez de túnel.

  6. Hola David Martí­n,
    muy buen script :) … tengo una consulta,como haría para conectarme a un servidor que está en otro pais diferente al mio en el que no hay una persona que ingrese el password,yo puedo crer un script que se ejecute en el servidor remoto el script,pero no podré ingresar el password, que me sugiere?…de antemano muchas gracias…

  7. Hola David,
    gracias por la pronta respuesta :) … la autenticación por llaves esa una muy buena opción,en mi caso creo que no es posible,ya que intento conectar una PC con un IP0X(un equipo como un router) que tienen como sistema operativo un uclinux y que usa dropbear para las conexiones ssh, el problema de éste IP0X es que cada vez que le hago un reboot borra la carpeta .ssh con todo su contenido y no solo ello,también cambia sus claves rsa y dss dentro de /etc/dropbear/…

    asi que pienso que la unica solucion es hacer un tunel inverso pero pasandole de alguna forma el password dentro de un script y gracias a esa sesion yo puedo acceder por SSH al IP0X…

    gracias :)

  8. Hola David,
    te cuento que logré hacer un tunel inverso para acceder desde mi PC o unos equipos tipo PC (IP0X) y funciona muy bien…ahora hay algo que no comprendo :) ,
    cuando los IP0X *ejecutan el tunel ssh* yo puedo acceder a ellos,pero he notado que cuando el tunel ssh es ejecutado,varios procesos dejan de funcionar dentro del IP0X… ¿ A que se debe esto?

    un IP0X ejecuta esto :
    ssh -i /etc/dropbear/dropbear_dss_host_key -l root -R 22222:localhost:22 -N ususario@mihost &

    y desde mi host yo ejecuto :
    ssh -p 22222 localhost -l root

    dentro de los IP0XS tengo creado unos scripts que se encargan de actualizar ficheros dentro de éstos,esos scripts son procesos que se estan ejecutando constantemente…y cuando accedo por el tunel ssh,los scripts dejan de funcionar…

    gracias :)

  9. hola gracias por la ayuda instale en una maquina ubuntu 10.4 de escritorio, lo que pasa es que no puedo instalar en servidor de ssh por que yo quiero accesar a esa maquina de otros lugares como puedo hacer y gracias por la ayuda

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.