Túneles SSH
SSH permite establecer túneles encriptados entre puertos de las dos máquinas conectadas por la conexión SSH.
1. Linux
En linux, puede ejecutarse el comando ssh de forma que solo establezca el túnel, sin necesidad de establecer una sesión interactiva, es decir, de ejecutar un shell en la máquina remota.
1.1. Desvío de puerto local
La orden
ssh -f -N -L 1234:localhost:4321 ejemplo.com
ejecuta el login en la ejemplo.com sin establecer posteriormente una sesión interactiva y establece el túnel.
El túnel se establece entre el puerto 1234 de la máquina local y el puerto 4321 de la remota en su dirección localhost.
En la máquina local, la dirección por defecto es la de loopback, es decir, localhost o 127.0.0.1, excepto que la directiva GatewayPorts en el fichero de configuración establezca otra cosa, o en la orden ejecutada al puerto local anteceda una dirección (separada por : del puerto local).
En la orden previa, el túnel se establece con origen en la máquina local, es decir, se crea un socket que escucha en la máquina local y cuando se establece una conexión en él, se abre otra en la máquina remota, estableciéndose el túnel entre ambas.
La opción -f hace que se el proceso ssh pase a ejecutarse en background una vez establecida la conexión, de forma que se espera que sea otro el proceso que inicie una conexión en el puerto redirigido, mientras que la opción -N hace que no se ejecute un shell (u otro comando) en la máquina remota.
1.2. Desvío de puerto remoto
La opción -R, en lugar de -L hace que el sentido del túnel sea el contrario: se crea espera conexión en el puerto remoto y cuando se establece, se abre una en el puerto local. En este caso, también se invierte la especificación de los puertos y direcciones: el primer puerto es el de la máquina remota y el segundo el de la local.
1.3. Otras variantes
Con las opciones -L y -R, el túnel se establece entre dos sockets, local y remoto, variando cuál de ellos se crea primero para ponerse en escucha.
Pero existe una tercera variante, la opción -W en la que en lugar de crear un socket a la escucha en espera de que otro proceso abra una conexión en él, el extremo local se conecta a la entrada y salida estándar y se establece una conexión en el puerto remoto. Lógicamente, esto es útil para ser utilizado en guiones shell. Esta opción implica -N, es decir, no se ejecuta ningún comando en la máquina remota.
Con las opciones -L y -R, las opción -N solo es opcional, es decir, ha de establecerse explícitamente. Si no se hace, sí se ejecutará el comando remoto, normalmente un shell. La opción -f es opcional en todos los casos. Sin embargo, lo usual es que en los dos primeros casos el establecimiento de un túnel no vaya asociado al de una sesión interactiva, por lo que el uso de -f -N es lo normal.
2. Güindous
Aquí hay que tirar de http://www.chiark.greenend.org.uk/~sgtatham/putty/ y siempre existe una sesión interactiva.
Como en el caso de linux, puede establecerse el túnel en ambos sentidos: local->remoto o remoto->local. Los puertos y direcciones se establecen en el panel Tunnels de configuración de la conexión.
Una vez configurado, se salva la sesión con un nombre para poder ser utilizada posteriormente.