martes, 6 de agosto de 2013

Tunel inverso SSH

Imagina que tienes que conectar por SSH a un ordenador que está protegido detrás de un cortafuegos  o un router que impide que llegues a su puerto 22 que es el que utiliza SSH.

La solución sería abrir ese puerto 22 y redireccionarlo al equipo al que necesitamos acceder, pero no siempre eso es posible.  Aun así, podemos conectarnos a él mediante SSH, creando un túnel inverso.


Para no liarnos, voy a describir bien la situación. Quiero conectar a un equipo de mi trabajo desde casa. Tengo usuario y contraseña en ese equipo, pero la red está configurada para que desde fuera no se pueda acceder a él. Y digamos que el sysadmin no es proclive a abrir el puerto 22 al exterior.

El primer paso es conectarme desde la red de mi trabajo al ordenador que queremos controlar en remoto. Después, pediremos amablemente a este equipo que sea el quien se conecte con el ordenador de mi casa creando una conexión reversa que luego utilizare desde allí.

  • ssh -R 9999:localhost:22 usuario_pc_casa@IP_mi_ordenador
Con esto hemos pedido al equipo de la oficina que conecte con el de mi casa y cree un túnel inverso.
 
Una buena idea es poner esta orden en cron de forma que se ejecute al iniciar el equipo y así siempre tendrás la conexión lista.

Ahora en mi casa, tengo una conexión entrante desde el equipo de la oficina, pero yo no quiero que me controlen mi equipo desde allí, si no controlar aquel, por lo que voy a conectarme a él empleando esa conexión entrante.

  • ssh -p 9999 usuario_pc_oficina@localhost
Con ello estoy conectando SSH por el puerto 9999 que es el que creamos con la conexión que realicé desde la oficina a mi casa. El usuario es el del equipo de la oficina y el “host”, el equipo local, que es quien redirige por la conexión entrante al puerto 9999.

Y listo, ya tengo acceso al equipo de la oficina, ese que esta tan aislado detrás de los cortafuegos de la empresa.

13 comentarios:

  1. como siempre, interesantísima entrada. Pero esta vez 't'has pasao', Carlos, es to es para 'menos' torpes y 'menos' brutos :) :) :) ;)

    ResponderEliminar
    Respuestas
    1. Si lo he podido hacer yo.... ¡es pa torpes!
      :P

      Eliminar
  2. Pues yo diría que normalmente una empresa con cara y ojos tendrá las conexiones entrantes bloqueadas mediante un firewall. (O almenos restringidas a un determinado número de IP)

    Por lo tanto da igual lo que hagas porqué no te podrás conectar.

    Sí me equivoco dimelo y así aprendemos todos.

    ResponderEliminar
    Respuestas
    1. Las entrantes, si, pero es que nosotros estamos utilizando una conexion saliente y se suele ser mas permisivo.

      Eliminar
    2. Si funciona , basta que tenga las salientes y todas las entrastes , si funciona .. asi que por mas poderoso firewall , igual se vulnera

      Eliminar
  3. Muy buena explicación, agradecido, me sirvió mucho!

    ResponderEliminar
  4. Está publicado muy claramente y creo que lo he hecho la semana pasada y me ha funcionado, pero lo pruebo ahora con la orden:
    # ssh -R 9999:localhost:20822 root@myhost.ddns.net
    y me dice:
    ssh: connect to host myhost.ddns.net port 22: Connection refused
    En la sección NAT de mi router tengo hecho un forwarding del 20822 externo al 22 interno de la máquina a la que me quiero conectar.
    Si, desde la máquina remota, hago:
    # ssh myhost.ddns.net -p 20822
    me conecta correctamente.
    ¿Alguna idea?
    Gracis anticipadas.

    ResponderEliminar
    Respuestas
    1. Yo apostaría porque es la configuración del router la que falla.

      Eliminar
    2. El problema es que te estás intentando conectar al puerto 22 y redirigir el 20822.
      La orden que tendrías que ejecutar sería:

      # ssh -R 9999:localhost:22 root@myhost.ddns.net -p 20822

      Des esta forma rediriges el puerto ssh de la máquina que quieres y te conectas a tu servidor "myhost.ddns.net" al puerto que dices que tienes redirigido.

      Eliminar

prekes sodui