Admin Libre - Administración de sistemas y redes

DNS sobre TLS con NSD
Por Francisco Gaitán 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 y 853 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.

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 archivo ocsp

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.crt"
        tls-service-ocsp: "/etc/ssl/foo.example.com.crt.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 

Destacado

Misión

Admin Libre promueve el uso de software libre y de calidad tanto en los servidores como en el hardware de red con el objetivo de hacer los sistemas más seguros y auditables.