DNS Tunneling con Iodine

Tunel DNS con Iodine
Introducción
Aprovechando que tuve la necesidad de armarme un Tunnel DNS para pasar mi tráfico por ahí, voy a escribir un post sobre el tema.
DNS Tunneling es una técnica para transmitir datos usando queries y respuestas DNS.
El tráfico en red es visto absolutamente como tráfico de DNS (ya lo verán en unas capturas de Wireshark), por lo que esta técnica permite saltear firewalls, controles de ancho de banda (en algunos casos), entre otros.
Qué necesitamos?
Necesitamos solamente nuestra computadora, desde la cual queremos camuflar el tráfico, un servidor de salida, y en ambos instalar iodine.
Instalando Iodine
La instalación depende de la distribución linux ó sistema operativo que se use, en mi caso tengo un servidor con Debian, y mi workstation con Archlinux.
Instalación en Debian:
apt-get install iodine
Instalación en Archlinux:
pacman -Sy iodine
Iniciando el servicio
En el servidor debemos ejecutar:
iodined -c -f -P s3cr3tPassword 192.168.99.1 dns.para.camuflar.com
En el cliente, como root ejecutamos:
iodine -f -P s3cr3tPassword servidor dns.para.camuflar.com
Si todo sale bien, en unos pocos segundos eso nos creará una nueva interfaz de red (en mi caso dns0) con la cual nos podemos comunicar hacia el servidor, y todo el tráfico, tanto de entrada como salida, será enviado a través de paquetes de DNS especialmente armados para contener el tráfico.
La comunicación deberá hacerse a través de la IP configurada en iodined, en nuestro caso sería 192.168.99.1
Tunelear TODO el Tráfico de Red
Si bien la comunicación tuneleada hacia el servidor puede resultar útil, la parte más divertida de todo esto es poder sacar todo el trafico de red a través del tunel. Cómo hacemos eso?
Hay que configurar el servidor para que funcione como router y NATear la interfaz de red creada por iodined para poder hacer de gateway para nuestra computadora.
En el servidor ejecutamos:
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -A FORWARD -i dns0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -i dns0 -o eth0 -j ACCEPT
Deberán reemplazar los nombres de las interfaces de red por las que correspondan según su configuración del servidor.
Con esas lineas logramos que el server funcione como gateway, y todo el tráfico que ingrese por la interfaz dns0, la NATea y sale a internet vía eth0.
En nuestro workstation ejecutamos
ip route del default
ip route add default via 192.168.99.1 dev dns0
ip route add IP_DEL_SERVIDOR via NUESTRO_GATEWAY dev eth0
Con eso estamos indicando que todo el tráfico salga por el tunel (dns0), y que el tráfico hacia nuestro servidor (en donde corre iodined), salga por la interfaz comun de internet.
Corroborando con Wireshark que todo funcione
Una vez configurado todo, podemos usar wireshark para ver el tráfico que entra y sale en nuestra interfaz de red (la que provee internet).
Dejo una captura donde se puede ver como lo único que hay son paquetes DNS ;)
Como se puede ver, Wireshark no comprende los paquetes DNS, porque no son paquetes DNS, sino que es nuestro tráfico de salida camuflado en forma de DNS.
Have fun ;)
:wq!