Cifrando el tráfico DNS con DNSCrypt

DNSCrypt nos permite cifrar el tráfico entre el usuario y el servidor DNS. De esta manera, nos vamos a proteger de diferentes ataques, como Spoofing, Man in the Middle o Spying. Para hacer esto, bastará instalar y configurar el proxy DNSCrypt.

Además, vamos a utilizar dnsmasq. Es un paquete que nos permite instarlar de una manera sencilla, un servidor DNS y un servidor DHCP, sólo tenemos que instalar y arrancar el servicio dnsmasq. De esta manera, podremos mejorar el rendimiento de DNSCrypt, al utilizar la caché de dnsmasq. Podremos resolver los nombres que tengamos configurados en el /etc/hosts y, esta resolución, será, tanto en sentido directo, como inverso. También podremos tener el servicio de DHCP, añadiendo, simplemente, una línea al archivo de configuración de dnsmasq, indicando el rango de cesión.

Estas herramientas suelen estar incluidas en muchas distribuciones GNU/Linux. Su configuración es muy similar. En este caso, utilizaré ArchLinux.

Vamos a empezar por dnsmasq:

$ sudo pacman -S dnsmasq

 

Lo primero que tenemos que hacer es editar /etc/dnsmaq.conf y descomentar la linea #listen-address= , y agregamos la dirección IP de nuestro servidor. Si solo lo vamos a utilizar desde nuestro equipo (útil para la caché), la IP será la de localhost, 127.0.0.1. Si queremos que otros equipos de nuestra LAN puedan utilizarlo, pondremos la IP del equipo. 

listen-address=127.0.0.1

Ahora, necesitamos que la primera IP que se utilice para resolver los nombres, sea la de nuestro servidor. Para esto, deberemos configurar el cliente DHCP. Éste será quien genere el archivo /etc/resolv.conf, con los diferentes servidores que se utilizarán. Dependiendo del servicio que utilicemos para configurar la red, podremos utilizar varios métodos.

El método más rápido será generar nosotros mismos el /etc/resolv.conf. Tan sólo editamos el archivo, y ponemos, al principio:

nameserver 127.0.0.1

Tras esta línea, especificaremos los servidores DNS externos. Para que el servicio dhcpd no sobreescriba el /etc/resolv.conf, editamos el archivo /etc/dhcpcd.conf y añadimos la opción nohook resolv.conf.

# A hook script is provided to lookup the hostname if not set by the DHCP
# server, but it should not be run by default.
nohook lookup-hostname
noipv4ll
nohook resolv.conf

Otra opción, es utilizar una característica de dhcpd. Si existen los archivos  /etc/resolv.conf.head y /etc/resolv.conf.tail, los utiliza para generar la cabecera del /etc/resolv.conf. Bastará editar el /etc/resolv.conf.head y añadir ahí la línea nameserver (debe ser la primera).

Una limitación en los sistemas Linux, es que, en las consultas de DNS, sólo puede haber tres servidores, como máximo, en el /etc/resolv.conf. Esto podemos solucionarlo, creando un archivo con los servidores que necesitemos y pasándolo a dnsmasq. De esta manera, el /etc/resolv.conf, sólo contendrá un servidor, el nuestro. Primero, creamos el archivo /etc/resolv.dnsmasq.conf, con los servidores externos que necesitemos, por ejemplo, con las DNS de google:

nameserver 8.8.8.8
nameserver 8.8.4.4

En el archivo /etc/dnsmasq, buscamos la línea resolv-file, la descomentamos y añadimos el la ruta del archivo anterior:

# Change this line if you want dns to get its upstream servers from
# somewhere other that /etc/resolv.conf
resolv-file=/etc/resolv.dnsmasq.conf

Para dhclient, eliminamos en /etc/dhclient.conf, la siguiente línea:

prepend domain-name-servers 127.0.0.1;

