Cómo instalar el servidor DNS Bind en CentOS 7

En este artículo veremos cómo instalar el servidor DNS Bind en CentOS 7 paso a paso, de modo que al final de este tutorial tendrás disponible para tu red local un servicio DNS capaz de resolver nombres de Internet y del dominio de tu red local.

Antes de instalar el servidor DNS Bind en CentOS 7

Para completar esta breve guía de instalación del servidor DNS Bind en CentOS 7 necesitarás partir de unos mínimos requerimientos:

  • Un sistema CentOS 7 actualizado.
  • Acceso a consola como root o un usuario con permisos de sudo.
  • Conexión a Internet.
  • Otros sistemas en red para probar el servicio.

En este tutorial trabajaremos sobre una red 192.168.1.0/24, con un servidor CentOS 7 en la dirección IP 192.168.1.199 que será el que actúe como servidor DNS. Adicionalmente, configuraremos el servicio Bind para ofrecer resolución de nombres para el dominio dominio.lan.

Cómo instalar el servidor DNS Bind en CentOS 7

Para instalar el servidor DNS Bind en CentOS 7 usaremos los paquetes de la distribución, así que como primer paso actualizaremos las listas y los paquetes instalados:

~$ sudo yum update -y

El paquete que necesitamos es bind, aunque también añadiremos el paquete bind-utils para poder usar algunas herramientas interesantes. Todos estos paquetes los instalaremos con yum:

~$ sudo yum install -y bind bind-utils

Tras la descarga e instalación de los paquetes, un nuevo servicio está disponible en CentOS 7, el servicio named.service o named para abreviar. Para que el servicio DNS named arranque con cada inicio de CentOS 7 tendremos que habilitarlo con systemctl:

~$ sudo systemctl enable named

Todavía no vamos a iniciar el servicio DNS, ya que con la configuración por defecto no servirá de mucho.

Configurar el firewall de CentOS 7 para el servicio DNS

En CentOS 7 el firewall suele estar activado por defecto, así que es necesario añadir una regla que permita el acceso al servicio DNS:

~$ sudo firewall-cmd --permanent --zone=public --add-service=dns

Se aplicarán los cambios al recargar la configuración del firewall:

~$ sudo firewall-cmd --reload

Cómo configurar el servidor DNS Bind en CentOS 7

Para configurar el servicio DNS Bind en CentOS 7 debemos tener en cuenta que el archivo principal es /etc/named.conf.

~$ sudo nano /etc/named.conf

En primer lugar permitiremos que el servicio escuche peticiones de red desde todas las interfaces disponibles, ya que por defecto sólo permite conexiones desde el adaptador loopback, es decir, desde la propia máquina local. Para ello buscaremos las directivas listen-on y listen-on-v6:

...
        listen-on port 53 { 127.0.0.1; };
        listen-on-v6 port 53 { ::1; };
...

Y las desactivaremos:

...
#       listen-on port 53 { 127.0.0.1; };
#       listen-on-v6 port 53 { ::1; };
...

Aunque ya podría recibir peticiones desde red, el servicio sólo responde a peticiones locales debido a la configuración de la directiva allow-query:

...
        allow-query     { localhost; };
...

En un entorno de red local querremos que las consultas de los clientes sean tramitadas, así que tendremos que cambiar el valor de este bloque. Podríamos añadir direcciones IP individuales, rangos de red, etc. pero en este tipo de entornos es más fácil usar el valor any:

...
        allow-query     { any; };
...

Guardamos los cambios y antes de iniciar Bind con la nueva configuración comprobamos que no haya errores en la configuración con el comando named-checkconf:

~$ sudo named-checkconf

Si este comando no produce ninguna salida, la sintaxis de la configuración es correcta, y podemos arrancar el servicio Bind:

~$ sudo systemctl start named

Podrás comprobar en cualquier momento el estado del servicio con el comando systemctl status named:

como instalar y configurar el servidor dns bind en centos 7

Si al consultar el estado del servicio obtienes resultados de este tipo:

...named[10098]: network unreachable resolving './DNSKEY/IN': 2001:dc3::35#53
...named[10098]: network unreachable resolving './DNSKEY/IN': 2001:500:2::c#53
...named[10098]: network unreachable resolving './DNSKEY/IN': 2001:7fe::53#53
...

