Servidor DNS con BIND en Ubuntu 18.04

Los Servidores de Nombres de Dominio (DNS) son probablemente (junto con los servidores web) los más implementados y usados.

La parte teórica es amplia y recomiendo revisarla; sin embargo, este post tiene el objetivo de mostrar la configuración de BIND (Berkeley Internet Name Domain) en un servidor con Ubuntu 18.04 como sistema operativo base. Para ello se pueden seguir los siguientes pasos.

Actualización de la lista de paquetes

$sudo apt-get update

Instalación de bind9 y complementos

$sudo apt-get install bind9 bind9utils bind9-doc

Establecer el uso únicamente de IPv4 (opcional)

Editar el archivo «bind9»:

$sudo nano /etc/default/bind9

Agregar la siguiente línea:

OPTIONS="-u bind -4"

Configuración de opciones

Editar el archivo «named.conf.options»

$sudo nano /etc/bind/named.conf.options

Tomar la siguiente configuración como base. Donde la ip del servidor DNS es 10.0.0.16 y usa los servidores de google como «forwarders»:

options {
   directory "/var/cache/bind";
   forwarders {
       8.8.8.8;
       8.8.4.4;
   };
   dnssec-validation auto;
   auth-nxdomain no;    # conform to RFC1035
   listen-on { 10.0.0.16; };
 //listen-on-v6 { any; };
};

Configuración de vistas y zonas

Editar el archivo «named.conf.local»

$sudo nano /etc/bind/named.conf.local

Tomar la siguiente configuración como base. Donde la red interna es 10.0.0.0/24, se tienen dos vistas (interna y externa), cada vista tiene dos zonas y el dominio es «fabritb.com».

acl interna { 10.0.0.0/24; localhost; };
acl externa { 0.0.0.0/0; };

view interna {
    match-clients { interna; };
    allow-recursion { any; };

        zone "fabritb.com"
        {
            type master;
            file "/etc/bind/zones/db.interna.fabritb.com";
        };
        zone "0.0.10.in-addr.arpa"
        {
            type master;
            file "/etc/bind/zones/db.0.0.10";
        };
        include "/etc/bind/zones.rfc1918";
        include "/etc/bind/named.conf.default-zones";
};

view externa {
    match-clients { externa; };
    allow-recursion { any; };

        zone "fabritb.com"
        {
            type master;
            file "/etc/bind/zones/db.externa.fabritb.com";
        };
        zone "181.190.in-addr.arpa"
        {
            type master;
            file "/etc/bind/zones/db.181.190";
        };
        include "/etc/bind/zones.rfc1918";
        include "/etc/bind/named.conf.default-zones";
};

Eliminar las zonas por defecto

Para eliminar las zonas por defecto, se debe editar el archivo «named.conf».

$sudo nano /etc/bind/named.conf

Y comentar o eliminar la siguiente línea:

//include "/etc/bind/named.conf.default-zones";

Configuración de zonas

Se debe crear el directorio «zones».

$mkdir /etc/bind/zones

Dentro del directorio «zones», se crean las zonas citadas en el archivo «named.conf.local».

$touch /etc/bind/zones/db.interna.fabritb.com
$touch /etc/bind/zones/db.0.0.10
$touch /etc/bind/zones/db.externa.fabritb.com
$touch /etc/bind/zones/db.181.190

Y se edita cada uno de los archivos. Tomar como ejemplo la siguiente configuración para «db.interna.fabritb.com», donde se tienen subdominios para el sitio web (www), correo electrónico (mail) y nube (cloud).

$ORIGIN cteub.bo.
$TTL    86400
@   IN  SOA ns1.fabritb.com. root.fabritb.com. (
         2021030923     ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
              86400 )   ; Negative Cache TTL
;
Creado
@   IN  NS  ns1.fabritb.com.
@   IN  MX  10 mail.fabritb.com.
ns1 IN  A  10.0.0.16
www. IN  A  10.0.0.12
mail IN  A  10.0.0.14
cloud IN  A  10.0.0.15

De manera similar, tomar como ejemplo la configuración de «db.0.0.10».

$TTL    86400
@       IN      SOA     ns1.fabritb.com. root.fabritb.com. (
                     2021030901         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
; name servers
      IN      NS      ns1.fabritb.com.

; PTR Records
16.0.0.10.in-addr.arpa.   IN      PTR     ns1.fabritb.com.    ; 10.0.0.16
12.0.0.10.in-addr.arpa.   IN      PTR     www.fabritb.com.    ; 10.0.0.12
14.0.0.10.in-addr.arpa.   IN      PTR     mail.fabritb.com.    ; 10.0.0.14
15.0.0.10.in-addr.arpa.   IN      PTR     cloud.fabritb.com.    ; 10.0.0.15

Se deberá configurar también las zonas de la vista externa, siguiendo la misma lógica pero empleando las direcciones IP públicas.

Comprobación de configuraciones

Para comprobar la sintaxis de los archvios named.conf.* hacer uso del siguiente comando.

$sudo named-checkconf

Para verificar las zonas, usar el comando «named-checkzone».

$sudo named-checkzone fabritb.com db.interna.fabritb.com

Cambios y actualizaciones

Es común implementar nuevos servidores que se deben publicar con algún subdominio, para ello se deben editar los archivos «db.lo.que.corresponda» agregando la entrada con el subdominio y la dirección IP, además de modificar el valor del «Serial», para ello se recomienda usar la nomenclatura AñoMesDiaNrocambio (ej 2021030901) para asegurar que el número es siempre superior al de la configuración previa. Tras ello se debe reiniciar el servicio y el mismo debe estar listo para ser usado.

$sudo service bind9 restart

Recomendaciones

Con eso el servidor DNS debería estar listo y operando. Si se desea publicar el servidor DNS y se tiene algún dispositivo de seguridad (Firewall, NGF, UTM) se debe permitir el acceso al puerto 53 (TCP y UDP). Así mismo, para un entrono de producción, es recomendable revisar DNSSEC (Domain Name System Security Extensions). Y recuerda, si lo usarás como DNS publicado en internet, en nic.bo o en tu proveedor de nombre de dominio debes establecer el (o los) servidor DNS como «ns1.dominio.com» (no solo «domino.com»).

Como de costumbre, recalcar que este post no es nada del otro mundo y se puede encontrar lo mismo (inclusive con mas detalles) en otros blogs, sin embargo si esto te ayuda, eres libre de usarlo. Los siguientes enlaces están relacionados con el post.