Tu Propio Servidor DNS: Guía de Configuración Bind9 en Debian Desde Cero

Aquí tienes algunas opciones de título que barajé para este artículo:

  1. Tu Propio Servidor DNS: Guía de Configuración Bind9 en Debian Desde Cero
  2. Domina Bind9 en Debian: Instalación y Configuración DNS Paso a Paso para Novatos
  3. Configura Bind9 en Debian Fácil: La Guía Definitiva para tu Primer Servidor DNS

Tu Propio Servidor DNS: Guía de Configuración Bind9 en Debian Desde Cero

Seguro que has oído hablar del DNS (Sistema de Nombres de Dominio) mil veces. Es esa pieza fundamental de internet que traduce nombres que entendemos los humanos, como www.google.com, a direcciones IP que entienden las máquinas. Sin DNS, navegar por la web sería como intentar encontrar una casa sin saber su dirección postal, solo con el nombre de la calle. Hoy vamos a ver cómo crear un servidor DNS con Bind9 en Debian, el software de servidor DNS más utilizado en el mundo, y lo haremos con una guía de configuración DNS local Bind9 Debian pensada para que puedas seguirla sin problemas.

Tener tu propio servidor DNS en tu red local, ya sea en casa o en una pequeña oficina, tiene varias ventajas. Te da un control total sobre las resoluciones de nombres, puede mejorar ligeramente la velocidad de navegación para los dominios que consultas frecuentemente (gracias al caché local) y, sobre todo, es una forma excelente de aprender cómo funciona una parte crítica de la infraestructura de red. Para los que estamos metidos en temas de sistemas y ahora en ciberseguridad, entender estos servicios a fondo es oro puro. Además, para procesos como la certificación ISO27001, tener un control granular sobre servicios de red como el DNS es un punto a favor.

Usaremos Debian por su estabilidad y popularidad en servidores, y Bind9 porque es el estándar de facto. Esta guía te mostrará cómo configurar servidor DNS Bind9 Debian paso a paso.

Antes de Empezar: Prerrequisitos

Antes de lanzarnos a la piscina, asegúrate de tener lo siguiente:

  1. Un sistema Debian instalado y actualizado: Puede ser una máquina física o una máquina virtual. Si no lo tienes al día, un sudo apt update && sudo apt upgrade es tu primer paso.
  2. Acceso a la línea de comandos con privilegios de superusuario (sudo).
  3. Una dirección IP estática configurada en el servidor Debian. Esto es crucial, ya que un servidor DNS no puede estar cambiando de IP. Por ejemplo, usaremos 192.168.1.10 en esta guía. Adapta los ejemplos a tu propia configuración de red.

Paso 1: Instalación de Bind9 en Debian

Lo primero es lo primero: instalar el software. Abrimos una terminal en nuestro servidor Debian y ejecutamos:

sudo apt update

sudo apt install bind9 bind9utils bind9-doc dnsutils

  • bind9: Es el servidor DNS en sí.
  • bind9utils: Contiene herramientas útiles para administrar y probar Bind9, como named-checkconf y named-checkzone.
  • bind9-doc: Documentación adicional, siempre útil.
  • dnsutils: Proporciona herramientas de cliente DNS como dig y nslookup, imprescindibles para las pruebas.

Una vez instalado, el servicio Bind9 (llamado named) debería iniciarse automáticamente. Puedes comprobarlo con:

systemctl status bind9

O también puedes ver la versión instalada con:

named -v

Si todo ha ido bien, ¡ya tienes Bind9 instalado! Este es el primer hito en nuestra tarea de instalar Bind9 Debian para principiantes.

Paso 2: Entendiendo la Estructura de Bind9 y Configuración Inicial

Bind9 tiene varios archivos de configuración importantes, ubicados principalmente en /etc/bind/:

  • named.conf: El archivo principal de configuración. Generalmente, no se edita directamente, sino que incluye otros archivos.
  • named.conf.options: Aquí se configuran las opciones globales del servidor DNS, como los forwarders (reenviadores) y las políticas de acceso.
  • named.conf.local: Este es el archivo donde definiremos nuestras zonas DNS personalizadas (tanto directas como inversas).

Vamos a editar named.conf.options para realizar algunos ajustes básicos. Usa tu editor de texto favorito (nano, vim, etc.):

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

