Así puedes evadir portales cautivos y firewalls con dns2tcp

Así puedes evadir portales cautivos y firewalls con dns2tcp

Lorena Fernández

Normalmente las redes Wi-Fi públicas disponen de portales cautivos para autenticarnos, si no nos autenticamos frente a estos portales cautivos, no podremos acceder a Internet. Si estamos en un lugar público, cafetería, hotel, restaurante o cualquier otro lugar con conectividad Wi-Fi pública, es muy probable que existen los portales cautivos. Estos portales acostumbran a pedirte datos personales como nombre completo, correo electrónico, edad, entre otras cosas, dependiendo de a qué lugar pertenezca esa red. Si te saltas el portal cautivo, o cierras la ventana de autenticación, no podrás acceder a Internet, aunque tengas conectividad local. Hoy en RedesZone os vamos a enseñar la herramienta dns2tcp, la cual nos permitirá evadir este tipo de portales cautivos, y tener conexión a Internet ilimitada

Es bueno recordar que el protocolo DNS cumple la función de resolver los nombres de dominio que queramos. Esto es sumamente útil porque, si no existiese, en la barra de direcciones de nuestro navegador deberíamos escribir siempre las direcciones IP, y eso es prácticamente imposible de sostener. En esta guía, hablaremos específicamente de los túneles DNS que nos ayudarán a pasar por alto limitaciones de acceso como los firewalls y los portales cautivos.

Ahora bien, es posible poner en marcha este tipo de túneles debido a que el administrador de redes no ha realizado los ajustes de configuración apropiados para bloquearlo. Un método práctico para saber si podremos llevar a cabo el túnel DNS es ingresar a la línea de comandos y ejecutar lo siguiente:

nslookup www.google.com

Presiona «Enter» y te aparecerán datos como en la captura compartida. Si es así, puedes poner en marcha el túnel DNS. Lo primero que vamos a necesitar es una herramienta llamada dns2tcp, esta herramienta sirve para establecer conexiones DNS. Justamente, esto nos ayudará a pasar por alto cualquier portal cautivo que esté configurado en las redes públicas.

La condición principal para que la herramienta funcione correctamente, es que el puerto 53 UDP esté habilitado por el firewall, de lo contrario no funcionará y no podremos evadir el portal cautivo ni el firewall. A continuación, demostraremos el esquema de funcionamiento para entender mejor de qué manera se evita la barrera del portal cautivo:

  • Al iniciarse el cliente dns2tcp, se requiere del recurso seguro SSH a través del puerto 2222 mediante el protocolo de transporte TCP. Todo el tráfico TCP que se genera, se enmascara, y adquiere la forma de solicitudes DNS falsas.
  • Acto seguido, se abre un proxy SOCKS a través del puerto 1080.
  • Esas solicitudes DNS falsas pasan al servidor dns2tcp que se encarga de desenmascarlas, y logra enviarlas al destino original.
  • Cuando el destino responde la solicitud, esa respuesta pasa primero por el servidor dns2tcp para que sea encapsulada en una respuesta DNS falsa.
  • La respuesta enmascarada pasa al cliente dns2tcp que la desencapsula y la pasa finalmente al usuario

El final de este esquema es que dicho usuario puede acceder a los sitios web que quiera.

Puesta en marcha, instalación y configuración de Ubuntu en AWS

Si deseamos llevar esto a la práctica precisamos de un servidor que tenga instalada la herramienta dns2tcp y un dominio propio que deba apuntar a la IP pública del servidor (dns2tcp, también). Podemos valernos de un ordenador extra que tengamos, o utilizar recursos más funcionales y económicos como un Raspberry Pi. A este último, podríamos instalar la distribución de Linux que queramos, como Raspbian entre otras.

Sin embargo, el hecho de optar por hardware adicional representa un gasto extra. Entonces, podemos optar por alternativas gratuitas como Amazon Web Services. En este tutorial nos enfocaremos en la parte más importante de la creación del túnel DNS: el servidor en donde esté alojado dns2tcp. Si no tenemos esto, no hay forma de empezar.

Lo primero que debes hacer es ingresar al portal de AWS y crear una cuenta gratuita. Podrás acceder a múltiples soluciones por un año sin pagar suscripción. Un detalle importante, es que en uno de los pasos debes ingresar datos de tu tarjeta de crédito, pero no te preocupes, no se generan cargos. Después, entra a Mi cuenta y selecciona la opción Consola de administración de AWS.

