Tabla de Contenidos

06 - DNS: Bind9

En esta práctica guiada, vamos a configurar un entorno DNS utilizando Docker y Bind9 para gestionar un dominio principal y sus subdominios.

Empezaremos creando el dominio principal fruit.com y añadiremos dos subdominios: apple.fruit.com y banana.fruit.com. Posteriormente, estableceremos una delegación de zona para citrus.fruit.com, que será gestionado por un segundo servidor DNS. Dentro de esta subzona, configuraremos dos subdominios adicionales: orange.citrus.fruit.com y lemon.citrus.fruit.com.

Además de estos registros, incluiremos configuraciones para registros de correo (MX), alias (CNAME), y zonas inversas (PTR). Este ejercicio te permitirá familiarizarte con la gestión de dominios, subdominios, y la delegación de zonas, así como con la configuración de registros DNS esenciales.

Para los fines de esta práctica, se están utilizando direcciones IP como 1.1.1.1, 2.2.2.2, y similares, que no son apropiadas para un entorno de producción real. Estas IPs son reservadas para propósitos de documentación o ejemplos y no deben ser usadas en redes de producción. En un entorno real, es importante utilizar direcciones IP válidas y asignadas adecuadamente según las políticas y la planificación de red. El uso de estas IPs en esta práctica es únicamente para simplificar y facilitar el aprendizaje del proceso de configuración de DNS.

Configuración básica

La estructura de carpetas que utilizaremos en este proyecto es la siguiente:

docker-compose.yml
/config-primary  //Directorio que contendrá todos los archivos de configuración necesarios para el servidor principal de Bind9
    named.conf //Archivo de configuración principal de Bind9
    named.conf.options //Opciones globales esenciales para Bind9
    named.conf.local //Zonas DNS que el servidor gestionará
    /zones  //Directorio para almacenar los archivos de zona de los dominios
        db.fruit.com //Registros DNS específicos para el dominio //fruit.com//
/config-secondary  //Directorio que contendrá todos los archivos de configuración necesarios para el servidor secundario de Bind9
    named.conf //Archivo de configuración principal de Bind9
    named.conf.options //Opciones globales esenciales para Bind9
    named.conf.local //Zonas DNS que el servidor gestionará
    /zones  //Directorio para almacenar los archivos de zona de los dominios
        db.citrus.com //Registros DNS específicos para el dominio //citrus.com//
      

docker-compose

Vamos a configurar dos contenedores para los servidores DNS utilizando la imagen ubuntu/bind9, disponible en Docker Hub. Para permitir que el contenedor principal escuche en el puerto 53 de la máquina local, mapearemos el puerto 53 del contenedor a los puertos 1053 en la máquina local tanto para UDP como para TCP, por si el puerto 53 ya está en uso en el sistema anfitrión.

Además, crearemos una red llamada dns-net para que los contenedores puedan comunicarse entre sí. Montaremos los directorios locales ./config-primary y ./config-secondary en /etc/bind de los contenedores. Esto permitirá gestionar y actualizar fácilmente la configuración del servidor DNS desde el directorio de trabajo:

name: dns-bind9

services:
  bind9-primary:
    image: ubuntu/bind9
    container_name: bind9-primary
    ports:
      - "1053:53/udp" # Mapeamos el puerto 53 de UDP
      - "1053:53/tcp" # Mapeamos el puerto 53 de TCP al estar en uso en la máquina local
    volumes:
      - ./config-primary:/etc/bind
    networks:
      - dns-net

  bind9-secondary:
    image: ubuntu/bind9
    container_name: bind9-secondary
    volumes:
      - ./config-secondary:/etc/bind
    networks:
      - dns-net

networks:
  dns-net:
    driver: bridge

Configuración Bind9

Vamos a proceder con la configuración del servidor DNS principal, siguiendo la estructura de archivos y opciones descritas anteriormente. A continuación, se detallan los archivos de configuración necesarios para un servidor DNS básico que gestionará el dominio ficticio fruit.com.

named.conf

Este es el archivo de configuración principal de Bind9. Incluye los archivos de opciones globales y las zonas DNS, lo cual permite mantener una estructura organizada y modular. Para incluir archivos, lo hacemos mediante la opción include:

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";

named.conf.options

Este archivo contiene las opciones globales esenciales para el funcionamiento de Bind9. Aquí se definen configuraciones como el directorio de trabajo y las interfaces de red en las que el servidor escuchará:

options {
    directory "/var/cache/bind";

    recursion yes; # Permitir consultas recursivas
    allow-recursion { any; }; # Permitir recursión desde cualquier IP

    listen-on { any; }; # Escuchar en todas las interfaces IPv4
    listen-on-v6 { any; }; # Escuchar en todas las interfaces IPv6
};

