Microordenadores - Desarrollos modernos para sistemas retro

Como configurar tus propios servidores DNS de forma segura
17 de Julio de 2017

Configurar tus propios DNS tiene una serie de ventajas, ya que no dependes de la calidad de los servidores que te proporciona tu registrador de dominios y tienes total flexiblidad, eligiendo el software, su configuración y la geolocalización de los servidores, que deben estar lo más cerca posible de tu audiencia.

Elección del software

Los tres servidores de DNS más populares son los siguientes:

  • BIND: una implementación completa de DNS, aunque anticuado, y no sigue las mejores prácticas de seguridad.
  • PowerDNS: un servidor DNS de alto rendimiento.
  • NSD: el servidor de DNS que viene incluído en el sistema base de OpenBSD, con licencia BSD y fama de ser seguro. Es utilizado en algunos root servers.

Por razones de simplicidad y seguridad usaré el sistema operativo OpenBSD y NSD, que viene incluído en el sistema base, con las ventajas que ello implica: está auditado y soportado por el equipo de OpenBSD. Si no sabes como instalarlo echa un ojo al tutorial como instalar OpenBSD en un VPS y, por supuesto, al FAQ de OpenBSD.

Lectura recomendada

Planificando la red

Voy a realizar una configuración conocida como Hidden Master, que consiste en que solamente atenderán consultas de DNS los servidores secundarios, sin listar ni dar a conocer la IP del servidor primario en ningún sitio. El mínimo de servidores DNS necesarios es dos, aunque el RFC recomienda tres en diferentes subredes. Estos tres serán los secundarios, que junto al primario, son 4 máquinas, de las cuales los 3 dns secundarios estarán en en distintos países y distintos centros de datos.

Aunque no es necesario, ayuda bastante a tener todo bien organizado disponer de un dominio específico para la red.

Conexión de los servidores mediante un túnel IPSEC

En vez de usar la llave de nsd para comunicar los servidores, por seguridad usaré IPSEC que también viene incluido en OpenBSD. Si no sabes como configurarlo mira el tutorial de IPSEC. El único cambio que tendrás que realizar es agregar más lineas ike para conectar a 3 servidores en vez de a uno, quedando una configuración en el servidor primario similar a esta:

ike esp from 10.0.0.1 to 10.1.1.1 peer 1.2.3.4
ike esp from 10.0.0.1 to 10.2.2.1 peer 5.6.7.8
ike esp from 10.0.0.1 to 10.3.3.1 peer 9.10.11.12

Configuración de nsd

Parto de que ya tienes instalado OpenBSD y configurado tanto IPSEC como el firewall con denegación por defecto (guía de usuario de packet filter. Una vez hecho se activa nsd en el arranque del sistema:

# rcctl enable nsd

Ahora hay que configurar NSD, el archivo de configuración está en /var/nsd/etc/nsd.conf. Al estar dentro de un chroot hay que mantener la opción remote-control: yes para poder recargar la configuración desde el script rc.d:

Configuración del servidor primario

# $OpenBSD: nsd.conf,v 1.11 2015/04/12 11:49:39 sthen Exp $

server:
        hide-version: yes
        verbosity: 1
        database: "" # disable database

remote-control:
        control-enable: yes

zone:
        name: "example.com"
        zonefile: "master/example.com"
        notify: 10.1.1.1 NOKEY
        provide-xfr: 10.1.1.1 NOKEY
        notify: 10.2.2.1 NOKEY
        provide-xfr: 10.2.2.1 NOKEY
        notify: 10.3.3.1 NOKEY
        provide-xfr: 10.3.3.1 NOKEY

Configuración de los servidores secundarios

# $OpenBSD: nsd.conf,v 1.11 2015/04/12 11:49:39 sthen Exp $

server:
        hide-version: yes
        verbosity: 1
        database: "" # disable database

remote-control:
        control-enable: yes

zone:
        name: "example.com"
        zonefile: "slave/example.com"
        allow-notify: 10.0.0.1 NOKEY
        request-xfr: 10.0.0.1 NOKEY

Configuración de la zona

Esta es una zona de ejemplo con un TTL de 1 día. El archivo va en /var/nsd/zones/master/example.com del servidor primario (y oculto) de tu red. Para más información lee los RFCs de DNS). foo, bar y wu son los servidores secundarios de DNS:

$ORIGIN example.com.
$TTL 86400

@       IN      SOA     foo.example.com. hostmaster.example.com. (
                        2017071700      ; serial
                        28800           ; refresh
                        7200            ; retry
                        1209600         ; expire
                        86400 )         ; negative

                NS      foo.example.com.
                NS      bar.example.com.
                NS      wu.example.com.

foo		IN      A      	1.2.3.4 
bar		IN      A      	5.6.7.8 
wu		IN      A      	9.10.11.12 

Esto asigna la dirección de correo hostmaster@example.com al administrador del DNS de esta zona.

Como actualizar una zona

Simplemente haz los cambios necesarios en el archivo master/example.com en el servidor primario, incrementa el número de serie y a continuación ejecuta # rcctl reload nsd o # /etc/rc.d/nsd reload. El cambio se propagará a los servidores secundarios.

El número de serie se suele poner en formato AÑO-MES-DÍA-NÚMERO, como por ejemplo 2017071700.

Comprueba usando dig ($ dig @foo.example.com) que todos los servidores den la respuesta adecuada, y comprueba en el achivo de log /var/log/daemon que al realizar un cambio éste se propaga correctamente.

Configuración del dominio

Ya solo falta configurar el glue, esto es asignar la IP de cada uno de los servidores secundarios (no el primario) en los root servers. Para ello ve a tu registrador de dominios y busca la opción Register NS o Registrar DNS para asociar los nombres de host foo.example.com, bar.example.com, wu.example.com a las IP del servidor que le corresponda. Recuerda que NO debes listar el servidor primario; este deberá tener una configuración de firewall de denegación por defecto y sin acceso desde el exterior al puerto 53 (TCP y UDP), y sólo servirá para hacer cambios en las zonas DNS y propagarlo a los servidores secundarios, que son los que se encargan de responder las peticiones.

Una vez hecho eso y creada la zona, ya puedes asignar estos DNS al dominio en cuestión.


Contenido relacionado: