http://es.tldp.org/LinuxFocus/pub/mirror/LinuxFocus/Castellano/March2003/article273.shtml

Redirección de puertos, túneles SSH Bajo Linux/Unix

SSH permite la redirección (forwarding) de cualquier flujo de datos TCP a través de un "túnel" en una sesión SSH. Esto significa que el flujo de datos de la aplicación, en vez de ser gestionada directamente por los puertos del servidor y el cliente, es "encapsulada" en un "túnel" creado al conectar (inicio de sesión) (ver el siguiente diagrama).

Esto mismo se hace con el protocolo X11 sin ningún esfuerzo especial (por parte del usuario), con un manejo transparente de los displays y la capacidad de propagarse continuamente cuando se realizan varias conexiones.

Para otros flujos, existe una opción de línea de comandos, para cada lado:
 

Esta potente característica ha llevado algunas veces a calificar a SSH como "un túnel para pobres". Se debe comprender que la pobreza aquí significa: aquellos que no tienen privilegios de administrador en el lado cliente. Sólo en casos particulares se puede redirigir un puerto local con menos privilegios ( puertos > 1024) y sin privilegios de superusuario ("root"). Por otro lado, cuando se necesita redirigir un puerto local con privilegios, se tiene que hacer con la cuenta de root, o el cliente debe tener privilegios de superusuarios ("suid") (De hecho, un puerto local privilegiado permite la redefinición de un servicio estándar).

Como con IP, es bastante fácil meter cualquier cosa en cualquier cosa (y lo contrario), no solo es posible redirigir un flujo TCP, sino también las conexiones PPP, lo que nos permite hacer un túnel IP "real" en IP (que está cifrado, por lo tanto seguro). El método excede el objetivo de este artículo, pero puedes leer el "Linux VPN-HOWTO" para conocer los detalles y obtener scripts de instalación (también podrás encontrar soluciones nativas VPN para Linux, como "stunnel" que deberías considerar antes de realizar la elección final).

Ten presente que la primera posibilidad es redirigir los flujos de telnet: Esto podría parecer totalmente inútil, ya que SSH implementa una conexión interactiva por defecto. Sin embargo, al redirigir las conexiones telnet, podrías usar tu cliente favorito en vez del modo SSH interactivo. Esto es realmente valioso en entornos Windowstm o MacOStm donde los clientes SSH puede que no se adecuen a la ergonomía preferida por el usuario. Por ejemplo, la "emulación de terminal" parte del cliente "Mindterm" (cliente SSH en Java, presente en todos los sistemas modernos) sufre la escasez de rendimiento del lenguaje Java: puede ser ventajoso usar este cliente únicamente para abrir un túnel SSH.

De la misma manera, también puedes iniciar un cliente remoto como "xterm" (por ejemplo, usando redirección X11 automática -- automatic X11 forwarding -- en SSH), lo que nos permite usar SSH en terminales X.

Ten en cuenta que el túnel permanece abierto mientras halla un flujo de datos, incluso aunque no venga del que lo inició. Por lo tanto, el comando "sleep" es muy útil para abrir un túnel SSH para redirigir una nueva conexión TCP.

% ssh -n -f -L 2323:serveur.org:23 serveur.org sleep 60

% telnet localhost 2323

... bienvenido a serveur.org ...

La primera línea abre el túnel, lanza el comando "sleep 60" en el servidor, y redirige el puerto local número 2323 al puerto remoto (telnet) número 23. El segundo inicia un cliente telnet en el puerto local número 2323, y entonces usará el túnel (cifrado) para conectarse al demonio telnetd del servidor. El comando "sleep" terminará después de un minuto (tienes sólo un minuto para iniciar telnet) , pero SSH sólo cerrará el túnel cuando el último cliente halla terminado