Cifrar el tráfico de DNS en Debian 9 Stretch (actualización 2017)

Posted on sáb 03 junio 2017 in Tutorial de Linux • 3 min read

En el año 2012 preocupado por la lentitud y seguridad en las comunicaciones de las consultas de DNS escribí un artículo sobre DNSCrypt.

Este artículo se basa en el artículo Comprobar que DNSCrypt funciona correctamente y cifra el tráfico .

Para esa época la instalación se hacía bajando un archivo .deb, pero en Debian Stretch ya viene incorporado en los repositorios, así que para instalar es con un simple apt-get.

apt-get install dnscrypt-proxy dnscrypt-proxy-plugins

Revisar que DNSCrypt esté activo:

# systemctl status dnscrypt-proxy.socket
 dnscrypt-proxy.socket - dnscrypt-proxy listening socket
   Loaded: loaded (/lib/systemd/system/dnscrypt-proxy.socket; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-06-03 00:26:02 -04; 18h ago
     Docs: man:dnscrypt-proxy(8)
   Listen: 127.0.2.1:53 (Stream)
           127.0.2.1:53 (Datagram)

jun 03 00:26:02 grievous systemd[1]: Listening on dnscrypt-proxy listening socket.

Como se ve DNSCrypt está activo, para el caso de que no esté activo se ejecuta:

# systemctl start dnscrypt-proxy.socket

Para que DNSCrypt se ejecute automáticamente se ejecuta:

# systemctl enable dnscrypt-proxy.socket

La lista de servidores DNSCrypt lo pueden ver en /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv . En la siguiente imagen se muestra algo del contenido del archivo:

Ahora se consulta el puerto y la IP que está usando DNSCrypt:

# cat /etc/systemd/system/sockets.target.wants/dnscrypt-proxy.socket
[Unit]
Description=dnscrypt-proxy listening socket
Documentation=man:dnscrypt-proxy(8)
Wants=dnscrypt-proxy-resolvconf.service

[Socket]
ListenStream=127.0.2.1:53
ListenDatagram=127.0.2.1:53

[Install]

WantedBy=sockets.target

La dirección IP que está usando DNSCrypt es la 127.0.2.1 y el puerto 53.

Este archivo se modifica si se está usano SystemD, para el caso de usar init.d se modifica el archivo que se describe a continuación.

Se edita el archivo /etc/dnscrypt-proxy/dnscrypt-proxy.conf :

vim /etc/dnscrypt-proxy/dnscrypt-proxy.conf

# cat dnscrypt-proxy.conf 
# A more comprehensive example config can be found in
# /usr/share/doc/dnscrypt-proxy/examples/dnscrypt-proxy.conf

ResolverName random
Daemonize yes

# LocalAddress only applies to users of the init script. systemd users must
# change the dnscrypt-proxy.socket file.
LocalAddress 127.0.2.1:53

Con la opción random garantiza que se use cualquier servidor de DNSCrypt de la lista ya mencionada.

Al levantar el servicio de DNSCrypt este cambia la configuración de /etc/resolv.conf para que use la IP 127.0.2.1, a continuación se muestra el contenido del archivo

# cat /etc/resolv.conf

# Generated by resolvconf
nameserver 127.0.2.1

Al iniciar el servicio se puede revisar el log de syslog para ver si funciona el servicio:

Como se puede ver en el syslog, al inicio el servicio espera por un certificado digital y luego es que empieza a funcionar.

Al consultar con el comando host se tiene:

host www.google.com
www.google.com has address 216.58.209.68
www.google.com has IPv6 address 2a00:1450:401b:801::2004

Ahora se instalarán unas herramientas de consultas:

apt-get install dnsutils 

Se realiza una consulta con el comando dig:

dig www.google.com

; <<>> DiG 9.10.3-P4-Debian <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6930
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com.   IN A

;; ANSWER SECTION:
www.google.com.  7 IN A 216.58.209.68

;; Query time: 266 msec
;; SERVER: 127.0.2.1#53(127.0.2.1)
;; WHEN: Sat Jun 03 20:26:08 -04 2017
;; MSG SIZE  rcvd: 59

Para verificar el funcionamiento del cifrado en DNSCrypt se usará wireshark-gtk, primero se instala y luego se ejecuta:

#apt-get install wireshark wireshark-gtk

Para averiguar la IP del servidor DNSCrypt que se está usando se usa dnsleaktest, al abrir la página muestra que la IP del equipo se encuentra en Barquisimeto, Venezuela y la IP es 186.185.180.136.

Se le da click a standard test:

La IP del servidor es 81.2.237.32.

Se inicia wireshark capturando paquetes de la interface wlp1s0 que es ahora como se llama wlan0 en Debian Strech. Se inicia la captura de paquetes y se filtra ip.addr == 81.2.237.32. El resultado se muestra a continuación:

El protocolo que se usa en la comunicación es QUIC el cual es un experimental que cifra la comunicación. Se selecciona el primer paquete y con el botón derecho se le da clic a follow udp steam obteniendo lo que se muestra en la siguiente figura:

Al ejecutar esa acción se realiza la construcción de los diferentes paquetes en este caso de UDP en formato crudo, como se puede ver la comunicación no muestra información en texto plato.

¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV

O Escaneando el código QR desde la billetera:

17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV