DNS seguro, privado y anónimo con DNSCrypt

El DNS (Domain Name System) es el sistema que traduce nombres de dominio a direcciones IP. Cada vez que un cliente accede a un servicio a través de su nombre de dominio, realiza una petición a un servidor DNS que traduce el nombre de dominio y permite que el usuario redirija la conexión a la dirección del servidor.

Generalmente, sobretodo en redes domésticas, dada la configuración por defecto de la mayoría de routers y APs ofrecidos por las compañías de internet, el usuario usa los servidores DNS propios del proveedor asignados a su zona. Esto significa que el ISP es capaz de registrar los sitios que visita el usuario, tanto si están cifrados como si no. Además, partiendo de que es fácil para un servidor determinar qué servidores DNS está usando un cliente, un adversario podría determinar en qué zona aproximada se encuentra la víctima y saber de qué proveedor de internet procede su conexión, independientemente de si el usuario está enmascarando o no su dirección IP pública.

Aunque existen proveedores que prometen políticas de cero registros, no es óptimo confiar en un tercero cuando la privacidad depende de ello. Es por eso que existen protocolos que aseguran por diseño la privacidad de las consultas DNS. En este apartado mostraré cómo usar y configurar un cliente DNSCrypt para realizar consultas DNS de forma privada y anónima.

Instalación

Descarga la versión de DNSCrypt acorde a la arquitectura de tu equipo. Encontrarás la lista en la página de GitHub del proyecto.

Descomprime el archivo en /opt/dnscrypt:

$ sudo mkdir -p /opt/dnscrypt
$ sudo tar -xvf dnscrypt*.tar.gz -C /opt/dnscrypt

Comprueba que no hayan servicios escuchando en el puerto 53:

$ sudo ss -lp 'sport = :domain'

Si se da el caso, desinstala o deshabilita permanentemente el servicio. Si usas systemd, detén y deshabilita el servicio systemd-resolved:

$ systemctl stop systemd-resolved
$ systemctl disable systemd-resolved

Asegúrate de que ya no hay nada escuchando en el puerto 53:

$ sudo ss -lp 'sport = :domain'

Entra en el directorio donde se ha guardado DNSCrypt y habilita el archivo de configuración:

$ sudo cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml

Prueba el funcionamiento del binario:

$ sudo ./dnscrypt-proxy

Si no hay errores, puedes continuar.

Desinstala resolvconf:

$ sudo apt-get remove resolvconf

Elimina /etc/resolv.conf:

$ sudo rm -f /etc/resolv.conf

Crea un nuevo archivo en /etc/resolv.conf con el siguiente contenido:

nameserver 127.0.0.1
options edns0

Bloquea la escritura del archivo:

$ sudo chattr +i /etc/resolv.conf

Comprueba que DNSCrypt resuelve correctamente:

$ sudo ./dnscrypt-proxy -resolve example.com

Si todo está en orden, instala el servicio:

$ sudo ./dnscrypt-proxy -service install
$ systemctl enable dnscrypt-proxy

Configuración

Puedes configurar DNSCrypt para elegir a qué servidores conectarte. Este enlace lista los servidores públicos de DNSCrypt organizados por protocolo y política de registros. Añade (o descomenta) la lista con los servidores deseados en el archivo de configuración usando el siguiente formato:

server_names = ['nombre-servidor-1'], ['nombre-servidor-2'], ['nombre-servidor-3']

DNS anónimo

Es posible enrutar todas las peticiones a los servidores públicos a través de un proxy de Tor usando la opción proxy y forzando el uso de TCP:

proxy = 'socks5://127.0.0.1:9050'
force_tcp = true

Sin embargo, esto es lento y poco confiable, por lo que DNSCrypt ofrece su propio sistema de DNS anonimizado.

En el DNS anonimizado, el cliente encripta la consulta y la envía a un relé en lugar de llegar directamente al servidor final. El relé no conoce la clave secreta y solo puede reenviar la consulta al resolutor de DNS, que es el único servidor capaz de desencriptarla. El resolutor de DNS solo conoce la dirección IP del relé, lo que hace imposible asociar las consultas a los clientes reales.

El archivo de configuración incluye la sección [anonymized_dns], donde se describe cómo alcanzar un servidor a través de un relé.

[anonymized_dns]
routes = [
{ server_name='nombre,servidor-1', via=['rele-anonimo-1', 'rele-anonimo-2'] },
{ server_name='nombre,servidor-2', via=['rele-anonimo-3', 'rele-anonimo-4'] },
{ server_name='nombre,servidor-3', via=['rele-anonimo-1', 'rele-anonimo-2'] }
]

Aquí están listados los relés para el DNS anonimizado.

Aprende más sobre DNSCrypt en dnscrypt.info/doc.