DNS sobre TLS con NSD
Por el 8 de Mayo de 2022
DNS sobre TLS, también llamado DNS over TLS (DoT), es una especificación definida en el RFC 7858 que indica como proveer de privacidad y evitar la manipulación para las consultas DNS usando cifrado mediante TLS. DNS sobre TLS es al DNS lo que HTTPS al HTTP.
Aquí explico lo necesario para hacerlo funcionar con un servidor NSD ya configurado que funciona en OpenBSD, aunque las instrucciones deben funcionar para otros sistemas operativos que usen este servidor DNS.
Qué necesitas
- Un par de servidores DNS funcionando, que en este ejemplo serán ns1.example.com y ns2.example.com
-
Cada servidor tendrá un certificado SSL válido para el nombre de host DNS que le corresponda así como su archivo
ocsp
-
El cortafuegos permitirá las conexiones a los puertos
853 UDP
y853 TCP
.
La gestión de los certificados se realiza con acme-client(1), ocspcheck(8) y httpd(8) y queda fuera del alcance de esta entrada.
Lo que hay que conseguir es que cada servidor tenga un certificado válido para su nombre de host (como ns1.example.com), ya sea como nombre principal o como nombre alternativo. En este ejemplo el certificado principal será foo.example.com el cual incluye el nombre alternativo ns1.example.com.
Cuando se actualice el certificado (normalmente mediante un script en crontab(1), el servicio nsd
se debe reiniciar y no recargar; esto se hace con el comando # rcctl restart nsd
.
Si vas a usar ocsp encontrarás un script para mantener los archivos actualizados en el artículo How to build a name server with DNS over TLS (DoT).
Configuración de NSD
Partiendo de una configuración correcta de NSD añadiré estos parámetros al bloque server
:
-
Una nueva línea
ip-address
para la dirección IPv4 especificando el puerto 853 -
Una nueva línea
ip-address
para la dirección IPv6 especificando el puerto 853 -
tls-service-key
indicando la llave privada del certificado -
tls-service-pem
indicando el certificado completo -
tls-service-ocsp
indicando el archivoocsp
Para ver una explicación en más detalle de las distintas opciones echa un ojo a nsd.conf(5).
nsd.conf
server:
hide-version: yes
verbosity: 1
database: "" # disable database
server-count: 1
ip-address: 203.0.113.1
ip-address: 203.0.113.1@853
ip-address: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
ip-address: 2001:0db8:85a3:0000:0000:8a2e:0370:7334@853
tls-service-key: "/etc/ssl/private/foo.example.com.key"
tls-service-pem: "/etc/ssl/foo.example.com.fullchain.pem"
tls-service-ocsp: "/etc/ssl/foo.example.com.fullchain.pem.ocsp"
Como probar la configuración
Para probar que funciona correctamente usaré la herramienta dog, disponible en los ports de OpenBSD:
# pkg_add dog
Una vez instalado haré una consulta usando TLS:
$ dog example.com --tls @ns1.example.com