Redirección de puertos

La redirección de puertos, a veces llamado tunelado de puertos, es la acción de redirigir un puerto de red de un nodo de red a otro. Esta técnica puede permitir que un usuario externo tenga acceso a un puerto en una dirección IP privada (dentro de una LAN) desde el exterior vía un router con NAT activado.

La redirección de puertos permite que computadoras remotas (por ejemplo, máquinas públicas en Internet) se conecten a un computador en concreto dentro de una LAN privada.

Por ejemplo:
 la redirección del puerto 8000 en el router a la máquina de otro usuario permite streaming SHOUTcast
 la redirección de los puertos 5000 a 6000 a la máquina de un usuario permite el uso de Unreal Tournament

Las máquinas con Linux modernos consiguen esto añadiendo reglas de iptables a la tabla nat: con el destino DNAT a la cadena de PREROUTING o con el destino SNAT en la cadena de POSTROUTING.

Las máquinas BSD y Mac OS X usan una herramienta similar llamada ipfw. La herramienta ipfw corre probablemente como una parte ya integrada del núcleo del sistema operativo.

Tipos de redirección de puertos 

Forwarding de Conexiones SSH

SSH permite redirigir muchos tipos de información desde un punto hacia otro de forma segura utilizando un canal cifrado (como todas las comunicaciones con SSH) este mecanismo también es conocido como port-forwarding y permite a clientes y servidores SSH abrir puertos para enrutar el tráfico hacia un algún destino en la red.

Este mecanismo es utilizado con frecuencia para evadir restricciones de firewall y filtros establecidos en la red, de esta manera es posible recibir y enviar paquetes desde destinos que no se encuentran permitidos por firewalls o proxies de manera explícita. En general, la analogía del “enrutador de llamadas” en una línea telefónica clásica puede ser un ejemplo perfecto de este mecanismo, donde una conexión de entrada es recibida por un intermediario que lo único que hace es enviar la llamada a su correspondiente destino, esto es justo lo que hace un túnel SSH (port-forwarding). Ahora bien existen 3 tipos de túneles distintos estos son: Local, Remoto y Dinámico, La diferencia entre estos tipos de túneles radica principalmente en la dirección de la comunicación.

Redirección local de puertos 

Consiste en la conexión de la máquina local a una máquina remota en un puerto determinado. Con SSH se puede crear un túnel local con la opción “-L” por ejemplo:

 > ssh -L 8080:www.debian.org:80     root @ 192.168.1.34

El comando anterior establece una conexión con el host 192.168.1.34 y una vez se han ingresado las credenciales de acceso válidas, se establece el túnel local en el puerto 8080 (este puerto se abre en la máquina del cliente que ha intentado establecer la conexión). Cuando se realice una petición sobre el puerto 8080 en dicha máquina, esta será redireccionada al sitio establecido (www.debian.org).

Por otro lado, la opción “-L” puede declararse varias veces en el mismo comando, por ejemplo:

 > ssh -L 8080:www.debian.org:80 -L 8081:www.fsf.org:80        root @ 192.168.1.34

Este caso es exactamente igual al anterior, la única diferencia es que se abren dos puertos (8080 y 8081) en la máquina local del cliente SSH, cada uno de estos puertos ejecutará una acción de “redirección” a la correspondiente ruta declarada.

Redirección remota de puertos 

Siguiendo la misma lógica de los túneles locales, los túneles remotos establecen un puerto de escucha para que redirija una petición concreta, sin embargo el sentido de la conexión es lo que cambia con respecto a los túneles locales, es decir, con los túneles locales se abre un puerto local que apunta a una dirección concreta, sin embargo, con un túnel remoto, se abre un puerto en la máquina SERVIDORA (servicio SSH) y posteriormente este apunta a una dirección concreta (como puede apreciarse, justo en el sentido contrario que los túneles locales). Este mecanismo puede ser utilizado por atacantes que han logrado comprometer un servicio SSH y que desean tener un túnel inverso hacia su propia máquina para acceder a la red interna de una organización, también es frecuente que se utilice con la única finalidad de realizar un bypass de restricciones de proxies y firewalls. Para crear un túnel remoto (o inverso) se utiliza la opción “-R” del siguiente modo:

 > ssh -R 8080:www.debian.org:80     root @ 192.168.1.34

De este modo cuando se establezca la conexión con el servidor se abrirá el puerto 8080 en el servidor SSH (en este ejemplo en 192.168.1.34) Ahora cuando se realice una petición a la máquina 192.168.1.34, en el puerto declarado en la ejecución del comando (8080) este realizará la acción de redirección de la conexión hacia el destino especificado (www.debian.org.80).

