SSH Tunnelling
SSH, (Secure Shell), es un protocolo estándar que cifra las comunicaciones entre el ordenador y el servidor. El cifrado impide que estas comunicaciones sean vistas o modificadas por los operadores de red. SSH puede ser usado por una gran variedad de aplicaciones de comunicaciones seguras, donde lo más común es el acceso seguro a los servidores y la transferencia de ficheros segura (SCP o SFTP).
SSH es especialmente útil para evadir la censura porque puede proveer túneles cifrados y trabajar como un cliente proxy genérico. Los censuradores normalmente no bloquean completamente el SSH porque se usa para muchos propósitos y no solo para evadir la censura; por ejemplo, es usado por los administradores de sistema para administrar sus servidores en Internet.
Usar SSH requiere de una cuenta en un servidor, generalmente un
servidor Linux o Unix. Para evadir la censura este servidor necesita
tener acceso sin restricciones a Internet e, idealmente ser operado por
un contacto confiable. Algunas compañías también venden cuentas en sus
servidores, y muchos sitios de hospedaje brindan acceso SSH. Se puede
encontrar una lista de proveedores de cuentas en:
http://www.google.com/Top/Computers/Internet/Access_Providers/Unix_Shell_Providers que venden cuentas entre los 2 y 10 USD por mes.
Un programa SSH llamado OpenSSH viene instalado en la mayoría de los Unix, Linux y Mac OS y consiste en un programa de líneas de comando ejecutado desde un terminal como “ssh”. Para Windows también se puede obtener una implementación SSH llamada PuTTY.
Todas las versiones recientes que soportan SSH crean un proxy SOCKS que permiten que un navegador Web y otras variedades de aplicaciones usen conexiones SSH cifradas para conectarse con Internet sin restricciones. En este ejemplo, solo se describe este uso de SSH. Los pasos a continuación configuran un Proxy SOCKS en un puerto local 1080 en la computadora.
Linea de comando EN Linux/Unix Y MacOS (Con OpenSSH)
OpenSSH está disponible en http://www.openssh.com/, pero viene pre instalado en Linux/Unix y Mac OS.
El comando ssh que se ejecutará contiene un puerto local (típicamente 1080), un nombre de servidor y un nombre de usuario (nombre de cuenta). El comando sería así:
ssh -D localportnumber accountname@servername
Por ejemplo:
Se nos pedirá la contraseña y se establecerá la conexión con el servidor. Con el uso de la opción –D, se creará un Proxy SOCKS que existirá mientras se esté conectado al servidor. Importante: debemos verificar la llave del host y configurar nuestras aplicaciones, de otra forma no estaremos usando el túnel que creamos.
Interfaz de usuario gráfica de Windows (with PuTTY)
PuTTY está disponible en :
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html.
Podemos salvar el programa putty.exe en el disco duro para
usos futuros, o ejecutarlo directamente desde el sitio Web (a menudo,
esto es posible en una computadora compartida o con acceso público como
las de las librerías o Cibercafés).
Cuando iniciamos PuTTY, aparece un diálogo de configuración de sesión. Primero entramos el nombre (dirección) del servidor SSH al que queremos conectarnos (aquí, “ejemplo.com”). Si solo conocemos la dirección IP o si el DNS impide usar el nombre de los servidores, podemos usar la dirección IP. Si ejecutamos estos pasos frecuentemente, podemos crear opcionalmente un perfil PuTTY para salvar estas opciones que se describen anteriormente para usarlas cada vez que se necesiten.
Después en la lista, Category, seleccionamos Connection, después SSH, y después Tunnels.
Entramos 1080 en el campo Source port, y seleccionamos las cajas Dynamic e IPv4.
Ahora hacemos clic en el botón Add y después en el botón “Open”. Se establece una conexión con el servidor, y se abre una ventana pidiendo el nombre de usuario y la contraseña.
Entramos esta información y estaremos registrados en el servidor y recibiremos un prompt de una línea de comando desde el servidor. El proxy SOCKS está establecido. Importante: debemos verificar la llave del host y configurar nuestras aplicaciones, de otra forma no estaremos usando el túnel que creamos.