Es síntoma de que hay problemas con el sistema de direcciones IPv6, pudiendo ser un problema con el router, puerta de enlace, o tu propia máquina CentOS 7. Si no necesitas el soporte IPv6, puedes configurar el inicio del servicio named para que sólo trabaje con el protocolo IPv4, editando el archivo /etc/sysconfig/named:

~$ sudo nano /etc/sysconfig/named

Tendrás que añadir la directiva OPTIONS:

...
OPTIONS="-4"

Tras guardar los cambios, reinicia el servicio:

~$ sudo systemctl restart named

Al volver a comprobar el estado del servicio habrán desaparecido esos mensajes.

Configuración de los clientes de la red

En el caso de este tutorial, la propia máquina CentOS 7 que actúa como servidor DNS también será cliente de su propio servicio. Como antes recibía por DHCP un par de servidores de nombres en la configuración de red, haremos que NetworkManager los ignore para poder configurar la propia máquina CentOS 7 como servidor DNS.

Para ello creamos un archivo de configuración adicional del servicio NetworkManager:

~$ sudo nano /etc/NetworkManager/NetworkManager.conf

Con el siguiente contenido:

[main]
dns=none

Guardamos los cambios y recargamos la configuración de NetworkManager:

~$ sudo systemctl reload NetworkManager

Ya podemos editar el archivo /etc/resolv.conf sin temor a que desaparezcan los nuevos ajustes:

~$ sudo nano /etc/resolv.conf

Eliminamos su contenido actual y añadimos lo siguiente:

search dominio.lan
nameserver localhost

Tras guardar los cambios y cerrar el archivo, ya podemos probar la resolución de nombres en cualquier máquina de la red con el comando nslookup y el dominio de Internet que prefieras:

~$ nslookup kernel.org
Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   kernel.org
Address: 139.178.84.217
Name:   kernel.org
Address: 2604:1380:4641:c500::1

Ya podemos pasar al siguiente paso de la configuración.

En cuanto al resto de máquinas de la red local, si finalmente terminas de configurar el servicio DNS de acuerdo a tus necesidades, sería interesante incluirlo en la configuración del servidor DHCP que use tu red.

CentOS 7 como servidor de nombres del dominio de la red local

En el siguiente paso de la configuración del servidor DNS haremos que también resuelva los nombres de las máquinas de la red local.

Para ello añadiremos al final del archivo named.conf la zona de resolución directa (de nombre a dirección IP) para el dominio de nuestra red local, en este ejemplo dominio.lan:

~$ sudo nano /etc/named.conf

Al final del archivo añadimos la definición de la zona:

...
zone "dominio.lan" IN {
        type master;
        file "named.dominio.lan";
};

Guardamos los cambios y creamos el archivo que acabamos de indicar, named.dominio.lan, en la ruta /var/named/, que es donde la configuración por defecto busca estos archivos:

~$ sudo nano /var/named/named.dominio.lan

Y creamos toda la estructura de un típico archivo de zona:

$TTL    1D
@       IN      SOA     ns.dominio.lan. root.dominio.lan. (
                            1       ; serial
                            604800  ; refresh
                            86400   ; retry
                            2419200 ; expiration
                            604800  ; TTL negative cache
                            )

; Servidores de nombres

@       IN      NS      ns.dominio.lan.

; Registros

ns.dominio.lan.       IN      A       192.168.1.199
router.dominio.lan.   IN      A       192.168.1.1
nas.dominio.lan.      IN      A       192.168.1.2
centos7.dominio.lan.  IN      A       192.168.1.199

En el encabezado del registro SOA figuran el servidor DNS del dominio, el que estamos configurando, y la dirección de correo del administrador, pero sin la @. Dentro de los campos del registro SOA, el serial representa un número de serie que debería cambiar cada vez que modifiquemos el archivo, lo que indicaría a servidores secundarios que su contenido ha cambiado.

IMPORTANTE: Todos los nombres de dominio terminan con un punto.

A continuación indicamos los servidores de nombres del dominio (en este caso sólo el que estamos configurando) y finalmente los registros de nombres, tipo A, de las distintas máquinas. En este ejemplo, ns.dominio.lan es la misma máquina que centos7.dominio.lan.

