Instalación y configuración de un servidor DNS con Bind9
- Francisco Javier Huete
- Servicios
- January 16, 2025
Í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