Dentro del bloque options { ... };, asegúrate de tener o añadir lo siguiente:

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

    // Configura aquí los DNS a los que tu servidor consultará
    // si no conoce una dirección. Pueden ser los de tu ISP o públicos.
    forwarders {
        1.1.1.1; // Cloudflare
        8.8.8.8; // Google
        // Pon aquí los de tu ISP si lo prefieres
    };

    // Permite consultas recursivas solo desde localhost y tu red local.
    // ¡Importante por seguridad para no convertirte en un open resolver!
    allow-query { localhost; localnets; }; 
    // 'localnets' incluye todas las subredes a las que el servidor está conectado directamente.
    // Si quieres ser más específico, puedes poner tu rango de IP, ej: 192.168.1.0/24;

    recursion yes; // Permite que tu servidor haga consultas recursivas por los clientes.

    dnssec-validation auto; // Habilita la validación DNSSEC si los forwarders la soportan.

    listen-on-v6 { any; }; // Si usas IPv6. Si no, puedes poner { none; }.
    listen-on { any; }; // Escucha en todas las interfaces IPv4. Puedes especificar la IP de tu servidor.
};

Expliquemos algunos puntos:

  • forwarders: Si tu servidor DNS no tiene la respuesta para una consulta (por ejemplo, www.google.com), se la preguntará a estos servidores.
  • allow-query: Define quién puede hacer consultas a tu servidor. localhost es el propio servidor, y localnets se refiere a las redes a las que el servidor está directamente conectado (por ejemplo, tu LAN). Es vital restringir esto para evitar que tu servidor sea usado en ataques de amplificación DNS.
  • recursion yes: Indica que tu servidor puede realizar consultas recursivas en nombre de los clientes permitidos.

Guarda el archivo y cierra el editor.

Paso 3: Creando tu Primera Zona DNS Directa (Forward Lookup Zone)

Una zona directa es la que traduce nombres de host a direcciones IP (ej: servidor.mihogar.lan -> 192.168.1.10). Vamos a crear una para nuestra red local. Usaremos el dominio ficticio mihogar.lan. Puedes usar el que prefieras, pero se recomienda usar dominios .lan, .local, .internal o similares que no sean dominios públicos reales para evitar conflictos.

Primero, editamos named.conf.local para decirle a Bind9 que somos la autoridad para esta zona:

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

Añade lo siguiente al final del archivo:

zone "mihogar.lan" {
    type master;
    file "/etc/bind/zones/db.mihogar.lan"; // Ruta al archivo que contendrá los registros de esta zona
    allow-transfer { none; }; // Opcional: IPs de servidores DNS esclavos si los tuvieras
    // allow-update { none; }; // Por defecto, no permitir actualizaciones dinámicas
};
  • type master: Indica que este servidor es el maestro (primario) para esta zona.
  • file: Especifica la ruta al archivo de definición de la zona. Tendremos que crear este archivo.

Ahora, creamos el directorio donde guardaremos nuestros archivos de zona (si no existe):

sudo mkdir -p /etc/bind/zones

Y creamos el archivo de zona db.mihogar.lan:

sudo nano /etc/bind/zones/db.mihogar.lan

Este archivo contendrá los registros DNS para mihogar.lan. Aquí un ejemplo básico:

$TTL 604800 ; Tiempo de Vida (Time To Live) por defecto para los registros (1 semana)
@   IN  SOA ns1.mihogar.lan. admin.mihogar.lan. (
            2024072101  ; Serial (Importante: ¡incrementar cada vez que cambies el archivo!)
            604800      ; Refresh (1 semana)
            86400       ; Retry (1 día)
            2419200     ; Expire (4 semanas)
            604800 )    ; Negative Cache TTL (1 semana)
;
; Servidores de Nombres (NS) para la zona
@   IN  NS  ns1.mihogar.lan.

; Registros de Host (A) - Nombre a IPv4
; El '@' se refiere al propio dominio de la zona (mihogar.lan)
; Si quieres un registro para mihogar.lan, puedes usar @ o dejarlo en blanco
; ns1 es el nombre de nuestro servidor DNS
ns1         IN  A   192.168.1.10    ; IP de tu servidor Bind9
servidor    IN  A   192.168.1.10    ; Si el mismo servidor tiene otro nombre
pc-javier   IN  A   192.168.1.50
impresora   IN  A   192.168.1.60
router      IN  A   192.168.1.1