Entre las múltiples opciones que verás, escogerás la primera que es EC2. No está demás decir que EC2 se maneja mediante instancias. Esas instancias son como contenedores en donde se alojan las máquinas virtuales que creamos. Pueden ser distintas versiones de Windows Server o servidores Linux. Si acaso te interesa saber más, sugerimos explorar la gran cantidad de opciones de virtualización.

Nos llevará al dashboard dedicado al servicio EC2 y nos dirigimos a Instances (Instancias).

Vamos al botón azul Launch Instance

Ahora tenemos a un asistente de creación para nuestra instancia. Esta es la instancia que contendrá a nuestro servidor virtualizado, que a su vez va a alojar a la herramienta dns2tcp.

Para este caso, escogeremos un Ubuntu Server y no nos preocuparemos tanto de la versión a usar. Ya que únicamente estamos probando. Después, hacemos clic en el botón azul Select.

Escogemos la opción que es elegible para el uso con el plan gratuito (el que contenga la etiqueta Free tier eligible).

Ya más adelante, aparecerán pasos a los que no necesitamos prestar atención por esta vez. Sin embargo, llegaremos al paso 6 (Security Groups) y agregaremos una nueva regla que permitirá la creación de los túneles DNS: el protocolo DNS (UDP)

Una vez que elegimos esa opción indicará automáticamente su número de puerto, que es el 53. En donde dice Source podemos indicar la opción Custom y al lado ponemos la IP 0.0.0.0/0. Después, haz clic en Review and Launch.

Te aparecerá un último paso de revisión y debes hacer clic en Launch. Como veremos más abajo, en realidad, este no es el último paso. Lo que haremos ahora es generar el par de claves (que consta de una clave pública y una clave privada) que nos permitirá conectarnos con seguridad a nuestra instancia que acabamos de crear.

En este paso debes seleccionar la opción Create a new key pair para que pueda proveernos de un nuevo par de claves. En donde dice Key pair name, indicamos el nombre del par que queremos. Recomendamos utilizar un nombre que podamos reconocer fácilmente el archivo cuando lo busquemos. Algo muy importante que indica allí es que el archivo se generará por una única vez, entonces conviene bastante el guardarlo en una locación del ordenador que sea seguro y que podamos recordarlo. Luego, hacemos clic en Download Key Pair para descargar el archivo y Launch Instances

Después de unos minutos, verificarás que el estado de la instancia recientemente creada estará listo como para lanzarla y por ende, tener acceso a nuestro servidor virtualizado. Lo que está destacado en rojo es lo que te avisará si puedes ya lanzar tu instancia. Si aparece de la forma tal cual está como la captura de ejemplo, ya puedes empezar. Debes seleccionar la instancia que has creado y hacer clic en el botón Connect.

Te aparecerá una ventana que te dará opciones para conectarte en tu instancia. En este caso, vamos a demostrar cómo conectarnos mediante un cliente SSH. Por eso, necesitaremos de un programa denominado PuTTY.

Instalar PuTTY en segundos

Para que podamos conectarnos a nuestro servidor Ubuntu que habíamos creado mediante la instancia en AWS, necesitaremos de este programa. Específicamente de dos, PuTTY y PuTTY Gen. Accede a este enlace y busca ambos programas, son bastante livianos y no requiere de demasiados pasos de instalación.

Ahora pasemos a PuTTY Gen, esta herramienta nos ayudará a convertir el archivo de par de claves (key pair) que habíamos descargado al terminar de crear nuestra instancia en AWS. Para tener un contexto del por qué lo hacemos es que PuTTY soporta archivos de par de claves en formato .ppk, una vez que hayamos hecho la conversión, este archivo nos ayudará a conectarnos por SSH a nuestro servidor Ubuntu virtual.

En Parameters, elegimos el algoritmo de cifrado RSA que se usa para SSH-2. No obstante, hoy en día es recomendable crear claves SSH con Ed25519 o con ECDSA ya que son las más seguras. Después, en Load, vamos a buscar el archivo .pem que habíamos creado antes en AWS.

Cuando queramos abrir el archivo, asegúrate de que sea posible visualizar todos los archivos y así evitar problemas para encontrarlo. Lo abres y en segundos, verás un aviso de que se ha importado con éxito:

Haces clic en Aceptar y luego harás clic en el botón Save private key ya que esta es la clave que te servirá para autenticarte y conectarte a tu servidor Ubuntu. Te aparecerá un aviso de advertencia, pero puedes hacer clic en sin aprieto, nombras el archivo como prefieras y lo guardas.

Cómo conectarnos a nuestro servidor virtualizado con PuTTY

Ahora, busquemos el programa PuTTY y tendremos una ventana como esta

