====== 06 - DNS: Bind9 ======
En esta práctica guiada, vamos a configurar un entorno DNS utilizando Docker y [[https://www.isc.org/bind/|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.
{{ :clase:smr:sr:1eval:dns-practica.png?400 |}}
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 [[https://hub.docker.com/r/ubuntu/bind9|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
* **$TTL 604800**: Define el Time To Live (TTL) por defecto en segundos para todos los registros de esta zona. En este caso, es 604800 segundos (7 días). El TTL indica cuánto tiempo los servidores DNS deben guardar en caché la información antes de consultar nuevamente.
* **@ IN SOA ns1.fruit.com. root.fruit.com.**: Este es el registro Start of Authority (SOA), que proporciona información administrativa sobre la zona. Incluye:
* **ns1.fruit.com.**: El servidor de nombres principal para esta zona.
* **root.fruit.com.**: La dirección de correo electrónico del administrador de la zona (el punto en lugar de @).
* ** Serial 2024010101**: Un número de serie para la zona. Debe incrementarse con cada actualización para que los servidores secundarios sepan que hay cambios.
* **Refresh 604800**: Indica que los servidores secundarios deben consultar el servidor principal cada 604800 segundos (7 días) para actualizaciones.
* **Retry 86400**: Tiempo que deben esperar los servidores secundarios antes de intentar consultar nuevamente después de un fallo, en segundos (1 día).
* **Expire 2419200**: Tiempo que los servidores secundarios deben mantener los datos antes de considerarlos obsoletos si no pueden contactar con el servidor principal, en segundos (4 semanas).
* **Negative Cache TTL 604800**: Tiempo que los servidores deben guardar respuestas negativas (por ejemplo, un nombre no encontrado) en caché, en segundos (7 días).
* **@ IN NS ns1.fruit.com.**: Define el servidor de nombres para la zona fruit.com. El símbolo @ representa el dominio base, fruit.com, y ns1.fruit.com es el servidor de nombres que gestionará esta zona.
* **@ IN A 192.168.1.2**: Define un registro A para fruit.com, que mapea el nombre del dominio a la dirección IP 192.168.1.2
* **ns1 IN A 192.168.1.2**: Define un registro A para ns1.fruit.com, que mapea el nombre del servidor de nombres a la dirección IP 192.168.1.2
* **www IN A 192.168.1.2**: Define un registro A para www.fruit.com, que mapea el nombre www a la dirección IP 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
* ** @ IN MX 10 mail.fruit.com.**: Este registro indica que los correos electrónicos dirigidos a fruit.com deben ser manejados por el servidor mail.fruit.com, con una prioridad de 10.
* **mail IN A 192.168.1.4**: Añadimos un registro A para mail.fruit.com, apuntando a la IP 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.
* **blog IN CNAME www.fruit.com.**: Este registro CNAME crea un alias blog.fruit.com que apunta a www.fruit.com. Esto significa que cualquier solicitud a blog.fruit.com será redirigida a 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.
* **@ IN SOA**: Especifica la información básica de la zona.
* **@ IN NS ns1.fruit.com.**: Indica el servidor de nombres que gestiona esta zona.
* **2 IN PTR fruit.com.**: Este registro PTR indica que la dirección IP 192.168.1.2 está asociada con el dominio fruit.com.
* **4 IN PTR mail.fruit.com.**: Asocia 192.168.1.20 con 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";
};
* **zone "1.168.192.in-addr.arpa"**: Define la zona para la resolución inversa de las IPs en la subred 192.168.1.x.
* **file "/etc/bind/zones/db.192.168.1";**: Especifica la ubicación del archivo de zona inversa que acabamos de crear.
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