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.
Contenido
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
:
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!
~$ 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
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).
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.
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«.
Muy buen tutorial. Si algún día tienes tiempo y puedes hacer el mismo tutorial para FreeBSD sería de mucha ayuda.
¡¡Muchas gracias!!
Carlos, está ahora mismo en borrador, pronto estará publicado.
¡Ese tutorial me vendría de perlas a mí también! ¡Se agradecería si lo subieras! ¡Muchas gracias!
¡Hola, Bernardo! Os pido disculpas a Carlos y a ti. Olvidé por completo publicar el borrador. Acabo de hacerlo y lo podéis consultar aquí. Saludos.
¡¡Muchas gracias!!
De nada, Carlos.
Gracias por el aporte. ¿Este servidor funciona en Internet?, es decir, ¿se comunica con Internet? ¿Puede resolver IPs públicas?
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.
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?
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.
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.
Excelente, me pasó lo mismo, gracias por tu comentario, amigo.
Corregida la errata, disculpad las molestias.
Muchas gracias por tu respuesta, y nuevamente gracias por tu aporte
Hola, excelente aporte en la configuración. Oye, pero cómo puedo hacer para que la misma dirección de dns funja también como puerta de enlace.
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.