Sin embargo lo más común es que se desee establecer como destino de la conexión, la máquina del cliente (o atacante) que a su vez puede tener un servidor SSH listo para recibir conexiones:

 > ssh -R 8080:192.168.1.33:22 root @ 192.168.1.34

En este caso la máquina del cliente/atacante (192.168.1.33) será la que reciba la conexión desde el servidor SSH (192.168.1.34) una vez se intente realizar una conexión contra el puerto 8080 en la máquina 192.168.1.34.

Por otro lado, del mismo modo que ocurre con los túneles locales, en el caso de los túneles remotos también se pueden establecer uno o varios túneles con la opción “-R” por ejemplo:

 > ssh -R 8082:192.168.1.33:22 -R *9090:192.168.1.35:22    root @ 192.168.1.34

En el caso anterior se han definido dos declaraciones de redirección de puertos, la primera abre un puerto en el servidor (8082) que permite redirigir las conexiones entrantes por dicho puerto, hacia el puerto 22 de la máquina 192.168.1.33. La segunda especificación indica que las conexiones entrantes por el puerto 9090 (que provienen de cualquier sitio, para esto esta el “*”) serán redireccionadas a la máquina 192.168.1.35, ambas máquinas en este caso pueden estar siendo controladas por el atacante.

Redirección dinámica de puertos 

Un túnel dinámico permite convertir al servidor SSH en un servidor proxy SOCKS el cual es un protocolo ampliamente utilizado para programas que soliciten cualquier conexión a internet por medio de un servidor proxy, de esta forma cualquier programa puede utilizar este puerto para establecer cualquier tipo de conexión de forma segura por medio del servidor SSH (cualquier programa como por ejemplo un navegador web). Este tipo de túnel es muy similar a un túnel remoto, sin embargo, su principal diferencia radica en que cuando se establece una conexión en el puerto donde se encuentra establecido el servidor proxy, este no redirige a una ruta específica (dirección estática como en el caso de los túneles remotos donde dicha ruta se indica en la ejecución del comando), en lugar de esto, el puerto que se encuentra en estado de escucha en el servidor SSH, redirigirá a una dirección dinámica que el cliente solicita (como una dirección solicitada desde un navegador web) esta es, a efectos prácticos, la principal diferencia entre un túnel remoto y un túnel dinámico, como se puede apreciar, en un túnel remoto la relación entre puerto y dirección a enrutar es de uno a uno, mientras que en un túnel dinámico dicha relación es de uno a muchos.

Para establecer un túnel dinámico, se utiliza la opción “-D” por ejemplo:

 > ssh -D 8090 -C           root @ 192.168.1.34

De esta manera se ha establecido como puerto dinámico el 8090, de este modo cuando un programa utilice este puerto para establecer una conexión con un sitio externo, el servidor SSH redirigirá la petición a dicho sitio por medio de un canal cifrado. Por otro lado, la opción “-C” permite comprimir los datos que se envían por medio del canal SSH, esta opción permitirá acelerar el tráfico de los datos cuando dichos datos son basados en texto, como por ejemplo HTML (navegación web) sin embargo puede presenciar retardos cuando se trata de contenido binario, como por ejemplo la descarga de ficheros.

Finalmente, es posible mezclar estos tipos de túneles en una misma ejecución del comando, permitiendo de esta forma, tener combinaciones tales como túneles remotos y dinámicos en la misma conexión al servidor SSH, por ejemplo:

 > ssh -R 8082:192.168.1.33:22 -R 9090:192.168.1.35:22 -D 9191 root @ 192.168.1.34

En esta entrada se han establecido algunas bases de los conceptos avanzados de SSH, en próximas entradas, el objetivo será intentar profundizar un poco más en el entendimiento y posterior práctica de este protocolo utilizando algunas técnicas de hacking que involucran este servicio.

Advertencias sobre redirección de puertos 

Algunas advertencias sobre la redirección de puertos incluyen:
 la necesidad de redirigir los paquetes que vienen al puerto redirigido del router así como la necesidad de reescribirlos para que la máquina hacia la que el puerto está redirigido pueda responder a la dirección de origen, que a su vez lleva a,
 la incapacidad de la máquina (privada) de destino para ver el emisor real de los paquetes redirigidos, y en su lugar verlos como si originasen del router.

Véase también 
 Secure Shell

 Conmutación de paquetes
 Túnel (informática)

Enlaces externos 
 www.yougetsignal.com;
 www.canyouseeme.org, informa si los puertos de una computadora están redirigidos adecuadamente (incluso puertos por debajo del 1024);
 www.sanafapech.net, ejemplo de redirección de puertos usando SSH para acceder a un MySQL en una IP privada;
 Open.Nat, librería de clases .NET para redirección de puertos en dispositivos NAT con UPNP and PMP.

Redes informáticas