Laboratorio
Intermedio BIND 9.18 · Ubuntu 24.04 · Debian 12
cableando
Tu propio DNS en casa con BIND

Tu propio DNS en casa con BIND

Intermedio BIND 9.18 · Ubuntu 24.04 · Debian 12

Cuando empiezas a montar servicios en casa o en tu pequeña red —un NAS, una nube propia, una pantalla con estadísticas—, acabas con una lista de direcciones IP apuntada en algún sitio. Un servidor DNS propio te deja llamarlos por su nombre: nas.home.arpa, nube.home.arpa. Y de paso decides tú a quién se le preguntan los nombres de internet, en lugar de dejárselo al proveedor de turno.

En este tutorial montarás BIND, el servidor DNS más veterano y extendido, para que:

  • resuelva los nombres de las máquinas de tu red, en los dos sentidos (de nombre a IP y de IP a nombre);
  • resuelva también cualquier nombre de internet para los equipos de tu red;
  • no atienda a nadie de fuera.

El plan

Usaremos esta red de ejemplo; cámbiala por la tuya:

  • Red: 192.168.1.0/24
  • Servidor DNS: ns1, en 192.168.1.10
  • Otras máquinas: router (192.168.1.1), nas (192.168.1.20) y nube (192.168.1.30)

Como dominio usaremos home.arpa. Está reservado precisamente para redes domésticas y privadas (RFC 8375): nunca existirá en internet, así que no chocará con nada. Evita inventarte terminaciones como .lan o .casa, que podrían acabar existiendo, y .local, que ya la usa otro sistema (mDNS) para descubrir dispositivos.

Necesitas un servidor con Ubuntu o Debian en esa red, con IP fija y un usuario con sudo (primeros pasos de un servidor Linux).

Paso 1: instalar BIND

sudo apt update
sudo apt install bind9 bind9-utils bind9-dnsutils

bind9 es el servidor; los otros dos traen las herramientas para comprobar la configuración y hacer consultas, como dig.

Paso 2: las opciones generales

Las opciones del servidor están en /etc/bind/named.conf.options. Ábrelo:

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

Y sustituye su contenido por este:

/etc/bind/named.conf.options

// Quién puede usar este servidor: el propio servidor y la red local
acl "red_local" {
    127.0.0.1;
    ::1;
    192.168.1.0/24;
};

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

    // Resolver nombres de internet, pero solo para la red local
    recursion yes;
    allow-recursion { red_local; };
    allow-query { red_local; };

    // Nadie se lleva una copia de nuestras zonas
    allow-transfer { none; };

    // Escuchar en el propio servidor y en su IP de la red local
    listen-on { 127.0.0.1; 192.168.1.10; };
    listen-on-v6 { none; };

    // Comprobar las firmas DNSSEC de las respuestas
    dnssec-validation auto;
};

Lo importante aquí es la lista red_local: solo esas direcciones pueden hacer consultas. Un servidor DNS que responde a cualquiera en internet (un resolutor abierto) acaba usado en ataques de denegación de servicio contra terceros.

Fíjate en lo que no está: no hay forwarders. Sin ellos, tu BIND resuelve los nombres de internet por su cuenta, preguntando desde los servidores raíz hacia abajo. Es un poco más lento la primera vez que se consulta cada nombre (luego queda en caché), pero ningún tercero ve el conjunto de tus consultas. Si prefieres delegar en un resolutor externo, añade dentro de options uno que respete la privacidad, como Quad9:

/etc/bind/named.conf.options

    forwarders { 9.9.9.9; 149.112.112.112; };

Paso 3: declarar las zonas

Una zona es el conjunto de nombres del que tu servidor es la autoridad. Necesitas dos: la directa (home.arpa, de nombre a IP) y la inversa (de IP a nombre). La inversa tiene un nombre curioso: los números de la red, al revés, seguidos de in-addr.arpa.

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

/etc/bind/named.conf.local

zone "home.arpa" {
    type primary;
    file "/etc/bind/zones/db.home.arpa";
};

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

Crea la carpeta donde vivirán sus archivos:

sudo mkdir /etc/bind/zones

Paso 4: la zona directa

sudo nano /etc/bind/zones/db.home.arpa

/etc/bind/zones/db.home.arpa

$TTL 3600
@   IN  SOA ns1.home.arpa. admin.home.arpa. (
        2026101801  ; número de serie: súbelo en cada cambio
        3600        ; cada cuánto revisan los servidores secundarios
        900         ; reintento si falla la revisión
        604800      ; caducidad si el primario no responde
        300 )       ; cuánto se recuerda que un nombre no existe

; El servidor que manda en esta zona
@       IN  NS      ns1.home.arpa.

; Las máquinas de la red
ns1     IN  A       192.168.1.10
router  IN  A       192.168.1.1
nas     IN  A       192.168.1.20
nube    IN  A       192.168.1.30

; Un alias: fotos.home.arpa lleva a la misma máquina que nube
fotos   IN  CNAME   nube

Cómo leerlo:

  • La primera parte (SOA) son los datos de la zona. El más importante es el número de serie: cada vez que cambies algo, súbelo. El formato AAAAMMDDnn (fecha más un contador del día) es la costumbre más práctica.
  • NS dice qué servidor es la autoridad de la zona: el tuyo.
  • Cada A asocia un nombre a una dirección IPv4. Para IPv6 se usa AAAA.
  • CNAME crea un alias de otro nombre.

Los puntos al final de los nombres completos (ns1.home.arpa.) no son una errata: indican que el nombre está completo. Los nombres sin punto (nas) se completan con el de la zona.

Paso 5: la zona inversa

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

/etc/bind/zones/db.192.168.1

