Configurar un Servidor DNS Autoritativo Local en Linux

CompTIABeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a configurar un servidor DNS autoritativo local en un sistema Linux utilizando bind9. Obtendrá experiencia práctica con uno de los paquetes de software DNS más utilizados, transformando una máquina Linux estándar en un servidor capaz de resolver nombres de dominio personalizados para una red local.

El proceso comienza con la instalación de los paquetes necesarios y la configuración de las opciones globales del servidor, como la configuración de los forwarders. A continuación, definirá una zona de búsqueda directa (forward lookup zone) para resolver un nombre de dominio a una dirección IP y una zona de búsqueda inversa (reverse lookup zone) para el rango de IP correspondiente. Para concluir el laboratorio, validará los archivos de configuración de bind9 para verificar la sintaxis correcta y utilizará la utilidad dig para probar su nuevo servidor DNS, asegurándose de que resuelve correctamente las consultas para su dominio local.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 82%. Ha recibido una tasa de reseñas positivas del 81% por parte de los estudiantes.

Instalar bind9 y Configurar Opciones Globales

En este paso, comenzará configurando los componentes principales de su servidor DNS. Esto implica la instalación de bind9, que es uno de los paquetes de software de servidor DNS más utilizados en Linux. También configurará sus opciones globales, que controlan el comportamiento general del servidor, como la forma en que maneja las solicitudes de dominios para los que no es autoritativo.

Primero, es una práctica estándar actualizar la lista de paquetes de su sistema para asegurarse de que está obteniendo las últimas versiones de software disponibles.

Ejecute el siguiente comando en su terminal:

sudo apt-get update

A continuación, instale el paquete bind9, que contiene el demonio del servidor DNS, y bind9-utils, que proporciona herramientas útiles de línea de comandos como dig y named-checkconf que utilizará más adelante para pruebas y validación.

sudo apt-get install bind9 bind9-utils

Se le pedirá que confirme la instalación. Escriba Y y presione Enter. La salida será similar a esta:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  bind9-libs bind9-doc dns-root-data
...
After this operation, XX.X MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...
Setting up bind9 (1:9.18.X-XubuntuX.X) ...

Con bind9 instalado, la siguiente tarea es configurar su comportamiento global. La configuración principal se divide en varios archivos, todos ubicados en el directorio /etc/bind/. Para las opciones globales, editará el archivo named.conf.options.

Abra el archivo usando el editor nano:

sudo nano /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        // forwarders {
        //      0.0.0.0;
        // };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

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

Dentro de este archivo, verá un bloque options { ... };. Debe asegurarse de que este bloque contenga directivas para el reenvío (forwarding), permisos de consulta (query permissions) y interfaces de escucha (listening interfaces). El reenvío permite que su servidor DNS resuelva dominios externos (como google.com) preguntando a otros servidores DNS públicos.

Modifique el bloque options para que coincida con lo siguiente. Puede agregar las líneas que faltan o descomentar y cambiar las que ya existen.

Consejos: Puede limpiar el contenido del archivo presionando Ctrl+K, luego pegue el siguiente contenido.

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

        // If there is not a line with forwarders, add the following section.
        // If there is one, ensure it's not commented out and has valid IPs.
        forwarders {
                8.8.8.8;
                8.8.4.4;
        };

        // Add or uncomment this line to allow queries from any host
        allow-query { any; };
        recursion yes;

        listen-on { any; }; // Listen on all interfaces
        listen-on-v6 { any; }; // Listen on all IPv6 interfaces

        dnssec-validation auto;
        auth-nxdomain no;    ## conform to RFC1035
};

Una vez que haya terminado de editar, guarde el archivo presionando Ctrl+O, luego presione Enter para confirmar el nombre del archivo. Salga del editor nano presionando Ctrl+X. Ahora ha instalado bind9 con éxito y ha configurado su configuración inicial.

Definir y Crear una Zona de Búsqueda Directa para mylocaldomain.net

En este paso, configurará su servidor bind9 para que sea autoritativo para un dominio personalizado. Esto se logra creando una zona de búsqueda directa (forward lookup zone), que es una base de datos que mapea nombres de host legibles por humanos (como webserver.mylocaldomain.net) a sus direcciones IP correspondientes. Primero definirá la zona en la configuración de bind9 y luego creará el archivo de zona real que contiene los registros DNS.

Primero, necesita informar a bind9 sobre su nueva zona. Las configuraciones de zonas locales se guardan en /etc/bind/named.conf.local para separarlas de la configuración predeterminada del paquete. Este archivo se configurará completamente en el siguiente paso.

Ahora que la zona está definida, debe crear el archivo de zona correspondiente. Este archivo contiene los registros DNS reales.

Primero, copie un archivo de plantilla para asegurarse de que el nuevo archivo tenga los permisos y la propiedad correctos:

sudo cp /etc/bind/db.local /etc/bind/db.mylocaldomain.net

