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, en192.168.1.10 - Otras máquinas:
router(192.168.1.1),nas(192.168.1.20) ynube(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 formatoAAAAMMDDnn(fecha más un contador del día) es la costumbre más práctica. NSdice qué servidor es la autoridad de la zona: el tuyo.- Cada
Aasocia un nombre a una dirección IPv4. Para IPv6 se usaAAAA. CNAMEcrea 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:
- Añade su línea
Aendb.home.arpay suPTRendb.192.168.1. - Sube el número de serie en los dos archivos (por ejemplo, de
2026101801a2026101802). - Compruébalos con
named-checkzone. - 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.