named.conf.local

En este archivo se definen las zonas DNS que Bind9 gestionará. Especifica el nombre del dominio y el archivo de zona correspondiente, lo que permite la resolución de nombres para el dominio configurado:

zone "fruit.com" {
  type master;
  file "/etc/bind/zones/db.fruit.com";
};

db.fruit.com

Este archivo contiene los registros DNS específicos para el dominio fruit.com. Aquí se configuran registros como el SOA (Start of Authority), NS (Name Server), y A (Address), que son esenciales para la resolución de nombres dentro del dominio:

$TTL    604800
@   IN  SOA ns1.fruit.com. root.fruit.com. (
                2024010101 ; Serial
                604800     ; Refresh
                86400      ; Retry
                2419200    ; Expire
                604800 )   ; Negative Cache TTL

; Servidores de nombres
@   IN  NS  ns1.fruit.com.

; Registros A
@   IN  A   192.168.1.2
ns1 IN  A   192.168.1.2
www IN  A   192.168.1.2

Una vez que completado la configuración de Bind9, es importante verificar que todo funcione correctamente. Utilizaremos la herramienta dig para realizar consultas DNS y asegurarnos que el servidor responde como se espera:

dig @127.0.0.1 -p 1053 fruit.com

;; ANSWER SECTION:
fruit.com.		604800	IN	A	192.168.1.2

Añadiendo registros adicionales

Ahora que hemos configurado lo básico para nuestro dominio fruit.com, es momento de ampliar esta configuración añadiendo registros adicionales que son útiles en un entorno más complejo. A continuación, vamos a añadir registros MX y CNAME al archivo de zona db.fruit.com.

Registro MX (Mail Exchange)

El registro MX es esencial para dirigir los correos electrónicos de tu dominio a un servidor de correo específico. En este ejemplo, añadiremos un registro MX que apunta a mail.fruit.com:

$TTL    604800
@   IN  SOA ns1.fruit.com. root.fruit.com. (
                2024010101 ; Serial
                604800     ; Refresh
                86400      ; Retry
                2419200    ; Expire
                604800 )   ; Negative Cache TTL

; Servidores de nombres
@   IN  NS  ns1.fruit.com.

; Registros A
@   IN  A   192.168.1.2
ns1 IN  A   192.168.1.2
www IN  A   192.168.1.2

; Registros MX
@    IN  MX  10 mail.fruit.com.

; Registro A para el servidor de correo
mail IN  A   192.168.1.4

Si ahora consultamos los registros MX de nuestro servidor DNS, deberíamos ver el registro recién creado:

dig @127.0.0.1 -p 1053 fruit.com MX

;; ANSWER SECTION:
fruit.com.		604800	IN	MX	10 mail.fruit.com.

Registro CNAME (Canonical Name)

Un registro CNAME permite crear alias de un dominio. Por ejemplo, podemos hacer que blog.fruit.com sea un alias de www.fruit.com:

$TTL    604800
@   IN  SOA ns1.fruit.com. root.fruit.com. (
                2024010101 ; Serial
                604800     ; Refresh
                86400      ; Retry
                2419200    ; Expire
                604800 )   ; Negative Cache TTL

; Servidores de nombres
@   IN  NS  ns1.fruit.com.

; Registros A
@   IN  A   192.168.1.2
ns1 IN  A   192.168.1.2
www IN  A   192.168.1.2

; Registros MX
@    IN  MX  10 mail.fruit.com.

; Registro A para el servidor de correo
mail IN  A   192.168.1.4

; Alias CNAME
blog IN  CNAME   www.fruit.com.

Para comprobar que el registro CNAME está funcionando correctamente:

dig @127.0.0.1 -p 1053 blog.fruit.com

;; ANSWER SECTION:
blog.fruit.com.		604800	IN	CNAME	www.fruit.com.
www.fruit.com.		604800	IN	A	192.168.1.2

Subdominios

En esta sección, vamos a ampliar nuestra configuración DNS añadiendo dos subdominios adicionales al dominio principal fruit.com. Los subdominios que vamos a configurar son apple.fruit.com y banana.fruit.com. Cada uno de estos subdominios tendrá su propio registro A con direcciones IP específicas para facilitar la resolución de nombres. Para eso, simplemente añadiremos los siguientes registros en el archivo de zona db.fruit.com para definir los subdominios:

                                                                                 
$TTL    604800
@   IN  SOA ns1.fruit.com. root.fruit.com. (
                2024010101 ; Serial
                604800     ; Refresh
                86400      ; Retry
                2419200    ; Expire
                604800 )   ; Negative Cache TTL

