Instalación y configuración de un servidor DNS con Bind9

Índice

El servidor Bind9 es uno de los servidores DNS más usados. Aunque todos los proveedores de Internet cuentan con servidores DNS para permitir la navegación usando direcciones URL por Internet, en muchas ocasiones puede ser interesante contar con un servidor DNS configurado para la resolución de nombres en la red local.

Instalación y configuración básica de Bind9

En este post se usa una máquina que se llama dns1.javi.org para instalar y configurar el servidor DNS. Para darle el FQDN a la máquina se añade una línea en el fichero /etc/hosts.

127.0.1.1	dns1.javi.org dns1

Para instalar el servidor DNS se usa el gestor de paquetes apt.

sudo apt install bind9

Configuración básica de bind9

Aunque la configuración por defecto de bind9 permite usar el servidor DNS desde el momento en el que se instala, se pueden modificar algunos parámetros como, por ejemplo, el parámetro options del fichero /etc/default/named para evitar la resolución de direcciones IPv6.

OPTIONS="-4 -f -u bind"

Como bind9 sólo acepta consultas desde la red local por defecto, para poder usarlo en entornos como OpenStack, donde se usan IP flotantes o para poder consultar usando una conexión a través de una VPN, se debe modificar el parámetro allow-query del fichero /etc/bind/named.conf.options.

allow-query {172.201.0.0/16; 172.22.0.0/16;};

Para que el servidor funcione correctamente en este entorno, también es necesario desactivar el sistema de seguridad dnssec-validation en este fichero.

dnssec-validation no;

Prueba de funcionamiento

Para comprobar el funcionamiento del servidor DNS se consulta la resolución del nombre de dominio de una web, por ejemplo, “www.marca.es”.

❯ dig @172.22.201.193 www.marca.es

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> @172.22.201.193 www.marca.es
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40638
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: edae20696a6fbaf9010000006784c4660eddb44059fca349 (good)
;; QUESTION SECTION:
;www.marca.es.			IN	A

;; ANSWER SECTION:
www.marca.es.		256	IN	A	193.110.128.199

;; Query time: 132 msec
;; SERVER: 172.22.201.193#53(172.22.201.193) (UDP)
;; WHEN: Mon Jan 13 08:43:27 CET 2025
;; MSG SIZE  rcvd: 85

La consulta ha tardado 132 milisegundos. Para averiguar la IP de www.marca.es el servidor ha consultado, primero, a un servidor DNS raíz (.); después al servidor con autoridad sobre la zona .es.; y, por último, al servidor con autoridad sobre la zona marca.es..

❯ dig @172.22.201.193 www.marca.es

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> @172.22.201.193 www.marca.es
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39396
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: b6936c508548bcc9010000006784c4f0c6a5c63c576d6598 (good)
;; QUESTION SECTION:
;www.marca.es.			IN	A

;; ANSWER SECTION:
www.marca.es.		118	IN	A	193.110.128.199

;; Query time: 4 msec
;; SERVER: 172.22.201.193#53(172.22.201.193) (UDP)
;; WHEN: Mon Jan 13 08:45:45 CET 2025
;; MSG SIZE  rcvd: 85

Al volver a realizar la consulta sólo tarda 4 milisegundos. Esto se debe a que el servidor DNS ha guardado la información en la caché y, por tanto, para resolver la dirección IP en este caso sólo ha tenido que consultar sus propios registros.

Configuración de una zona directa de dominio en el servidor DNS

Para crear una zona directa para un dominio en bind9 se define la zona en el fichero /etc/bind/named.conf.local.

zone "javi.org" {
    type master;
    file "db.javi.org";
}

A continaución se crea el fichero de zona en el directorio /var/cache/bind a partir de la plantilla /etc/bind/db.empty.

debian@dns1:~$ sudo cp /etc/bind/db.empty /var/cache/bind/db.javi.org
debian@dns1:~$ sudo nano /var/cache/bind/db.javi.org

Con el siguiente contenido:

$TTL	86400
@	IN	SOA	dns1.javi.org. root.javi.org. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			  86400 )	; Negative Cache TTL
;
@	IN	NS		dns1.javi.org.
@	IN	MX	10	correo.javi.org.

$ORIGIN javi.org.

dns1			IN	A	172.22.201.193
correo			IN	A	172.22.200.101
asterix			IN	A	172.22.200.102
obelix			IN	A	172.22.200.103
www			IN	CNAME	asterix
informatica		IN	CNAME	asterix
ftp			IN	CNAME	obelix