Algunas claves sobre este archivo:

  • $TTL: El Tiempo de Vida por defecto para los registros. Otros servidores DNS cachearán estos registros durante este tiempo.
  • SOA (Start of Authority): Define información autoritativa sobre la zona.
  • ns1.mihogar.lan. es el servidor de nombres primario para la zona (el punto final es importante).
  • admin.mihogar.lan. es el email del administrador (reemplaza el primer punto por @, o sea, admin@mihogar.lan).
  • Serial: ¡Este número es crucial! Cada vez que modifiques este archivo, debes incrementar este número. Es la forma en que los servidores DNS esclavos (si los tuvieras) saben que la zona ha cambiado. Un formato común es YYYYMMDDNN (AñoMesDíaNúmeroDeSerieDelDía).
  • NS (Name Server): Declara el servidor de nombres para esta zona. ns1.mihogar.lan. apunta a nuestro propio servidor.
  • A (Address Record): Asocia un nombre de host con una dirección IPv4.
  • ns1 IN A 192.168.1.10: Define que ns1.mihogar.lan tiene la IP 192.168.1.10.
  • Los nombres sin punto al final se consideran relativos a la zona (ej: pc-javier se convierte en pc-javier.mihogar.lan).

Guarda el archivo y cierra el editor.

Paso 4: Configurando una Zona DNS Inversa (Reverse Lookup Zone) – ¡Muy Recomendable!

Una zona inversa hace lo contrario a una directa: traduce una dirección IP a un nombre de host (ej: 192.168.1.50 -> pc-javier.mihogar.lan). Aunque no es estrictamente obligatoria para que el DNS funcione, muchos servicios y aplicaciones la utilizan para verificación o logging, por lo que es muy recomendable configurarla.

Para una red 192.168.1.0/24, el nombre de la zona inversa es 1.168.192.in-addr.arpa. Fíjate que los octetos de la red van en orden inverso.

Editamos de nuevo named.conf.local:

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

Y añadimos la definición de la zona inversa:

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1"; // Archivo para los registros de la zona inversa
    allow-transfer { none; };
    // allow-update { none; };
};

Guarda y cierra. Ahora creamos el archivo db.192.168.1:

sudo nano /etc/bind/zones/db.192.168.1

Y añadimos su contenido:

$TTL 604800
@   IN  SOA ns1.mihogar.lan. admin.mihogar.lan. (
            2024072101  ; Serial (¡Incrementar si cambias!)
            604800      ; Refresh
            86400       ; Retry
            2419200     ; Expire
            604800 )    ; Negative Cache TTL
;
; Servidor de Nombres
@   IN  NS  ns1.mihogar.lan.

; Registros PTR - IP a Nombre
; Solo se pone el último octeto de la IP, ya que el resto está definido en el nombre de la zona
10  IN  PTR ns1.mihogar.lan.        ; 192.168.1.10 -> ns1.mihogar.lan.
10  IN  PTR servidor.mihogar.lan.   ; También para el mismo servidor si tiene múltiples nombres
50  IN  PTR pc-javier.mihogar.lan.  ; 192.168.1.50 -> pc-javier.mihogar.lan.
60  IN  PTR impresora.mihogar.lan.  ; 192.168.1.60 -> impresora.mihogar.lan.
1   IN  PTR router.mihogar.lan.     ; 192.168.1.1 -> router.mihogar.lan.
  • PTR (Pointer Record): Asocia una dirección IP con un nombre de host canónico.
  • Los números a la izquierda (10, 50, 60, 1) son el último octeto de la dirección IP. El nombre del host debe ser completo (FQDN), terminando con un punto.

Guarda y cierra el archivo. No olvides incrementar el serial si haces cambios.

Paso 5: Verificación de Sintaxis y Aplicación de Cambios

Antes de reiniciar Bind9, es fundamental comprobar que no hay errores de sintaxis en nuestros archivos de configuración.

  1. Comprobar la configuración general de Bind9 (named.conf y los archivos que incluye):

sudo named-checkconf

Si no muestra nada, es que todo está correcto. Si hay errores, te indicará el archivo y la línea.

  1. Comprobar la sintaxis de la zona directa:

sudo named-checkzone mihogar.lan /etc/bind/zones/db.mihogar.lan

Deberías ver algo como: zone mihogar.lan/IN: loaded serial 2024072101 OK

  1. Comprobar la sintaxis de la zona inversa:

sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1

Deberías ver: zone 1.168.192.in-addr.arpa/IN: loaded serial 2024072101 OK

Si todas las comprobaciones son correctas, ¡es hora de reiniciar Bind9 para que cargue la nueva configuración!

sudo systemctl restart bind9

Y comprobamos su estado:

sudo systemctl status bind9

Debería mostrarse como active (running). Si hay problemas, puedes consultar los logs del sistema para más pistas:

sudo journalctl -u bind9 -f

// O también en:

// sudo tail -f /var/log/syslog | grep named

Paso 6: Configurando los Clientes DNS para Usar tu Nuevo Servidor