; Servidores de nombres
@   IN  NS  ns1.fruit.com.

; Registros A
@   IN  A   192.168.1.2
ns1 IN  A   192.168.1.2
www IN  A   192.168.1.2

; Registros MX
@    IN  MX  10 mail.fruit.com.

; Registro A para el servidor de correo
mail IN  A   192.168.1.4

; Alias CNAME
blog IN  CNAME   www.fruit.com.

; Subdominios
apple IN  A   1.1.1.1
banana IN  A   2.2.2.2

Después de añadir los registros para los subdominios, debemos verificar que la configuración se ha aplicado correctamente y que el servidor DNS está resolviendo los nombres como se espera. Utilizaremos la herramienta dig para realizar estas comprobaciones:

dig @127.0.0.1 -p 1053 apple.fruit.com

;; ANSWER SECTION:
apple.fruit.com.	604800	IN	A	1.1.1.1

dig @127.0.0.1 -p 1053 banana.fruit.com

;; ANSWER SECTION:
banana.fruit.com.	604800	IN	A	2.2.2.2

Registros PTR

Para completar nuestra configuración DNS, añadiremos registros PTR para permitir la resolución inversa de direcciones IP. Esto significa que, dado una dirección IP, podremos determinar el nombre de dominio asociado.

En esta práctica estamos utilizado direcciones IP públicas (1.1.1.1, 2.2.2.2, etc.). Sin embargo, en un entorno real, estas IPs están gestionadas por entidades externas y su resolución inversa ya está configurada en servidores DNS globales, lo que puede provocar conflictos con nuestra configuración local.

Por este motivo, crearemos registros PTR sólo para fruit.com y mail.fruit.com

Vamos a crear un archivo de zona inversa que contenga los registros PTR para nuestras IPs. Asumimos que las direcciones IP son del rango 192.168.1.x, por lo que configuraremos la zona inversa para este rango. El archivo se llamará db.192.168.1 y lo guardaremos en la carpeta zones.

$TTL    604800
@   IN  SOA ns1.fruit.com. root.fruit.com. (
                2024010101 ; Serial
                604800     ; Refresh
                86400      ; Retry
                2419200    ; Expire
                604800 )   ; Negative Cache TTL

; Servidores de nombres
@   IN  NS  ns1.fruit.com.

; Registros PTR
2   IN  PTR fruit.com.
4   IN  PTR mail.fruit.com.

A continuación, debemos agregar la nueva zona inversa en el archivo named.conf.local para que Bind9 la reconozca:

zone "fruit.com" {
    type master;
    file "/etc/bind/zones/db.fruit.com";
};

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
};

Para asegurarnos de que el registro PTR se ha configurado correctamente, podemos usar dig para realizar una consulta de resolución inversa:

dig -x 192.168.1.2 @127.0.0.1 -p 1053

;; ANSWER SECTION:
2.1.168.192.in-addr.arpa. 604800 IN	PTR	fruit.com.

dig -x 192.168.1.4 @127.0.0.1 -p 1053

;; ANSWER SECTION:
4.1.168.192.in-addr.arpa. 604800 IN	PTR	mail.fruit.com.

Delegación de zona

En esta sección, configuraremos la delegación de zonas para el dominio citrus.com. La delegación de zonas permite que un servidor DNS primario (master) pase la autoridad de una subzona a otro servidor DNS secundario (slave). Primero, configuraremos el servidor DNS primario para que delegue la zona citrus.com al servidor DNS secundario. Posteriormente, en el servidor secundario, configuraremos la zona citrus.com como esclava para recibir y mantener los datos de la zona desde el servidor primario.

Para permitir la comunicación entre los contenedores y asegurar que el servidor secundario puede conectarse al primario, actualizaremos el archivo docker-compose.yml para asignar direcciones IP fijas a los contenedores y habilitar la red para que ambos servidores DNS se vean entre sí:

name: dns-bind9

services:
  bind9-primary:
    image: ubuntu/bind9
    container_name: bind9-primary
    ports:
      - "1053:53/udp" # Mapeamos el puerto 53 de UDP
      - "1053:53/tcp" # Mapeamos el puerto 53 de TCP al estar en uso en la máquina local
    volumes:
      - ./config-primary:/etc/bind
    networks:
      dns-net:
        ipv4_address: 192.168.1.2  # IP fija para el servidor primario

  bind9-secondary:
    image: ubuntu/bind9
    container_name: bind9-secondary
    volumes:
      - ./config-secondary:/etc/bind
    networks:
      dns-net:
        ipv4_address: 192.168.1.3  # IP fija para el servidor secundario