A continuación, en lugar de editar manualmente el archivo, puede ejecutar un bloque de comandos único que:

  1. Obtendrá la dirección IP de su VM.
  2. Generará un número de serie dinámico utilizando la fecha actual.
  3. Escribirá el contenido completo y correcto del archivo de zona en /etc/bind/db.mylocaldomain.net.

Primero, capture la dirección IP de su VM en una variable que se utilizará en el archivo de zona:

VM_IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

Este comando extrae la dirección IPv4 de su interfaz de red principal (eth0) utilizando una expresión regular. La dirección IP se insertará automáticamente en sus registros DNS.

Ahora, cree el archivo de zona con los registros DNS apropiados. Este único comando generará el archivo de zona completo:

sudo bash -c "cat > /etc/bind/db.mylocaldomain.net" << EOF
\$TTL    604800
@       IN      SOA     ns1.mylocaldomain.net. admin.mylocaldomain.net. (
                     $(date +%Y%m%d)01 ; Serial (YYYYMMDDNN)
                             604800     ; Refresh
                              86400     ; Retry
                            2419200     ; Expire
                             604800 )   ; Negative Cache TTL
;
@       IN      NS      ns1.mylocaldomain.net.
ns1     IN      A       ${VM_IP}
webserver IN    A       ${VM_IP}
fileserver IN   A       ${VM_IP}
www     IN      CNAME   webserver
EOF

Este comando rellena automáticamente el archivo de zona con los registros correctos, utilizando la dirección IP específica de su VM. Puede verificar el contenido con cat /etc/bind/db.mylocaldomain.net. Ahora ha definido y creado con éxito su primera zona de búsqueda directa.

Definir y Crear Todas las Zonas Locales

En este paso, creará todas las configuraciones de zonas locales necesarias. En lugar de editar archivos manualmente, utilizará un script para realizar las siguientes acciones, asegurando una configuración precisa:

  1. Crear /etc/bind/named.conf.local: Este archivo se generará desde cero para contener las definiciones de sus zonas de búsqueda directa (mylocaldomain.net) y de búsqueda inversa.
  2. Crear el Archivo de Zona Inversa: El script también creará el archivo db.REVERSE_IP con los registros PTR necesarios.

Primero, recopile la información de la dirección IP necesaria para ambas configuraciones de zona:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
LAST_OCTET=$(echo $IP | awk -F. '{print $4}')

Esto extrae la dirección IP de su VM y la procesa para crear el formato de IP inversa necesario para la zona de búsqueda inversa. Por ejemplo, si su IP es 172.16.50.100, REV_IP se convierte en 50.16.172 y LAST_OCTET se convierte en 100.

A continuación, cree el archivo de configuración de zona principal que informa a bind9 sobre ambas zonas:

sudo bash -c "cat > /etc/bind/named.conf.local" << EOF
//
// Do any local configuration here
//

// Forward lookup zone
zone "mylocaldomain.net" {
    type master;
    file "/etc/bind/db.mylocaldomain.net";
};

// Reverse lookup zone
zone "${REV_IP}.in-addr.arpa" {
    type master;
    file "/etc/bind/db.${REV_IP}";
};
EOF

Este archivo define tanto la zona de búsqueda directa (para resolver nombres a IPs) como la zona de búsqueda inversa (para resolver IPs de vuelta a nombres). El type master indica que este servidor es autoritativo para estas zonas.

Finalmente, cree el archivo de zona inversa con los registros PTR:

sudo bash -c "cat > /etc/bind/db.${REV_IP}" << EOF
\$TTL    604800
@       IN      SOA     ns1.mylocaldomain.net. admin.mylocaldomain.net. (
                     $(date +%Y%m%d)01 ; Serial
                             604800     ; Refresh
                              86400     ; Retry
                            2419200     ; Expire
                             604800 )   ; Negative Cache TTL
;
@       IN      NS      ns1.mylocaldomain.net.
;
${LAST_OCTET}     IN      PTR     ns1.mylocaldomain.net.
${LAST_OCTET}     IN      PTR     webserver.mylocaldomain.net.
${LAST_OCTET}     IN      PTR     fileserver.mylocaldomain.net.
EOF

Este enfoque automatizado garantiza que ambas zonas se definan correctamente en named.conf.local y que el archivo de zona inversa se cree correctamente, evitando errores de configuración comunes.

Validar la Configuración de bind9 y Probar la Resolución DNS con dig

En este paso, validará todos los cambios de configuración que ha realizado y luego probará su servidor DNS en vivo. Es una práctica fundamental verificar los archivos de configuración en busca de errores de sintaxis antes de aplicarlos, ya que un error podría impedir que el servicio bind9 se inicie correctamente. Una vez validado, utilizará la utilidad dig para realizar búsquedas DNS y confirmar que su servidor funciona como se espera.

Primero, verifique los archivos de configuración principales de bind9 en busca de errores de sintaxis utilizando named-checkconf. Si este comando no produce ninguna salida, significa que sus archivos de configuración (named.conf.local, named.conf.options, etc.) son válidos.