Guardados los cambios, además de comprobar la configuración general con named-checkconf, podemos comprobar también la del archivo de zona con el comando named-checkzone, indicando el dominio y el archivo de zona:

~$ sudo named-checkzone dominio.lan /var/named/named.dominio.lan
zone dominio.lan/IN: loaded serial 1
OK

Es el momento de recargar la configuración del servicio named:

~$ sudo systemctl reload named

Ahora podemos probar la resolución de nombres entre unas máquinas y otras, con el comando ping y los nombres de máquina que hayas definido:

~$ ping centos7.dominio.lan
PING centos7.dominio.lan (192.168.1.199) 56(84) bytes of data.
64 bytes from 192.168.1.199 (192.168.1.199): icmp_seq=1 ttl=64 time=0.334 ms
64 bytes from 192.168.1.199 (192.168.1.199): icmp_seq=2 ttl=64 time=0.550 ms
64 bytes from 192.168.1.199 (192.168.1.199): icmp_seq=3 ttl=64 time=0.433 ms
...

Justo lo que buscábamos.

Resolución inversa de nombres en CentOS 7

Puede que adicionalmente te interese la resolución inversa, que consiste en que dada una dirección IP obtengas su nombre de red. Por ejemplo, tomando el ejemplo anterior con ping, podríamos usar el comando nslookup para ver qué nombre (centos7.dominio.lan) corresponde a la dirección IP 192.168.1.199:

~$ nslookup 192.168.1.199
** server can't find 199.1.168.192.in-addr.arpa: NXDOMAIN

Pero no funciona porque nuestro servicio DNS no ofrece resolución inversa. Vamos a solucionarlo añadiendo una zona de resolución inversa, para lo que editaremos de nuevo el archivo named.conf:

~$ sudo nano /etc/named.conf

A continuación de la definición de zona directa que incluimos anteriormente, añadiremos la siguiente:

...
zone "1.168.192.in-addr.arpa" {
        type master;
        file "named.1.168.192";
};
...

Guardamos los cambios y editamos el nuevo fichero de zona inversa:

~$ sudo nano /var/named/named.1.168.192

El contenido será algo como esto:

$TTL 1D
@       IN      SOA     dominio.lan. root.dominio.lan. (
                        1       ; serial
                        604800  ; refresh
                        86400   ; retry
                        2419200 ; expires
                        604800  ; TTL negative cache
                        )

; Servidores de nombres

@       IN      NS      ns.dominio.lan.

; Registros PTR

199     IN      PTR     ns.dominio.lan.
1       IN      PTR     router.dominio.lan.
2       IN      PTR     nas.dominio.lan.
199     IN      PTR     centos7.dominio.lan.

La estructura es muy similar a la del archivo de zona directa, pero ahora usamos registros PTR y la parte numérica que varía de la dirección IP se relaciona con su nombre de red.

Guardados los cambios conviene pasar las utilidades named-checkconf y named-checkzone:

~$ sudo named-checkzone 0.168.192 /var/named/named.1.168.192
zone 1.168.192/IN: loaded serial 1
OK

Ya podemos recargar el servicio named:

~$ sudo systemctl reload named

Y podremos probar de nuevo el comando nslookup:

~$ nslookup 192.168.1.199
199.1.168.192.in-addr.arpa    name = ns.dominio.lan.
199.1.168.192.in-addr.arpa    name = centos7.dominio.lan.

Ahora sí que funciona.

Conclusión

Ahora que sabes cómo instalar y configurar el servidor DNS Bind en CentOS 7 ya puedes ofrecer resolución de nombres para los sistemas de tu red, tanto nombres de Internet como dominios locales. Lo siguiente es añadir algún servidor DNS secundario que replique la configuración del primario y entre a funcionar en caso de caída.

Si tienes alguna duda, pregunta, sugerencia, etc. puedes dejar un comentario.

¡Apoya comoinstalar.me!

¿Te ha servido esta pequeña guía de instalación y configuración del servicio DNS Bind en CentOS 7? Si es así y estás tan agradecido que te gustaría añadir tu granito de arena al mantenimiento de este sitio y elaboración de más tutoriales de CentOS 7 y DNS, cualquier mínima contribución es bien recibida, y puedes hacerlo dejando 1 $ de propina desde PayPal:

O, si te sientes especialmente agradecido, invitándonos a un café:

¡Gracias!

Valora esta entrada

5/5 - (2 votos)

20 comentarios en «Cómo instalar el servidor DNS Bind en CentOS 7»

  1. ~$ nslookup 192.168.1.145
    ** server can’t find 145.1.168.192.in-addr.arpa: NXDOMAIN
    Pero no funciona porque nuestro servicio DNS no ofrece resolución inversa. Vamos a solucionarlo añadiendo una zona de resolución inversa, para lo que editaremos de nuevo el archivo named.conf

    Desde ahí en adelante no funciona, hago la inversa y sigue apareciendo : ** server can’t find 145.1.168.192.in-addr.arpa: NXDOMAIN

    Responder
    • Hola, Alan.

      Acabo de revisar el tutorial y todo funciona como se espera. Es posible que hayas cometido algún error o bien al configurar named.conf o tal vez al configurar named.1.168.192.

      Por otro lado, el comando nslookup si se usa sin segundo parámetro utiliza el servidor DNS de la máquina local (en el tutorial, el propio servidor DNS CentOS 7). Si lo lanzas desde una máquina cliente hay que indicar también la IP del servidor DNS al que quieres consultar (en este caso, la máquina CentOS 7 que estás configurando como servidor de nombres).

      Responder
  2. Cuando uso «yum install -y bind bind-utils» en todos los espejos disponibles me sale «fallido» hasta que al final dice que no hay mirrors disponibles, ya hice el update pero sigue igual.

    Responder
    • Hola, Ignacio. Ambos paquetes pertenecen al repositorio «updates«, definido en el archivo /etc/yum.repos.d/CentOS-Base.repo.

      Prueba a limpiar la información de los repositorios:

      ~$ sudo yum clean all && sudo yum update -y

      Y después trata de volver a instalar. Si no funciona, definitivamente hay problemas con tu conexión o con la configuración de tu repositorio «updates«.

      Responder
    • Así es, Arnaldo. El servicio Bind en tu máquina CentOS 7 podrá resolver tanto las direcciones privadas de tu red local como las direcciones públicas para el resto de los clientes locales.

      Responder
  3. Hola, muy buen post, estoy realizando un trabajo para mi carrera basado en DNS, pero nos piden probarla con un cliente, que puede ser tanto nuestro propio PC (ya que centos 7 sería una máquina virtual) o con otra máquina, ¿cómo podría probar el servicio de DNS?

    Responder
    • Hola, Bastian. Puedes comprobar el servicio DNS si todas las máquinas implicadas están en la misma subred y se ven unas a otras. Bastaría con configurar manualmente los servidores DNS de la configuración TCP/IP de cada máquina cliente para que los nombres se resuelvan usando el servidor DNS de la máquina CentOS 7. También puedes usar utilidades de línea de comando para resolver nombres usando un servidor DNS concreto (en este caso, el servidor DNS CentOS 7), utilidades como por ejemplo nslookup.

      Responder
  4. Hola, muy útil el documento, me funcionó hasta antes de la zona inversa.

    Seguí todos tus pasos, sin embargo encontré un error en tu documento.

    Tu documento tiene el siguiente bloque:

    zone «168.192.in-addr.arpa» {
    type master;
    file «named.0.168.192»;
    };

    No me funcionó de esta forma… Tuve que modificarlo así para que me funcionara:

    zone «0.168.192.in-addr.arpa» {
    type master;
    file «named.0.168.192»;
    };

    Cómo puedes apreciar, agregué un «0» al nombre de la zona

    Antes: zone «168.192.in-addr.arpa» {
    Después: zone «0.168.192.in-addr.arpa» {

    Ahí sí me funcionó la resolución inversa.

    Muchas gracias por tu aporte.

    Saludos.

    Responder
    • Debes activar el enrutamiento en el servidor CentOS 7 y configurar el servidor DHCP o las configuraciones de los equipos en red para que usen el servidor CentOS 7 como puerta de enlace.

      Responder

Deja un comentario