Configuración de una zona inversa en el DNS

Esta zona también se declara en el fichero /etc/bind/named.conf.local.

zone "22.172.in-addr.arpa" {
    type master;
    file "db.172.22.0.0";
}

En este fichero también se descomenta la línea

include "/etc/bind/zones.rfc1918";

Esto evita que el DNS intente hacer la resolución inversa de las IP privadas preguntando a un servidor raíz.

Además, en el fichero /etc/bind/zones.rfc1918 hay que comentar la línea referente a la IP privada de la red cuyas direcciones sí debe resolver el servidor DNS.

//zone "22.172.in-addr.arpa"  { type master; file "/etc/bind/db.empty"; };

Por útlimo, se crea el fichero de zona en /var/cache/bind/db.172.22.0.0 a partir de la plantilla en /etc/bind/db.empty.

$TTL	86400
@	IN	SOA	dns1.javi.org. root.javi.org. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			  86400 )	; Negative Cache TTL
;
@	IN	NS		dns1.javi.org.

$ORIGIN 22.172.in-addr.arpa.

193.201			IN	PTR	dns1.javi.org.
101.200			IN	PTR	correo.javi.org.
102.200			IN	PTR	asterix.javi.org.
103.200			IN	PTR	obelix.javi.org.

Demostración del funcionamiento del DNS

Consulta de la IP de un servicio

❯ dig www.javi.org

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> www.javi.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41239
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 6e103d4f5bfd34d9010000006784ccff50d9a71428c955be (good)
;; QUESTION SECTION:
;www.javi.org.			IN	A

;; ANSWER SECTION:
www.javi.org.		86400	IN	CNAME	asterix.javi.org.
asterix.javi.org.	86400	IN	A	172.22.200.102

;; Query time: 8 msec
;; SERVER: 172.22.201.193#53(172.22.201.193) (UDP)
;; WHEN: Mon Jan 13 09:20:08 CET 2025
;; MSG SIZE  rcvd: 107

Consulta del servidor DNS con autoridad del dominio

❯ dig NS javi.org.

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> NS javi.org.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22504
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 18e226f3f575cfa3010000006784cd6c22f38adb1d38e17d (good)
;; QUESTION SECTION:
;javi.org.			IN	NS

;; ANSWER SECTION:
javi.org.		86400	IN	NS	dns1.javi.org.

;; ADDITIONAL SECTION:
dns1.javi.org.		86400	IN	A	172.22.201.193

;; Query time: 4 msec
;; SERVER: 172.22.201.193#53(172.22.201.193) (UDP)
;; WHEN: Mon Jan 13 09:21:58 CET 2025
;; MSG SIZE  rcvd: 100

Consulta del servidor de correo del dominio

❯ dig MX javi.org

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> MX javi.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5583
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 0b5cb5134bc0944b010000006784cdb40b2da6360f48f0b5 (good)
;; QUESTION SECTION:
;javi.org.			IN	MX

;; ANSWER SECTION:
javi.org.		86400	IN	MX	10 correo.javi.org.

;; ADDITIONAL SECTION:
correo.javi.org.	86400	IN	A	172.22.200.101

;; Query time: 4 msec
;; SERVER: 172.22.201.193#53(172.22.201.193) (UDP)
;; WHEN: Mon Jan 13 09:23:09 CET 2025
;; MSG SIZE  rcvd: 104

Consulta de una resolución inversa

❯ dig -x 172.22.200.102

; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> -x 172.22.200.102
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64988
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: d7dd86865fb75af6010000006784ce93495573bf53185e65 (good)
;; QUESTION SECTION:
;102.200.22.172.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
102.200.22.172.in-addr.arpa. 86400 IN	PTR	asterix.javi.org.

;; Query time: 4 msec
;; SERVER: 172.22.201.193#53(172.22.201.193) (UDP)
;; WHEN: Mon Jan 13 09:26:52 CET 2025
;; MSG SIZE  rcvd: 114

Instalación y configuración de un servidor DNS esclavo

Para ofrecer el servicio de DNS en alta disponibilidad dentro de la red local se debe configurar un segundo servidor como servidor DNS esclavo. Para ello, se usa una segunda máquina que, en este caso, se llama dns2.javi.org.

En esta máquina también se instala el servidor DNS bind9 y se configura como servidor esclavo.

Para ello, en primer lugar, se deshabilitan las transferencias de zona en el fichero /etc/bind/named.conf.options