Si estamos utilizando NetworkManager (es usado por defecto en multitud de distribuciones), podemos indicarle que levante el servicio dnsmasq y, además, añadir opciones de configuración. Para esto, editamos el archivo NetworkManager.con, que se encuentra en /etc/NetworkManager/ y, en la sección [principal], añadimos la opción:

dns = dnsmasq

Ojo, hay que asegurarse de que el servicio no se levanta automáticamente. En el caso de ArchLinux, como aún no lo hemos indicado, no lo hará.

Las opciones que deseemos añadir, las especificaremos creando archivos en el directorio /etc/NetworkManager/dnsmasq.d/ (si éste no existe, lo creamos). Por ejemplo, para aumentar la caché, creamos el archivo /etc/NetworkManager/dnsmasq.d/cache, con el siguiente contenido:

cache-size=1000

Bien, ya podemos utilizar dnsmasq. Para levantar el servicio, bastará ejecutar:

systemctl start dnsmasq.service

Y para que se inicie automáticamente en cada inicio del sistema:

systemctl enable dnsmasq.service

Una vez que ya tenemos dnsmasq, que nos va a servir como caché de DNS, vamos a instalar el DNSCrypt, que será quien nos cifre el tráfico, cuando realicemos las peticiones:

$ sudo pacman -Syu dnscrypt-proxy

El paquete viene preconfigurado para utilizar, como DNS externas, las OpenDNS. Si queremos utilizar otras, podemos ver el listado de alternativas aquí. Dado que viene configurado para escuchar en la IP 127.0.0.1, que es la misma que hemos utilizado para dnsmasq, deberemos cambiarla. Todo esto, se pude configurar editando el archivo /etc/conf.d/dnscrypt-proxy. Lo dejaríamos así:

NSCRYPT_LOCALIP=127.0.0.2
DNSCRYPT_LOCALPORT=53
DNSCRYPT_USER=dnsmasq
DNSCRYPT_PROVIDER_NAME=2.dnscrypt-cert.opendns.com
DNSCRYPT_PROVIDER_KEY=B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79
DNSCRYPT_RESOLVERIP=208.67.220.220
DNSCRYPT_RESOLVERPORT=443

El usuario dnsmasq se crea automáticamente al instalar dnsmasq, para que este servicio se ejecute con un usuario sin privilegios, por seguridad. Podemos utilizarlo aquí también.

Una vez hecho esto, hay que asegurarse que dnsmasq no consulta a otros servidores externos. Esto quiere decir que, si hemos utilizado el método de editar directamente /etc/resolv, sólo deberán aparecer los servidores DNS internos. En nuestro caso, sólo la IP 127.0.0.1.

En el el archivo /etc/resolv.dnsmasq.conf, deberá aparecer sólo la IP de DNSCrypt, 127.0.0.2. Éste será el encargado de resolver las consultas externas, por lo que, no debemos añadir ningún servidor más.

Además de esto, debemos descomentar, en /etc/dnsmasq.conf, la línea:

bind-interfaces

Si utilizamos algún método diferente para configurar la red, debemos asegurarnos que el servidor de DNS apunte a 127.0.0.1. De esta manera, las peticiones pasarán primero por dnsmasq. Aquellas consultas que sea necesario realizar a un servidor externo, se harán mediante DNSCrypt. Podríamos utilizar DNSCrypt directamente pero, entonces, no tendríamos una caché, con lo que, la navegación sería más lenta.

Habilitamos los dos servicios para que se arranquen en el inicio (en el caso de NetworkManager, ya vimos que no es necesario levantar dnsmasq) y los iniciamos:

sudo systemctl enable dnscrypt-proxy.service dnsmasq.service
sudo systemctl start dnscrypt-proxy.service dnsmasq.service

Una consecuencia indirecta de utilizar DNSCrypt es que, si nuestro ISP ha bloqueado alguna dirección, podremos «saltarnos» esta restricción, siempre que OpenDNS o los servidores alternativos utilizados, no la tengan bloqueada.

¡Espero que os haya gustado! 😉

Un saludo!!