$TTL 3600
@   IN  SOA ns1.home.arpa. admin.home.arpa. (
        2026101801 3600 900 604800 300 )

@   IN  NS      ns1.home.arpa.

10  IN  PTR     ns1.home.arpa.
1   IN  PTR     router.home.arpa.
20  IN  PTR     nas.home.arpa.
30  IN  PTR     nube.home.arpa.

Cada registro PTR dice, para el último número de una IP de la red, a qué nombre corresponde. Aquí sí hay que escribir los nombres completos, con su punto final.

Paso 6: comprobar antes de arrancar

BIND es estricto: un punto y coma de menos y no carga la zona. Comprueba la configuración (si no dice nada, está bien):

sudo named-checkconf

Y cada zona:

sudo named-checkzone home.arpa /etc/bind/zones/db.home.arpa
sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1
zone home.arpa/IN: loaded serial 2026101801
OK
zone 1.168.192.in-addr.arpa/IN: loaded serial 2026101801
OK

Paso 7: arrancar y abrir el puerto

sudo systemctl restart named

El DNS usa el puerto 53, por UDP y por TCP. Ábrelo en el cortafuegos, solo para tu red:

sudo ufw allow from 192.168.1.0/24 to any port 53

Paso 8: probarlo

Desde el propio servidor, pregunta por una de tus máquinas:

dig @192.168.1.10 nas.home.arpa +short
192.168.1.20

La consulta inversa, de IP a nombre:

dig @192.168.1.10 -x 192.168.1.20 +short
nas.home.arpa.

Y un nombre de internet, para comprobar que también resuelve hacia fuera:

dig @192.168.1.10 cableando.net +short

Si las tres responden, tu servidor DNS funciona.

Paso 9: que los equipos lo usen

Falta que los equipos de tu red pregunten a tu servidor y no al de antes.

La forma más cómoda es el router. En la configuración de su servidor DHCP (el que reparte las direcciones), pon 192.168.1.10 como servidor DNS. Cada equipo lo recibirá automáticamente la próxima vez que se conecte. Si el router lo permite, indica también home.arpa como dominio de búsqueda.

En un servidor Ubuntu con IP fija, se configura con netplan. Edita su archivo en /etc/netplan/ y añade los servidores DNS a la interfaz:

/etc/netplan/50-cloud-init.yaml

network:
  version: 2
  ethernets:
    eth0:
      nameservers:
        addresses: [192.168.1.10]
        search: [home.arpa]

Aplica el cambio con sudo netplan try, que lo deshace solo si pierdes la conexión, y comprueba con resolvectl status que el equipo usa el DNS nuevo. Con el dominio de búsqueda configurado, basta con escribir nas en lugar de nas.home.arpa.

En un escritorio, cambia el DNS en la configuración de red del sistema (en GNOME, en los ajustes de la conexión; en Windows y macOS, en las propiedades del adaptador de red).

Mantenerlo al día

Para añadir una máquina nueva, por ejemplo impresora en 192.168.1.40:

  1. Añade su línea A en db.home.arpa y su PTR en db.192.168.1.
  2. Sube el número de serie en los dos archivos (por ejemplo, de 2026101801 a 2026101802).
  3. Compruébalos con named-checkzone.
  4. Recarga las zonas:
sudo rndc reload

Para quitar una, igual pero borrando sus líneas. Y si un día notas que un cambio no se aplica, casi siempre es porque olvidaste subir el número de serie.

Un segundo servidor (opcional)

Si tu red depende del DNS, un segundo servidor evita que todo deje de funcionar cuando el primero se reinicia. El segundo no se configura a mano: copia las zonas del primero automáticamente.

En el primario (192.168.1.10), autoriza la copia y avisa de los cambios añadiendo a cada zona de named.conf.local:

/etc/bind/named.conf.local

    allow-transfer { 192.168.1.11; };
    also-notify { 192.168.1.11; };

Y añade el segundo servidor a la zona directa (con su NS y su A, y su PTR en la inversa), subiendo el número de serie.

En el secundario (192.168.1.11), instala BIND con las mismas opciones (cambiando su IP en listen-on) y declara las zonas así:

/etc/bind/named.conf.local

zone "home.arpa" {
    type secondary;
    primaries { 192.168.1.10; };
    file "db.home.arpa";
};

zone "1.168.192.in-addr.arpa" {
    type secondary;
    primaries { 192.168.1.10; };
    file "db.192.168.1";
};

Tras reiniciar los dos, el secundario descargará las zonas. Reparte las dos IP como servidores DNS en el router y listo.

Hecho

Tu red ya habla por nombres, y las consultas a internet pasan por un servidor que controlas tú. A partir de aquí, cada servicio que montes tendrá su nombre: es un paso pequeño que hace que tu infraestructura se parezca mucho más a algo propio.

X LinkedIn
¿Te ha resultado útil?

Sigue leyendo

Tu servidor web con Nginx

Tutorial / Sistemas

Tu servidor web con Nginx

Publica tu web desde tu propio servidor: instala Nginx, abre el cortafuegos, crea tu primer sitio con dominio y úsalo de puerta a tus apps.

/7 min

HTTPS gratis con Let’s Encrypt

Tutorial / Sistemas

HTTPS gratis con Let’s Encrypt

Cifra tu web en cinco minutos y olvídate: certificado gratuito de Let's Encrypt con Certbot y Nginx, que se renueva solo cada 90 días.

/5 min

Primeros pasos con un servidor Linux

Tutorial / Sistemas

Primeros pasos con un servidor Linux

Diez minutos que te ahorran disgustos: actualizar, crear tu usuario, activar el cortafuegos y preparar SSH en Ubuntu, Debian o AlmaLinux.

/7 min