Ahora que tu servidor DNS está funcionando, necesitas que los equipos de tu red lo usen.

  1. En el propio servidor Debian:

Puedes configurar /etc/resolv.conf para que use 127.0.0.1 (localhost) como su primer servidor de nombres.

Edita /etc/resolv.conf:

    nameserver 127.0.0.1
    nameserver 1.1.1.1 ; Un fallback, por si acaso
    search mihogar.lan

Ten en cuenta que /etc/resolv.conf puede ser sobrescrito por systemd-resolved o NetworkManager. La forma «correcta» de configurarlo permanentemente depende de cómo gestiones la red en tu Debian (ej: netplan, ifupdown en /etc/network/interfaces, o configuración de systemd-resolved). Para systemd-resolved, editarías /etc/systemd/resolved.conf. Para netplan, el archivo YAML en /etc/netplan/.

  1. En otros clientes de la red (Windows, Linux, macOS):

Deberás ir a la configuración de red de cada cliente y cambiar el servidor DNS para que apunte a la IP de tu servidor Bind9 (ej: 192.168.1.10).

  1. En tu router (la mejor opción para la mayoría de redes domésticas):

Si tu router lo permite, la forma más sencilla es configurar su servidor DHCP para que anuncie la IP de tu servidor Bind9 (192.168.1.10) como el servidor DNS para todos los clientes que obtengan una IP por DHCP. Así, no tendrás que configurar cada cliente manualmente.

Paso 7: ¡A Probar! Verificando que Todo Funciona

Este es el momento de la verdad. Desde un cliente que esté usando tu nuevo servidor DNS (o desde el propio servidor, si lo configuraste para usar 127.0.0.1), abre una terminal y prueba lo siguiente (usando los ejemplos de mihogar.lan y las IPs definidas):

Pruebas de resolución directa:

nslookup pc-javier.mihogar.lan

// Debería devolver la IP 192.168.1.50 y mostrar que la respuesta vino de tu servidor (192.168.1.10).

dig pc-javier.mihogar.lan

// dig da información más detallada. Busca la sección ANSWER SECTION.

Pruebas de resolución inversa:

nslookup 192.168.1.50

// Debería devolver el nombre pc-javier.mihogar.lan.

dig -x 192.168.1.50

// El -x es para consultas inversas.

Prueba de resolución de nombres externos (para verificar los forwarders):

nslookup www.google.com

// Debería resolver correctamente. La primera vez puede tardar un poco más mientras tu servidor consulta a los forwarders. Las siguientes serán más rápidas por el caché.

Si todas estas pruebas funcionan, ¡enhorabuena! Has conseguido configurar servidor DNS Bind9 Debian paso a paso y ahora tienes tu propio servidor DNS resolviendo nombres para tu red local y para internet.

Conclusión y Próximos Pasos

Montar tu propio servidor DNS con Bind9 en Debian puede parecer una tarea compleja al principio, pero como has visto, siguiendo una guía configuración DNS local Bind9 Debian como esta, es totalmente factible. Ahora tienes un mayor control sobre las resoluciones de nombres en tu red, una pequeña mejora de rendimiento potencial y, lo más importante, un conocimiento más profundo de cómo funciona esta tecnología esencial.

Este es solo el comienzo. Desde aquí, puedes explorar:

  • Añadir más registros: Registros MX para servidores de correo, CNAME para alias, TXT para diversas verificaciones, etc.
  • Seguridad avanzada: Considera ejecutar Bind9 en un entorno chroot para mayor aislamiento, o investigar sobre DNSSEC para validar la autenticidad de las respuestas DNS (aunque esto es más complejo).
  • Mantenimiento: Recuerda actualizar Bind9 cuando salgan nuevas versiones y revisar los logs periódicamente. ¡Y no olvides incrementar el número de serie en tus archivos de zona cada vez que los modifiques!
  • Zonas esclavas: Si tienes una red más grande, podrías configurar servidores DNS esclavos que repliquen las zonas desde tu maestro.

Espero que esta guía para instalar Bind9 Debian para principiantes te haya sido de utilidad. Entender y gestionar servicios como DNS es una habilidad valiosa, tanto para la administración de sistemas como para la ciberseguridad – algo en lo que, como sabéis, he estado bastante metido últimamente con la certificación ISO27001 en la empresa. Un DNS bien configurado es un pilar para una red robusta y segura.

Si tienes alguna duda, tropiezas con algún problema o quieres compartir tu experiencia configurando Bind9, ¡no dudes en dejar un comentario! ✅

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *