El sistema de resolución de peticiones DNS es un sistema que se desarrolló hace muchos años. La consecuencia directa de lo que acabo de citar es que el sistema actual es obsoleto y presenta carencias en el campo de la seguridad y privacidad. Por esto motivo Cloudflare, Mozilla y Chrome están trabajando en soluciones para que permitan usar un nuevo protocolo de resoluciones DNS llamado DNS over HTTPS.
¿QUÉ ES DNS OVER HTTPS (DoH)?
DNS over HTTPS, abreviado como DoH, es un nuevo protocolo propuesto por la IETF en Octubre de 2018. DNS over https no es más que el DNS de toda la vida, pero con la diferencia que la totalidad de tráfico para resolver la peticiones DNS se hará usando los protocolo https y http/2. Por lo tanto las peticiones DNS estarán cifradas y se realizarán por el puerto 443 en vez del puerto 53.
Por lo tanto, DNS over HTTPS traducirá las direcciones URL convencionales a sus correspondientes direcciones IP, pero con la particularidad que todo el tráfico entre el cliente DNS y el servidor DNS estará completamente cifrado. Por lo tanto, DoH no cifra el tráfico de extremo a extremo, pero si cifra el tráfico DNS.
VENTAJAS PROPORCIONADAS POR DNS OVER HTTPS
Considerando que el tráfico para resolver las peticiones DNS estará cifrado dispondremos de los siguientes beneficios:
- De cara a los usuarios, la ventaja más importante es que la resolución de las peticiones DNS será más rápida. La latencia será menor y las webs que visitaremos cargarán más rápido.
- Nadie, a excepción de la empresa que nos proporciona la resolución de peticiones DNS, podrá conocer las webs que visitamos. Por lo tanto, nuestro operador ISP no podrá bloquearnos el acceso a determinadas web mediante los DNS.
- Incremento de la seguridad y privacidad ya que de este modo se podrán evitar ataques Man in the Middle. Por lo tanto podremos evitar ataques de DNS spoofing, DNS hijacking, etc.
- El protocolo DNS over HTTPS usa el protocolo https y http/2. Por lo tanto se beneficiará automáticamente de todas las mejoras que se realicen en los protocolo https y https/2.
A pesar de todas las ventajas citadas, se trata de un protocolo experimental y que aún está en desarrollo. Por lo tanto, pueden darse los siguientes problemas:
- Si tenemos sistemas de control parental o de filtrado de contenido, como por ejemplo pfSense, dejarán de funcionar. No podrán funcionar porque no serán capaces de ver las peticiones DNS. Esto es un problema para las empresas o gobiernos que monitorear/filtrar donde se conectan sus trabajadores o ciudadanos.
- Problemas de interoperabilidad en las redes 5G
- En teoría la velocidad de resolución ofrecida por DNS sobre HTTPS debería ser mayor que la tecnología que usamos actualmente. No obstante, pueden darse casos en que la resolución de peticiones DNS sea lenta.
- Dificultades a la hora implementar un sistema de DNS divido (Split DNS).
- Etc.
CONFIGURAR PI-HOLE PARA USAR DNS OVER HTTPS EN UNA RASPBERRY PI
Ninguno de los sistemas operativos actuales soporta DNS sobre HTTPS de forma nativa. Por lo tanto, si queremos usar este sistema de resolución de peticiones DNS deberemos instalar software adicional o usar un navegador que traiga implementado este protocolo.
Si usamos un navegador, como por ejemplo Firefox o Chrome, únicamente tendremos DNS over HTTPS en el navegador. Si queremos disponer de DNS sobre HTTPS en la totalidad de nuestras peticiones, recomiendo instalar el cliente DNS de Cloudflare en una Raspberry Pi. De este modo la Raspberry Pi actuará como cliente DNS de la totalidad de equipos que configuremos en nuestra red local. Para conseguir lo que acabo de citar deberemos proceder el siguiente modo.
Instalar Pi-hole en la Raspberry Pi
Obviamente tendremos que tener instalado Pi-hole en nuestra Raspberry Pi. En el caso que no lo tengan instalado pueden seguir las instrucciones que encontrarán en el siguiente enlace:
Instalar y configurar Pi-hole para bloquear la publicidad de nuestra red
Instalar el demonio Cloudflared en la Raspberry Pi
Cloudflare dispone de un cliente que será el encargado de resolver la totalidad de peticiones DNS sobre HTTPS. El cliente está disponible para Windows, MacOS y Linux. En nuestro caso lo instalaremos en una Raspberry Pi del siguiente modo.
Inicialmente descargaremos el cliente ejecutando el siguiente comando en la terminal:
wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-arm.tgz
Acto seguido descomprimiremos el archivo ejecutando el siguiente comando:
tar -xvzf cloudflared-stable-linux-arm.tgz
A continuación, copiaremos el archivo binario cloudflared en la ubicación /usr/local/bin ejecutando el siguiente comando en la terminal:
sudo cp ./cloudflared /usr/local/bin
El siguiente paso consistirá en dar permisos de ejecución al archivo binario que acabamos de copiar. Para ello usaremos el siguiente comando:
sudo chmod +x /usr/local/bin/cloudflared
En estos momentos cloudflare ya está instalado. Para comprobar la versión que estamos usando podemos ejecutar el siguiente comando en la terminal:
cloudflared -v
En mi caso el resultado obtenido ha sido el siguiente:
cloudflared version 2019.9.2 (built 2019-09-26-1916 UTC)
Crear un usuario para Cloudflared
Crearemos un usuario con nombre cloudflared. El usuario no tendrá partición home ni tendrá acceso a la Shell de Linux. Para ello ejecutaremos el siguiente comando en la terminal:
sudo useradd -s /usr/sbin/nologin -r -M cloudflared
Configurar el demonio Cloudflared DNS
El siguiente paso consistirá en generar el archivo de configuración de Cloudflared. Para ello ejecutamos el siguiente comando en la terminal:
sudo nano /etc/default/cloudflared
Una vez se abra el editor de textos nano pegaremos el siguiente código:
# Commandline args for cloudflared CLOUDFLARED_OPTS=--port 5053 --upstream https://1.1.1.1/dns-query --upstream https://1.0.0.1/dns-query
Seguidamente tendremos que guardar los cambios realizados y cerrar el fichero. En el fichero de configuración hemos definido que tendremos un proxy local escuchando en el puerto 5053. Todas las peticiones DNS se dirigirán al puerto 5053 y serán resueltas por los servidores DNS de Cloudflare mediante protocolo DNS over HTTPS.
Finalmente cambiaremos de grupo y usuario el archivo binario y al archivo de configuración de Cloudflared. Para ello ejecutaremos los siguientes comandos en la terminal:
sudo chown cloudflared:cloudflared /etc/default/cloudflared sudo chown cloudflared:cloudflared /usr/local/bin/cloudflared
Crear un servicio de Systemd para Cloudflare
Para gestionar el de servicio Cloudflare deberemos crear un servicio de systemd. Para ello ejecutaremos el siguiente comando en la terminal:
sudo nano /lib/systemd/system/cloudflared.service
Cuando se abra el editor de textos nano pegaremos el siguiente código:
[Unit] Description=cloudflared DNS over HTTPS proxy After=syslog.target network-online.target [Service] Type=simple User=cloudflared EnvironmentFile=/etc/default/cloudflared ExecStart=/usr/local/bin/cloudflared proxy-dns $CLOUDFLARED_OPTS Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
A continuación guardaremos los cambios y cerraremos el fichero. Seguidamente ejecutaremos el siguiente comando para que Cloudflare se inicie de forma automática cada vez reiniciemos la Raspberry Pi.
sudo systemctl enable cloudflared
Finalmente arrancaremos el servicio ejecutando el siguiente comando en la terminal:
sudo systemctl start cloudflared
Si precisan comprobar que el servicio se haya levantado de forma correcta puede ejecutar el siguiente comando:
sudo systemctl status cloudflared
Verificar que Cloudflare está funcionando correctamente
Para comprobar que Cloudflare funciona de forma adecuada ejecutaremos el siguiente comando en la terminal:
dig @127.0.0.1 -p 5053 google.com
Si obtenéis un resultado parecido al siguiente podéis estar seguros que todo lo realizado hasta el momento funciona correctamente.
Modificar la configuración de Pi-Hole para que pueda usar DNS over HTTPS
Para que Pi-hole pueda utilizar el cliente DNS over HTTPS de Cloudflare deberemos realizar lo siguiente:
- Accedemos al panel de administración de Pi-hole.
- Clicamos en la Opción Settings.
- A continuación clicamos en la pestaña DNS.
- Destildamos absolutamente todos los DNS que tengamos activados.
- Tildamos el campo Custom 1 (IPv4) y en el mismo campo pegamos 127.0.0.1#5053
Finalmente presionamos en el botón SAVE para que se hagan efectivos los cambios.
CONCLUSIONES Y FUNCIONAMIENTO
En mi caso el funcionamiento de DNS over HTTPS es satisfactorio. No observo que la resolución de peticiones DNS sea más rápida, pero tampoco veo que sea más lenta y además supone una mejora importante en términos de seguridad ya que la totalidad de peticiones DNS están cifradas.
Por lo tanto nadie, excepto Cloudflare, tendrá acceso a mi historial de navegación. Por este motivo, si no confían en Cloudflare les recomiendo que no apliquen la solución que se muestra en este artículo.
Cloudflare promete que no guardará ningún historial durante más de 24 horas y que no asociará la dirección IP a un origen. A pesar de esto todo el mundo sabe que de lo que se dice a lo que se hace puede existir una gran diferencia.
DNS over HTTPS es una mejora importante en términos de privacidad ya que los gobiernos y/o ISP no podrán aplicar restricciones ni filtrar el contenido que visitan los ciudadanos. Por este motivo algunos gobiernos, como el británico, están haciendo todo lo posible para que no se adopte este protocolo.
Gracias
Gran artículo. No tenía ni idea de la existencia de DoH.
Una duda. Dices que «El protocolo DNS over HTTPS usa el protocolo https y http/2». Entonces sólo funciona cuando se hagan peticiones con aplicaciones que usen HTTPS, como los navegadores o el comando wget de Linux, ¿no?
El sistema que se menciona funciona para todas las peticiones DNS. Sean o no sean en el navegador.
https es un protocolo de comunicación como lo puede ser TCP o UDP. DoH usa https en vez de UDP.
Saludos
Perfectamente aclarado. Muchas gracias.
Excelente aporte, pero considero que la opción de usar dnscrypt-proxy bien configurado aporta un extra de seguridad adicional mayor. En las últimas versiones se han aportado muchas mejoras.
Un saludo
Hola buenas
Gracias por tu comentario. Estaría bien que desarrollarás el porque una opción es mejor que otra técnicamente.
Saludos
Simplemente porque dnscrypt-proxy también incluye el protocolo DoH en el que se basa y hace uso Cloudflare ademas de Dnscrypt y la ultima novedad que incluye es Anonymous DNS que enmascara las consultas cifradas en otros servidores para añadir mas capa de seguridad
Hola
Desconocía lo que comentas. Cloudflared también puede funcionar con otros resolvers como por ejemplo los de IBM. Yo no descartaría una opción desarrollada por una compañía como Cloudflare. Independientemente que confíes o no en ellos pienso que hacen las cosas de forma correcta.
En su día probé Dnscrypt y la experiencia fue agridulce.
Saludos
La versión 1 del protocolo dnscrypt-proxy tuvo sus más y sus menos como bien comentas en parte por la segregación en cuanto a paquetería de distribuciones conllevaba. La versión 2 esta en Github precompilada y todo son bondades en cuanto a estabilidad de funcionamiento. Como bien comentas el protocolo DoH esta diseñado y potenciado por Cloudflare y es excepcional, dnscrypt-proxy no lo reinventa sino que lo integra con otros protocolos adicionales por eso te recomiendo que le des una oportunidad. En mi portfolio puedes ver la configuración de un server en el que se integra y te puedo asegurar que el rendimiento es genial.
Tengo una RPi +3b y un Odroid C1 como banco de pruebas ARM y funcionan de fabula también.
Un saludo y lo dicho gran trabajo por este gran blog que dispones en la red
Hola
Muchas gracias por el tutorial, pero al hacer la última prueba me dice que connection Time out
Gracias
Hola
Si te da este mensaje es porque algún paso de la configuración no está realizado correctamente y por lo tanto no se puede resolver la petición DNS. Recuerda que el firewall debe permitir las entradas en el puerto que Cloudflare está escuchando.
Saludos
Hola, muchas gracias por el tutorial, ya lo tengo funcionando.
Te quería hacer una pregunta, ¿DoH es una alternativa a Unbound o se pueden usar los dos juntos?
Hola
Si usas la configuración del artículo usarás los DNS de Cloudflare. También se del cierto que puedes usar los de IBM (Quad9), pero dudaría mucho que puedas usar Unbound.
Si lo quieres probar en el fichero
/etc/default/cloudflared
pon los DNS de Unbound y mira si te funciona. Si te funciona asegura con Wireshark que se estén cifrando las peticiones DNS. Finalmente si quieres puedes poner Unbound como servidor primario y Cloudflare como secundario otro. Que yo sepa Unbound no soporta DoH. Lo que acepta es DNS sobre TLS.Saludos
Dados mis escasos conocimientos, has tocado una de las cosas que me tiene obsesionado, que es comprobar que realmente está cifrando las peticiones DNS.
Según esto si
«https://1.1.1.1/help#eyJpc0NmIjoiWWVzIiwiaXNEb3QiOiJObyIsImlzRG9oIjoiWWVzIiwicmVzb2x2ZXJJcC0xLjEuMS4xIjoiWWVzIiwicmVzb2x2ZXJJcC0xLjAuMC4xIjoiWWVzIiwicmVzb2x2ZXJJcC0yNjA2OjQ3MDA6NDcwMDo6MTExMSI6Ik5vIiwicmVzb2x2ZXJJcC0yNjA2OjQ3MDA6NDcwMDo6MTAwMSI6Ik5vIiwiZGF0YWNlbnRlckxvY2F0aW9uIjoiTUFEIiwiaXNXYXJwIjoiTm8iLCJpc3BOYW1lIjoiQ2xvdWRmbGFyZSIsImlzcEFzbiI6IjEzMzM1In0=»
Con wireshark (he visto un tuto tuyo con DNSCrypt) he puesto ip.addr == 192.168.10.33 que es la dirección del server donde tengo instalado pihole y cloudflared. La verdad es que me salen un montón de protocolos y soy incapaz de discernir si está o no está cifrando.
Muchas gracias, gran trabajo el tuyo
Buenas soy un poco novato en esto de linux, tengo un rpi 1 con pihole instalado.
Al instalar Cloudflared , al llegar a este paso «cloudflared -v»
me devuelve «Violación de segmento»
Como puedo solucionar?
Hola
En este hilo de github indican causas y soluciones.
https://github.com/cloudflare/cloudflared/issues/38
En mi caso tengo un rpi3 y una rpi4 y no tengo ningún problema.
Saludos
hola y gracias por el aporte, Una pregunta los pasos a seguir también son para linux ubuntu?
Hola
Sí, los pasos son los mismos.
Saludos
Espectacular artículo. Instalé un PiHole y va de fábula la guía.
Esperemos que vaya a más la adopción del protocolo ya que resolución de los DNS es importantísimo a nivel privacidad, sobre todo cuando hablamos de tecnologías como crypto, por ejemplo.