Como hemos comentado, vamos a conectarnos mediante el protocolo SSH. Lo que debemos hacer para evitar hacer el siguiente paso una y otra vez es fijar nuestro archivo de clave privada generado con PuTTY Gen para que podamos conectarnos con éxito siempre que lo queramos.

Buscamos el apartado SSH que se encuentra en Category, luego a Auth y en donde dice Private key file for authentication subimos nuestro archivo .ppk que acabamos de convertir en PuTTY Gen. Volvemos a AWS y buscamos la instancia que acabamos de crear, la seleccionamos y hacemos clic en Connect. Aparece una vez más la ventana que hemos visto más arriba y copiamos la información que menciona el paso 4, que es nuestro DNS público.

Pasamos a PuTTY y en el apartado de Session, en el campo de Hostname ponemos lo siguiente:

nombredeusuario@DNSpublico

Como nosotros virtualizamos un servidor Ubuntu, en usuario escribimos simplemente ubuntu en minúscula seguido del y el DNS público que copiamos antes, sin espacios

ubuntu@dnspublico-ABC-123-dEf

Mantenemos el número de puerto 22, en Saved Sessions ponemos un nombre cualquiera para grabar nuestra conexión al servidor Ubuntu, hacemos clic en Save para grabarla y después, clic en Open.

Por ser la primera vez, te aparecerá una advertencia y deberás hacer clic en :

Y listo, espera unos segundos para que se inicie la conexión y veremos una ventana como esta. ¡Tenemos acceso a nuestro servidor Ubuntu virtualizado!

Una vez que ya tenemos la máquina virtual creada en AWS y tenemos conectividad vía SSH, ya solamente faltaría hacer uso de la propia herramienta dns2tcp.

Instalación y configuración de dns2tcp en Ubuntu

Lo primero que tendremos que hacer en nuestro servidor de Ubuntu, es instalar la herramienta dns2tcp:

sudo apt install dns2tcp

Una vez instalada, tanto en el cliente como en el servidor, tendremos que realizar unos pequeños ajustes.

Configuración y arrancar el servidor dns2tcp

Tendremos que realizar una breve configuración editando el fichero de configuración que se ubica en /etc/dns2tcp.conf y que contiene lo siguiente:

root@debian-vm:/home/bron# cat /etc/dns2tcpd.conf
listen = 127.0.0.1
port = 53
# If you change this value, also change the USER variable in /etc/default/dns2tcpd
user = nobody
chroot = /tmp
domain = your.domain.tld
resources = ssh:127.0.0.1:22 , smtp:127.0.0.1:25
root@debian-vm:/home/bron#

Tenemos que editarlo de la siguiente manera:


listen = 0.0.0.0
port = 53
# If you change this value, also change the USER variable in /etc/default/dns2tcpd
user = nobody
chroot = /tmp
domain = EL_DOMINIO_DE_AWS
key= redeszone
resources = ssh:127.0.0.1:22 , smtp:127.0.0.1:25
root@debian-vm:/home/bron#

El campo de «key» es opcional, pero es recomendable tener una autenticación para evitar que cualquiera pueda conectarse. Debemos ejecutarlo de la siguiente forma:

root@debian-vm:/home/bron# sudo dns2tcpd -F -d 3 -f /etc/dns2tcpd.conf
18:52:08 : Debug options.c:97 Add resource ssh:127.0.0.1 port 22
18:52:08 : Debug options.c:97 Add resource smtp:127.0.0.1 port 25
18:52:08 : Debug socket.c:55 Listening on 0.0.0.0:53 for domain your.domain.tld
Starting Server v0.5.2...
18:52:08 : Debug main.c:132 Chroot to /tmp
16:52:08 : Debug main.c:142 Change to user nobody

Una vez hecho esto, ya solo nos quedaría conectarnos con nuestro cliente.

Configuración del cliente para conectarnos vía dns2tcp

Lo más sencillo para realizar la conexión es ejecutar una línea de comandos que tenga todo lo necesario, a continuación, podéis ver en detalle cuál es para conectarnos y crear automáticamente el socket para SSH en el puerto 2222.

dns2tcpc -z EL_DOMINIO_DE_AWS -k redeszone -r ssh -l 2222

Ahora, podremos realizar la conexión con SSH de la siguiente forma y la comunicación estará cifrada y autenticada:

ssh bron@127.0.0.1 -p 2222 -D 8080

Por último, tendremos que configurar el PROXY SOCKS en nuestro navegador, por ejemplo, en Firefox quedaría de la siguiente forma:

De esta forma, podrás saltarte portales cautivos y es posible que también firewalls, siempre que no tengan bloqueos específicos que impidan realizar esta técnica.