Como instalar y configurar un servidor dns con bind9 en Debian 12

bind9

¿Que es bind9?

Bind9 es un servidor de nombres de dominio (DNS) de código abierto. Es el servidor DNS más utilizado en Internet, especialmente en sistemas basados ​​en Unix.

Requisitos

  • Sistema Debian 12 actualizado.
  • Privilegios de root o sudo.
  • Acceso a internet.
  • Conocimientos básicos de DNS.

Instalación de bind9

Para instalar bind9 en Debian 12, abrimos una terminal y ejecutamos el siguiente comando:

root@bind9:~# apt install bind9 -y

Configuración de bind9

Vamos a configurar bind9 para que resuelva los nombres de dominio de forma local, para ello editamos el archivo /etc/bind/named.conf.local:

root@bind9:~# nano /etc/bind/named.conf.local

Configuraremos bind9 para que realice resolución del dominio local “example.com” tanto de forma directa como inversa, para ello agregamos las siguientes lineas al archivo:

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
};

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

Creamos los archivos de zona para example.com y 50.168.192.in-addr.arpa copiando los archivos de ejemplo:

root@bind9:~# cp /etc/bind/db.local /etc/bind/db.example.com
root@bind9:~# cp /etc/bind/db.127 /etc/bind/db.192

Editamos el archivo /etc/bind/db.example.com con las siguiente condiciones:

  • Adaptamos la configuración a nuestro dominio local.
  • Resolución del nombre de nuestro servidor dns que en mi caso tiene la ip 192.168.50.29 y tendrá el nombre dns.example.com.
  • Debe resolver el nombre de una segunda máquina que en mi caso tiene ip 192.168.50.19 con un registro A web.example.com y un registro CNAME -www.example.com.
root@bind9:~# nano /etc/bind/db.example.com
;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     dns.example.com. root.example.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      dns.example.com.

$ORIGIN example.com.

dns     IN      A       192.168.50.29
web     IN      A       192.168.50.19
www     IN      CNAME   web

Editamos el archivo /etc/bind/db.192 con las siguiente condiciones:

  • Adaptamos la configuración a nuestro dominio local.
  • Resolución inversa de la ip
root@bind9:~# nano /etc/bind/db.192
;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     dns.example.com. root.example.com. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      dns.example.com.

$ORIGIN 50.168.192.in-addr.arpa.
29      IN      PTR     dns.example.com.
19      IN      PTR     web.example.com.

Ahora modificamos el fichero named.conf.options para que permita las consultas desde nuestra red local, y para habilitar el forwarder para que resuelva los nombres de dominio que no estén en nuestra zona local:

root@bind9:~# nano /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        forwarders {
          192.168.50.1;
        };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;
        allow-query {192.168.50.0/24;};
        listen-on-v6 { any; };
};

Reiniciamos el servicio bind9 para que cargue la nueva configuración:

root@bind9:~# systemctl restart bind9

Prueba de funcionamiento en cliente Rocky Linux 9

Tenemos 3 máquinas:

  • Servidor dns bind9
  • Servidor web apache2
  • Cliente Rocky Linux 9

Desde el cliente Rocky Linux 9 vamos a comprobar que podemos resolver los nombres de dominio de nuestra zona local example.com utilizando tanto la terminal como el navegador web.

Comprobación desde la terminal

Desde la terminal del cliente Rocky Linux 9 ejecutamos el siguiente comando:

root@rocky:~# nslookup www.example.com

Como podemos ver en la salida, el cliente Rocky Linux 9 ha resuelto el nombre de dominio <www.example.com> y nos ha mostrado la ip y que es un alias (cname) de web.example.com:

Salida:

[root@localhost ~]# nslookup www.example.com
Server:         192.168.50.29
Address:        192.168.50.29#53

www.example.com canonical name = web.example.com.
Name:   web.example.com
Address: 192.168.50.19

Comprobación desde el navegador web

Desde el navegador web del cliente Rocky Linux 9 introducimos la dirección web.example.com y nos mostrará la página web del servidor web apache2:

-www.example.com

web-example

-web.example.com

web-example2

Como podemos ver, hemos accedido a la página web del servidor web utilizando sus dos nombres de dominio: <www.example.com> y web.example.com sin ningún problema.

Comprobación de resolución inversa desde la terminal

Desde la terminal del cliente Rocky Linux 9 ejecutamos los siguientes comandos:

root@rocky:~# nslookup 192.168.50.29
root@rocky:~# nslookup 192.168.50.19

Como podemos ver en la salida, el cliente Rocky Linux 9 ha resuelto las ips y nos ha mostrado los nombres de dominio:

Salida:

[root@localhost ~]# nslookup 192.168.50.29
29.50.168.192.in-addr.arpa      name = dns.example.com.

[root@localhost ~]# nslookup 192.168.50.19
19.50.168.192.in-addr.arpa      name = web.example.com.