networks:
  dns-net:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.1.0/24"  # Define el rango de la red

A continuación, añadimos la configuración para delegar la subzona citrus.fruit.com al servidor DNS secundario. Esto se realiza utilizando la opción $ORIGIN, que permite cambiar el contexto del dominio dentro del archivo de zona.

La directiva \$ORIGIN se utiliza para establecer el contexto del dominio para los registros que siguen. En este caso, $ORIGIN citrus.fruit.com. cambia el contexto al dominio citrus.fruit.com, lo que significa que cualquier registro que aparezca a continuación se interpretará como parte de citrus.fruit.com. Esto simplifica la configuración de los registros y asegura que todos los registros relacionados con la subzona se configuren correctamente sin necesidad de repetir el prefijo del dominio.

Hemos añadido el registro de servidor de nombres (NS) para citrus.fruit.com, apuntando a ns.citrus.fruit.com, y el registro de dirección (A) para ns.citrus.fruit.com, que indica la IP del servidor DNS secundario (192.168.1.3):

$TTL    604800
$ORIGIN fruit.com.
@   IN  SOA ns1.fruit.com. root.fruit.com. (
                2024010101 ; Serial
                604800     ; Refresh
                86400      ; Retry
                2419200    ; Expire
                604800 )   ; Negative Cache TTL

; Servidores de nombres
@   IN  NS  ns1.fruit.com.

; Registros A
@   IN  A   192.168.1.2
ns1 IN  A   192.168.1.2
www IN  A   192.168.1.2

; Registros MX
@    IN  MX  10 mail.fruit.com.

; Registro A para el servidor de correo
mail IN  A   192.168.1.4

; Alias CNAME
blog IN  CNAME   www.fruit.com.

; Subdominios
apple  IN  A   1.1.1.1
banana IN  A   2.2.2.2

; --------------------------------------
; Subdominio delegado: citrus.fruit.com
; --------------------------------------

$ORIGIN citrus.fruit.com.

@   IN  NS   ns.citrus.fruit.com.
ns  IN  A    192.168.1.3

Lo siguiente será crear los diferentes archivos de configuración en el servidor DNS secundario (named.conf, named.conf.local y named.conf.options):

named.conf:

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";

named.conf.local:

zone "citrus.fruit.com" {
    type master;
    file "/etc/bind/zones/db.citrus.fruit.com";
};

named.conf.options:

options {
    directory "/var/cache/bind";

    recursion yes; # Permitir consultas recursivas
    allow-recursion { any; }; # Permitir recursión desde cualquier IP

    listen-on { any; };
    listen-on-v6 { any; };
};

Por último, creamos un archivo de zona para citrus.fruit.com llamado db.citrus.fruit.com en el directorio adecuado. La configuración de este archivo de zona se encargará de contener los registros DNS para citrus.fruit.com:

$TTL    604800
$ORIGIN citrus.fruit.com.
@   IN  SOA ns.citrus.fruit.com. root.citrus.fruit.com. (
                2024010101 ; Serial
                604800     ; Refresh
                86400      ; Retry
                2419200    ; Expire
                604800 )   ; Negative Cache TTL

; Servidores de nombres
@   IN  NS  ns.citrus.fruit.com.

; Registros A
@   IN  A   192.168.1.3
ns  IN  A   192.168.1.3

; Subdominios
orange IN  A   3.3.3.3
lemon  IN  A   4.4.4.4

Para asegurarnos de que la configuración de los servidores DNS principal y secundario está funcionando correctamente, realizaremos una serie de pruebas utilizando la herramienta dig. Estas pruebas incluirán consultas al servidor principal para verificar que responde adecuadamente a las solicitudes de los dominios y subdominios configurados, así como consultas para comprobar que el servidor secundario está replicando correctamente la zona delegada.

dig @127.0.0.1 -p 1053 apple.fruit.com

;; ANSWER SECTION:
apple.fruit.com.	604800	IN	A	1.1.1.1

dig @127.0.0.1 -p 1053 banana.fruit.com

;; ANSWER SECTION:
banana.fruit.com.	604800	IN	A	2.2.2.2

dig @127.0.0.1 -p 1053 orange.citrus.fruit.com

;; ANSWER SECTION:
orange.citrus.fruit.com. 604800	IN	A	3.3.3.3

dig @127.0.0.1 -p 1053 lemon.citrus.fruit.com

;; ANSWER SECTION:
lemon.citrus.fruit.com.	604800	IN	A	4.4.4.4