options {
     ...
     allow-transfer { none; };
     ...
};

Warning

Esta configuración se debe hacer, en general, en todos los servidores que no tengan otros servidores esclavos a los que deban transferirles información de sus zonas de dominio.

En cambio, en el servidor DNS maestro se debe indicar a qué dirección IP se permite realizar una transferencia de zonas. En este caso, se indica la dirección del servidor esclavo. También se activa la opción que hace que el maestro envíe una notificación a los servidores esclavos cada vez que se actualiza su configuración.

include "/etc/bind/zones.rfc1918";
zone "javi.org" {
    type master;
    file "db.javi.org";
    allow-transfer { 172.22.200.110; };
    notify yes;
};
zone "22.172.in-addr.arpa" {
    type master;
    file "db.172.22.0.0";
    allow-transfer { 172.22.200.110; };
    notify yes;
};

En el servidor esclavo también se deben definir las zonas que se transfieren desde el servidor maestro y sobra las que el DNS tiene dominio. Con la opción master se indica la dirección IP del servidor maestro desde el que se transfiere la información de las zonas al esclavo.

include "/etc/bind/zones.rfc1918";
zone "javi.org" {
    type slave;
    file "db.javi.org";
    masters { 172.22.200.100; };
};
zone "22.172.in-addr.arpa" {
    type slave;
    file "db.172.22.0.0";
    masters { 172.22.200.100; };
};	

En el servidor DNS maestro también hay que añadir la información del nuevo servidor DNS de la red en el fichero de zona /var/cache/bind/db.javi.org

$TTL    86400
@       IN      SOA     dns1.javi.org. root.javi.org. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;
@	IN	NS		dns1.javi.org.
@	IN	NS		dns2.javi.org.
@	IN	MX	10	correo.javi.org.

$ORIGIN javi.org.

dns1		IN	A	172.22.200.100
dns2		IN	A	172.22.200.110

Y también en el fichero de zona de resolución inversa.

$TTL    86400
@       IN      SOA     dns1.javi.org. root.javi.org. (
                               1         ; Serial
                          604800         ; Refresh
                           86400         ; Retry
                         2419200         ; Expire
                           86400 )       ; Negative Cache TTL
;
@	IN	NS		dns1.javi.org.
@	IN	NS		dns2.javi.org.

$ORIGIN 22.172.in-addr.arpa.

100.200		IN	PTR		dns1.javi.org.
110.200		IN	PTR		dns2.javi.org.

Cada vez que se modifique la información de la zona sobre la que tiene autoridad el servidor DNS maestro se debe aumentar el número de serie del fichero de configuración de zona. De esta forma, el servidor DNS esclavo actualizará sus registros para que sean idénticos a los del maestro.

Configuración de una subdelegación de dominio

El primer paso para configurar la delegación de un subdominio a un servidor DNS diferente al servidor DNS del dominio principal es añadir al fichero de zona del dominio principal las líneas necearias para realizar la delegación del subdominio.

$ORIGIN informatica.javi.org.

@                       IN      NS      dns3
dns3                    IN      A       172.22.200.203

Después, en el servidor DNS delegado se debe crear, primero, la configuración básica del servidor DNS en el fichero /etc/bind/named.conf.local.

zone "informatica.javi.org" { 
    type master;
    file "db.informatica.javi.org";
};

Y, a continuación, hay que crear también el fichero de zona /var/cache/bind/db.informatica.javi.org

$TTL    86400
@       IN      SOA     dns.informatica.javi.org. root.informatica.javi.org. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;
@       IN      NS              dns.informatica.javi.org.
@       IN      MX      10      mail.informatica.javi.org.

$ORIGIN informatica.javi.org.

dns3                    IN      A       172.22.200.203
mail                    IN      A       172.22.200.201
web                     IN      A       172.22.200.202
www                     IN      CNAME   web
comments powered by Disqus

Relacionados

Configuración de un servidor SAN

En este post se muestran, a través de un caso práctico, algunos ejemplos de configuración de un servidor SAN.

Leer

Gestión de recursos compartidos en Windows Active Directory con cmd y Powershell

Active Directory o Directorio Activo es un servicio de directorio de Windows en el que un equipo servidor comparte recursos como usuarios, grupos o directorios con los equipos clientes que se conectan a él.

Leer

Instalación desatendida por red de Debian12

En este post se recogen varias opciones alternativas para la configuración de un servicio de instalación desatendida de Debian 12 por red.

Leer