sudo named-checkconf

A continuación, valide la sintaxis de su archivo de zona de búsqueda directa. El comando named-checkzone verifica la corrección de un archivo de zona.

sudo named-checkzone mylocaldomain.net /etc/bind/db.mylocaldomain.net

Una verificación exitosa devolverá un estado "OK" y mostrará el número de serie de su archivo de zona:

zone mylocaldomain.net/IN: loaded serial 2024052001
OK

Ahora, valide la zona de búsqueda inversa. Dado que el nombre de la zona y el nombre del archivo dependen de la dirección IP de su VM, primero recopile la información necesaria:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
ZONE_NAME="${REV_IP}.in-addr.arpa"
ZONE_FILE="/etc/bind/db.${REV_IP}"

Esto crea el nombre de zona y la ruta de archivo correctos basados en la dirección IP real de su VM.

Ahora ejecute el comando de validación de zona:

echo "Checking reverse zone: ${ZONE_NAME}"
sudo named-checkzone ${ZONE_NAME} ${ZONE_FILE}

Una verificación exitosa mostrará nuevamente un estado "OK":

zone 50.16.172.in-addr.arpa/IN: loaded serial 2024052001
OK

Antes de reiniciar, asegúrese de que el servicio bind9 pueda leer los archivos de zona estableciendo la propiedad correcta. Primero, obtenga la información de IP nuevamente para construir la ruta de archivo correcta:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')

Ahora establezca la propiedad correcta para ambos archivos de zona:

sudo chown root:bind /etc/bind/db.mylocaldomain.net "/etc/bind/db.${REV_IP}"

Con todas las configuraciones validadas, es hora de reiniciar el servicio bind9 para aplicar los cambios:

sudo systemctl restart bind9

Para estar seguro de que el servicio se inició correctamente y cargó sus nuevas zonas, verifique los registros del sistema.

sudo grep named /var/log/syslog | grep "loaded serial"

Debería ver una salida que confirme que ambas zonas se cargaron correctamente. La salida también incluirá zonas predeterminadas como localhost, lo cual es normal. La clave es encontrar las líneas para mylocaldomain.net y su zona inversa.

... named[...]: zone mylocaldomain.net/IN: loaded serial 2025071401
... named[...]: zone 50.16.172.in-addr.arpa/IN: loaded serial 2025071401
...

Si no ve estas líneas, revise la salida de sudo systemctl status bind9 en busca de errores.

Finalmente, pruebe su servidor DNS usando dig. Consultará su servidor local directamente especificando @127.0.0.1.

Primero, pruebe la búsqueda directa para webserver.mylocaldomain.net:

dig @127.0.0.1 webserver.mylocaldomain.net

En la salida, busque la ANSWER SECTION. Debería mostrar el registro A apuntando a la dirección IP de su VM y, lo que es importante, las flags en la cabecera deben incluir aa para una respuesta autoritativa. La línea SERVER en la parte inferior debe mostrar 127.0.0.1.

...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;webserver.mylocaldomain.net. IN A

;; ANSWER SECTION:
webserver.mylocaldomain.net. 604800 IN A <your_vm_ip>

;; SERVER: 127.0.0.1#53(127.0.0.1)
...

A continuación, pruebe la búsqueda inversa utilizando la bandera -x. Primero, capture la dirección IP de su VM:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

Ahora realice la prueba de búsqueda inversa:

dig @127.0.0.1 -x $IP

La ANSWER SECTION ahora debería mostrar los registros PTR que creó, mapeando su IP de vuelta a los nombres de host, y las flags deberían incluir nuevamente aa.

...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;<last_octet>.<your_reversed_network_part>.in-addr.arpa. IN PTR

;; ANSWER SECTION:
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR fileserver.mylocaldomain.net.
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR ns1.mylocaldomain.net.
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR webserver.mylocaldomain.net.

;; SERVER: 127.0.0.1#53(127.0.0.1)
...

¡Felicitaciones! Ha configurado, validado y probado con éxito un servidor DNS autoritativo básico.

Resumen

En este laboratorio, configuró un servidor DNS autoritativo local en Linux utilizando el paquete de software bind9. El proceso comenzó con la instalación de bind9 y sus utilidades esenciales, seguido de la edición del archivo global named.conf.options para definir comportamientos a nivel de servidor, como la configuración de forwarders para resolver consultas de dominios externos.

Luego creó las zonas DNS primarias: una zona de búsqueda directa para mylocaldomain.net para mapear nombres de host a direcciones IP utilizando registros A, y una zona de búsqueda inversa correspondiente para mapear direcciones IP de vuelta a nombres de host con registros PTR. El laboratorio concluyó con la fase crucial de validación, donde utilizó named-checkconf y named-checkzone para verificar errores de configuración, y luego probó la funcionalidad del servidor en vivo realizando búsquedas directas e inversas exitosas con la utilidad dig.