SSH, Port Forwarding y Tunneling: Saltarse las restricciones del firewall

En mi nuevo lugar de trabajo, misteriosamente está bloqueado por el firewall, entre otras cosas, la salida al puerto 25 de cualquier servidor. Desde mi portatil uso el cliente de correo Thunderbird conectandose a distintas cuentas  de correo que tengo alojadas en Google Apps asi que no podía quedarme sin revisar mis cuentas de correo, por lo que tuve que buscar la forma de hacerlo.
Lo primero que se me vino a la cabeza es hacer un port forwarding con ssh usando un servidor externo, sabiendo que tengo el puerto 22 desbloqueado para salir. Entonces, accedería a cualquier servicio corriendo en el puerto 25 mediante un redireccionamiento a traves del puerto 22. Con esta técnica podemos saltarons el firewall y todas las restricciones.

El port forwarding, según el mismo manual de ssh, corresponde a:

Specifies that the given port on the local (client) host is to be
forwarded to the given host and port on the remote side. This
works by allocating a socket to listen to port on the local side,
optionally bound to the specified bind_address. Whenever a con-
nection is made to this port, the connection is forwarded over
the secure channel, and a connection is made to host port
hostport from the remote machine. Port forwardings can also be
specified in the configuration file. IPv6 addresses can be spec-
ified with an alternative syntax:
[bind_address/]port/host/hostport or by enclosing the address in
square brackets. Only the superuser can forward privileged
ports. By default, the local port is bound in accordance with
the GatewayPorts setting. However, an explicit bind_address may
be used to bind the connection to a specific address. The
bind_address of “localhost” indicates that the listening port
be bound for local use only, while an empty address or ‘*’ indi-
cates that the port should be available from all interfaces.

En simples palabras, lo que se hace, es habilitar un puerto local, por el cual se hara un redireccionamiento, a traves de ssh y el servidor remoto, hacia nuestro destino.

Paso a paso

Mapear la dirección de destino a nuestor localhost, en mi caso (y como ejemplo) usaré smtp.gmail.com. Debemos editar el /etc/hosts y agregar a la línea de 127.0.0.1 nuestro destino:
127.0.0.1 localhost.localdomain localhost smtp.gmail.com
Verificamos:
$ ping -c1 smtp.gmail.com
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.038 ms

Ahora, para nuestro sistema, el host smtp.gmail.com está apuntando a nuestra misma máquina.

Ahora, hacemos el port forwading usando el parámetro -L de la siguiente forma:
# ssh -L25:smtp.gmail.com:25 zerial@mydomain.org

Una véz logeados, ya va a estar hecho el redireccionamiento de puerto. Lo que hacemos con esa linea es decirle que todo el trafico desde localhost:25 lo lleve a traves de mydomain.org:22 a nuestro destino smtp.gmail.com:25.

Ahora realizamos la prueba, para ver si realmente tenemos salida a smtp.gmail.com:25:
$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mx.google.com ESMTP 42sm25383892vws.12

Listo. Obviamente, el Firewall no podrá bloquear el tráfico de localhost y tampoco el de ssh, ya que va cifrado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.