A veces necesitamos acceder a alguno de nuestros servidores para realizar tareas de mantenimiento y no podemos usar SSH en el puerto estándar 22 debido a que estamos dentro de una red corporativa detrás de un firewall restrictivo. En este caso es posible crear un túnel SSH a través de un servidor proxy HTTP. Dependiendo del nivel de seguridad del firewall se podrá acceder por SSH por cualquier puerto o sólo por el puerto 443 (HTTPS).

¿Por qué funciona ésto? Simple. Debido a que las conexiones SSL son encriptadas (para evitar ataques man-in-the-middle entre el cliente y servidor), los servidores proxy HTTP no pueden examinar el contenido de las mismas ni mucho menos modificar los pedidos. En este sentido SSL considera cualquier proxy como un middleman, entonces para que SSL funcione dentro de nuestra organización (permitir acceso a sitios seguros con HTTPS) es necesario configurar el puerto 443 como confiable en el firewall de la intranet (no filtrar la salida hacia Internet por este puerto).

Sin embargo (y es la regla general) es posible filtrar el puerto 443 en el firewall para que sólo se permita la salida por el puerto 443 para las conexiones iniciadas por el proxy. En este sentido, cuando se inicia una sesión SSL, el proxy inicia la sesión TCP para el cliente y servidor y luego establece un túnel directo entre ambos. Simplemente reenvía los paquetes (funciona como un router para las conexiones HTTPS) pues no es capaz de interpretar su contenido (aunque muchos proxies HTTP trabajan a  nivel de protocolo y tienen la capacidad de entender los encabezados, esto permite al administrador del firewall utilizar esta información para filtrar y/o monitorear el tráfico).

Manos a la obra

Supongamos que estamos dentro de una red corporativa donde se permite sólo tráfico saliente por el puerto 443 para las conexiones iniciadas por el servidor proxy HTTP. En este caso lo único que se necesita es tener algún servidor que permita conexiones SSH por el puerto 443. Para esto (obviamente no es posible en un servidor Web con HTTPS) se debe agregar la siguiente línea en la configuración de SSH del servidor al que se desea conectar:

# nano /etc/ssh/sshd_config
Port 443

Es posible permitir que SSH escuche en varios puertos repitiendo la línea anterior. Luego se debe reiniciar el servicio sshd para que tome los cambios:

service sshd restart

Para realizar el túnel SSH a través del proxy HTTP se debe utilizar la herramienta "corkscrew" (descargar). La ventaja de esta herramienta es que no necesita un componente en el servidor y funciona en la mayoría de las plataformas UNIX, incluso Cygwin en Windows.

[pepe@box ~]$ wget http://www.agroman.net/corkscrew/corkscrew-2.0.tar.gz
[pepe@box ~]$ tar -xvf corkscrew-2.0.tar.gz
[pepe@box ~]$ cd corkscrew-2.0
[pepe@box ~]$ ./configure
[pepe@box ~]$ make
[pepe@box ~]$ sudo make install

Suponiendo que la instalación procede de forma exitosa, se debe modificar la configuración de SSH. Editar el archivo $HOME/.ssh/config (o crear en caso que no exista):

[pepe@box ~]$ touch .ssh/config
[pepe@box ~]$ chmod 644 .ssh/config
[pepe@box ~]$ nano .ssh/config

Se debe agregar:

Host *
ProxyCommand corkscrew proxy.dominio.com 8080 %h %p

Reemplazar "proxy.dominio.com" y "8080" por la dirección y puerto del proxy respectivamente. Este ejemplo utiliza *, lo cual fuerza el uso del túnel para todos los hosts, pero es posible filtrar utilizando expresiones regulares (ver el manual de SSH: "man ssh_config").

A continuación se puede probar la conexión:

[pepe@box ~]$ ssh -p 443 pepe@servidor.dominio.com
The authenticity of host '[servidor.cominio.com]:443 (<no hostip for proxy command>)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[servidor.cominio.com]:443' (RSA) to the list of known hosts.
pepe@servidor.cominio.com's password:
Last login: Mon Aug 13 22:09:55 2012 from xxx.xxx.xxx.xxx
[pepe@servidor ~]$

Voilà


Tal vez pueda interesarte


Compartí este artículo