Chownat: conexiones directas entre PCs detrás de NAT

Chownat es un fantástico script perl que permite que dos ordenadores que se encuentre en redes locales diferentes y accedan a internet a través de un servidor que hace NAT con firewall puedan conectarse directamente sin tener que redirigir puertos. Es decir, si tenemos una configuración:

Ordenador A -> Servidor LAN NAT1 -> Internet < - Servidor LAN NAT2 <- Ordenador B De forma directa, el ordenador A no podria establecer una conexión a un puerto del ordenador B ya que el Servidor NAT2 no permitiria ese tráfico, básicamente pq si la red local está compuesta por varios ordenadores no sabria a quien dirigir dicho paquete a no ser que tenga definida una regla explicita. La solución habitual es precisamente definir estas reglas, pero no siempre tenemos el control del servidor de salida de nuestra red.
Chownat aprovecha las características de NAT para hacer posible una conexión directa desde el ordenador A a un puerto del ordenador B sin tener que cambiar la configuración de los servidores.

Supongamos que el Ordenador B tiene un servidor web en el puerto 80 y queremos acceder desde el ordenador A. En el ordenador B vamos a ejecutar:

./chownat.pl -d -s 80 ip_publica_servidor_nat1

Esto hará que nuestro ordenador empiece a enviar paquetes UDP al servidor NAT1 al puerto 2222, por supuesto el servidor lo que hará será descartar automáticamente dicho tráfico ya que no sabrá a quien va dirigido. Sin embargo, el servidor NAT2 observará que se está enviando desde el ordenador B trafico a la ip del servidor NAT1 (puerto 2222) y por tanto se “anotará” que si recibe algo procedente de ahí lo redirija a nuestro ordenador B (así es como funciona el NAT habitualmente, un servidor NAT ve como establecemos una conexión a una determinada IP/puerto y nos redirigirá la respuesta automáticamente).

Seguidamente en el ordenador A ejecutaremos:

./chownat.pl -d -c 8000 ip_publica_servidor_nat2

Esto hará 2 cosas:

1) Empezará a enviar paquetes UDP al servidor nat2 puerto 2222, este servidor aceptará estos paquetes y creerá que se trata de respuestas a la información enviada previamente por el ordenador B, por tanto redireccionará automáticamente el tráfico a dicho ordenador. A la misma vez, el servidor nat1 observá que estamos enviando tráfico al servidor nat2 por el puerto 2222 y automáticamente nos redireccionará todo aquello que llegue de allí. Os recuerdo que los scripts envian de forma constante estos paquetes, por tanto en este punto ya seremos capaces de llegar de extremo a extremo.

2) Se abre el puerto 8000 en la máquina local (ordenador A) y se establece un tunel entre dicho puerto y el puerto 80 remoto de forma que realmente nuestro tráfico viajará por la conexión UDP que hemos establecido anteriormente al puerto 2222.

Ahora ya podemos acceder al servidor web del ordenador B abriendo un navegador en nuestro ordenador A y apuntando a “http://localhost:8000”.

Personalmente lo he probado simplemente con netcat entre 1 ordenador detrás de NAT y otro con conexión directa. En el que estaba detrás de NAT he ejecutado:

nc -l -p 80

De forma que netcat escucha por el puerto 80. Y en el otro ordenador, después de utilizar chownat tal y como he explicado me he conectado a dicho puerto mediante:

telnet localhost 8000

Y la conexión se ha establecido sin problemas (podia escribir texto en ambas terminales y se transmitia al otro extremo). Absolutamente fascitante ya que no he tenido que modificar nada del servidor que hace NAT ni de la configuración del firewall, lo que me hace pensar también que esto se podria utilizar como herramienta de ataque en redes privadas así que habrá que ir con cuidado 😉

Leave a Reply

Your email address will not be published. Required fields are marked *