Verificación de la llave de host
La primera vez que nos conectamos a un servidor, debemos confirmar la impresión digital de ese servidor. La impresión digital es una secuencia larga de letras y números (hexadecimales) ej. 57:ff:c9:60:10:17:67:bc:5c:00:85:37:20:95:36:dd que identifica de forma segura a un servidor en particular. Chequear la impresión digital es una medida de seguridad que permite confirmar que estamos comunicando con el servidor que pensamos, y que la conexión cifrada no está siendo interceptada.
SSH no brinda un medio de verificar esto automáticamente. Para obtener el beneficio de este mecanismo, debemos tratar de chequear el valor de la firma digital del servidor con el administrador del servidor que estamos usando, o pedirle a un contacto de confianza que intente conectarse al mismo servidor para ver si ve la misma firma digital.
Verificar la firma digital es importante para asegurarnos que SSH protege la privacidad de las comunicaciones de la curiosidad de terceros, pero no es necesario si solo deseamos evadir la censura y no nos importa si los operadores de redes pueden ver el contenido de las comunicaciones.
Configurando aplicaciones para usar el Proxy
El Proxy creado en los pasos anteriores debe trabajar hasta que se
cierre el programa SSH. Sin embargo, si se interrumpe la conexión al
servidor, se necesitará repetir los mismos pasos para reactivar el
Proxy.
Una vez que el Proxy esté ejecutándose, necesitamos configurar las aplicaciones para usarlo. Para ello veremos los pasos a continuación, el Proxy será un Proxy SOCKS localizado en localhost, puerto 1080 (también conocido como 127.0.0.1, puerto 1080). Debemos asegurarnos que las aplicaciones estén configuradas de forma que impida la fuga de DNS, lo que puede hacer menos efectivo a SSH en cuanto a protección de privacidad y evasión de censura.
Más opciones
Hasta el momento, todos estos comandos muestran una línea de comando
en la máquina remota desde la que podemos ejecutar los comandos. Algunas
veces podemos querer ejecutar un comando simple en una máquina remota,
que se devuelva después a nuestra línea de comandos en la maquina local.
Esto se puede lograr poniendo el comando que queremos ejecutar en la
máquina remota entre comillas simples.
$ ssh remoteusername@othermachine.domain.org 'mkdir /home/myname/newdir'
Algunas veces lo que necesitamos es ejecutar comandos que consumen mucho tiempo en una máquina remota, pero no estamos seguros de tener suficiente tiempo durante la sesión actual ssh. Si cerramos la conexión remota antes de que una ejecución de comandos se haya completado, ese comando será abortado. Para evitar perder nuestro trabajo, podemos empezar por la vía ssh una sesión screen remota y separarla y reconectarnos cada vez que queramos. Para separar una sesión remota, simplemente cerramos la conexión ssh: una sesión aparte se mantendrá ejecutándose en la máquina remota.
ssh
ofrece muchas más opciones, que se describen en la
página del manual. Podemos configurar nuestro sistema favorito para
permitir registrarnos o ejecutar comandos sin especificar nuestra
contraseña todo el tiempo. La instalación es complicada pero puede
ahorrarnos bastante interacción con el teclado; intentemos algunas
búsquedas web con "ssh-keygen", "ssh-add", y "authorized_keys".
scp: copia de ficheros
El protocolo SSH se extiende más allá del comando ssh. Un comando
particularmente útil basado en el protocolo SSH es scp (secure copy
command). El siguiente ejemplo copia ficheros del directorio actual de
nuestra máquina local al directorio /home/me/stuff en una máquina
remota.
$ scp myprog.py me@othermachine.domain.org:/home/me/stuff
Debemos tener en cuenta que el comando sobrescribirá cualquier fichero con el mismo nombre /home/me/stuff/myprog.py. (O tendremos un mensaje de error si hay un fichero con el mismo nombre y no tenemos privilegios para sobrescribirlo). Si /home/me es nuestro directorio, el directorio destino puede abreviarse.
$ scp myprog.py me@othermachine.domain.org:stuff
Podemos fácilmente copiar en la otra dirección: de la máquina remota a la local.
$ scp me@othermachine.domain.org:docs/interview.txt yesterday-interview.txt
El fichero en la máquina remota es interview.txt en el subdirectorio docs de nuestro directorio. El fichero será copiado en yesterday-interview.txt en nuestro directorio en el sistema local
scp
puede usarse para copiar un fichero de una máquina remota a otra.
$ scp user1@host1:file1 user2@host2:otherdir
Para copiar recursivamente todos los ficheros de un subdirectorio a un directorio, usamos la opción –r.
$ scp -r user1@host1:dir1 user2@host2:dir2
Podemos ver la página man de scp para más opciones.
rsync: Transferencias y copias de seguridad automáticas
rsync
es un comando muy útil que mantiene un directorio
remoto en sincronía con un directorio local. Se menciona aquí porque es
una forma muy útil de trabajo en red, como ssh, y porque el protocolo ssh es recomendado como transmisión fundamental para rsync.
El siguiente es un ejemplo simple y útil. Copia ficheros desde nuestro directorio local /home/myname/docs a un directorio llamado backup/ en nuestro directorio en el sistema quantum.example.edu. Rsync actualmente minimiza la cantidad de copias necesarias a través de varios chequeos sofisticados.
$ rsync -e ssh -a /home/myname/docs me@quantum.example.edu:backup/
La opción –e ssh es para usar el protocol SSH bajo la transmisión, como se recomienda. La opción –a (que significa “archivo”) copia cualquier cosa con el directorio especificado. Si deseamos eliminar los ficheros en el sistema local mientras se van copiando, incluimos la opción a –delete. Para más detalles podemos la página del manual acerca de rsync.
Haciéndonos la vida más fácil cuando usamos SSH con frecuencia
Si usamos SSH para conectarnos a muchos servidores diferentes, podemos a veces cometer errores escribiendo sus nombres y nuestro nombre de usuario (imaginemos si tenemos que recordar 20 combinaciones nombres de usuario/nombres de servidor). Afortunadamente, SSH ofrece un método simple para manejar la información de sesión a través de un fichero de configuración.
El fichero de configuración está oculto en nuestro directorio bajo el directorio .ssh (el path completo sería algo así /home/jsmith/.ssh/config – si el fichero no existe podemos crearlo).
Usamos nuestro editor favorito para abrir el fichero y especificamos los hosts así:
Host dev HostName example.com User fc
Podemos configurar múltiples hosts en nuestro fichero de configuración, y cuando lo salvemos nos conectamos al host que nombramos “dev” ejecutando el siguiente comando:
$ ssh dev
Es necesario recordar, que mientras más usemos estos comandos más tiempo ganamos.