Redirección de puertos

La redirección de puertos nos permite tanto encriptar comunicaciones, que de otra manera se realizarían en texto claro, como acceder a servicios que sólo están disponibles de manera local al servidor.

Si observamos las opciones avanzadas del comando ssh:


ssh [-afgknqstvxACNTX1246] [-b bind_address] [-c cipher_spec]
    [-e escape_char] [-i identity_file] [-l login_name] [-m mac_spec]
    [-o option] [-p port] [-F configfile] [-L port:host:hostport] [-R
    port:host:hostport] [-D port] hostname | user@hostname [command]
  
vemos que tenemos la posibilidad de redirigir puertos locales o puertos remotos, mediante las opciones -L y -R.

Vamos a ver un ejemplo útil para cada tipo de redirección.

Redirección puertos locales

El uso típico de esta redirección es la de tener acceso a servicios que sólo están disponibles desde la máquina remota.

Podemos realizar una conexión ssh a la máquina remota y redirigir este servicio para utilizarlo de manera local.

La sintaxis es:


ssh [-L port:host:hostport] hostname | user@hostname
    
donde:

Se entenderá mejor con un ejemplo.

Voy a utilizar el servicio de proxy que se sirve en el puerto 81 de la máquina proxy.dominio.es y que sólo está disponible desde servidor.dominio.es, mediante el puerto local 8080.


[usuario1@localhost usuario1]$ ssh -L 8080:proxy.dominio.es:81 \
                                    usuario1@servidor.dominio.es
[usuario1@servidor usuario1]$
   
De esta manera además de obtener un shell realizamos la redirección de puertos. Si no deseamos obtener el shell podemos utilizar la opción -f para que el comando se quede en background y -N para indicar que no queremos ejecutar comandos remotos.

[usuario1@localhost usuario1]$ ssh -fN -L 8080:proxy.dominio.es:81 \
                                        usuario1@servidor.dominio.es
[usuario1@localhost usuario1]$ netstat -lnp|grep 8080
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      6417/ssh
[usuario1@localhost usuario1]$ ps -fp 6417
UID        PID  PPID  C STIME TTY          TIME CMD
usuario1     6417     1  0 19:24 ?        00:00:00 ssh -fN -L 8080:proxy.dominio.es:81 usuario1@servidor.dominio.es
[usuario1@localhost usuario1]$
   
Como puedes observar de esta manera el comando ssh se queda en background y no tenemos shell en la maquina servidor. Ahora sólo nos quedaría configurar nuestro navegador para utilizar como proxy a localhost por el puerto 8080.

Sugerencia

En el ejemplo el servicio redirigido sólo puede usarse localmente. Si quieres que tu máquina acepte conexiones remotas en este puerto deberás añadir al comando la opción -g.

Redirección puertos remotos

Esta redirección se realiza en sentido inverso a la anterior y se utiliza para hacer accesible remotamente un puerto local o accesible localmente.

La sintaxis es:


 ssh [-R port:host:hostport] hostname | user@hostname
    
donde:

Por ejemplo, este comando conseguirá que en la máquina remota se sirva en el puerto 8001, el servidor de streaming que se está sirviendo en la máquina local en el puerto 8000.


ssh -fN -R 8000:localhost:8001 usuario1@servidor.dominio.es