En este artículo veremos cómo instalar y configurar el servidor DNS Bind en Ubuntu 20.04 LTS Focal Fossa paso a paso, de modo que puedas trabajar con tu propio servicio de resolución de nombres en tu red local, ya sea doméstica o profesional.
Contenido
Antes de instalar DNS Bind en Ubuntu 20.04 LTS
Para poder seguir los pasos de esta guía de instalación y configuración del servicio DNS Bind en Ubuntu 20.04 LTS será necesario partir del siguiente escenario:
- Una máquina Ubuntu 20.04 LTS Focal Fossa actualizada.
- Un usuario con permisos de sudo.
- Acceso a Internet.
- Otras máquinas en red para probar el servicio.
En este tutorial configuraremos el servidor DNS Bind para resolver los nombres de una red con dominio localnet.net en una máquina Ubuntu 20.04 LTS con dirección IP 192.168.0.140 dentro de una red privada 192.168.0.0/24.
Si ya tienes todo el entorno listo, es hora de regular tu mesa de trabajo a la altura correcta, abrir tu terminal de línea de comandos favorita y ponernos manos a la obra.
Cómo instalar el servicio DNS Bind en Ubuntu 20.04 LTS
Para instalar el servicio DNS Bind en Ubuntu 20.04 LTS utilizaremos los paquetes disponibles en los repositorios del sistema, por lo que los actualizamos como primer paso:
~$ sudo apt update
El paquete que necesitamos es bind9 que instalamos con apt:
~$ sudo apt install -y bind9
Tras la descarga e instalación de Bind y sus dependencias se crea un nuevo servicio en Ubuntu 20.04 llamado bind9, o bind9.service, que queda iniciado y habilitado para su inicio automático en cada arranque del sistema.
Podemos comprobar el estado del servicio en cualquier momento con el comando systemctl status bind9
:
Si en los mensajes de estado aparecen ciertos errores como los mostrados en la imagen, es normal cuando se trata de redes locales, lo solucionaremos enseguida.
Configurar el firewall de Ubuntu 20.04 LTS para DNS Bind
En caso de que tengas activado el firewall UFW en tu máquina Ubuntu 20.04 LTS será necesario añadir una regla para permitir solicitudes externas de resolución de nombres:
~$ sudo ufw allow bind9
Cómo configurar los clientes de red para usar el servicio DNS Bind de Ubuntu 20.04 LTS
La forma más sencilla de que el resto de máquinas de la red comiencen a usar el servicio DNS Bind que estamos configurando en el servidor Ubuntu 20.04 LTS es configurando a su vez el servicio DHCP del router o de la máquina que corresponda para que envíe como servidor de nombres la dirección IP del nuevo servidor DNS.
En caso de configurar manualmente los adaptadores de red de cada dispositivo de la red local bastará con indicar la dirección del servidor de nombres Ubuntu 20.04 en el lugar adecuado.
Finalmente, si usas autoconfiguración y no puedes o no quieres modificar la configuración del servidor DHCP, puedes configurar el adaptador de red de las máquinas clientes para que mantengan la configuración automática excepto para los servidores de nombres.
En el caso de clientes Ubuntu 20.04, cuya configuración de red se realiza a través de Netplan, editaremos el archivo de configuración de la interfaz de red:
~$ sudo nano /etc/netplan/00-installer-config.yaml
Su contenido inicial puede ser similar al siguiente:
# This is the network config written by 'subiquity' network: ethernets: enp0s3: dhcp4: true version: 2
En la sección relativa a la interfaz de red, en este caso enp0s3, insertamos lo siguiente:
# This is the network config written by 'subiquity' network: ethernets: enp0s3: dhcp4: true nameservers: addresses: [192.168.0.140] version: 2
Recuerda que al tratarse de un archivo YAML sólo están permitidos los espacios en blanco para el sangrado o indentación de los parámetros.
Hemos añadido la directiva nameservers, con el apartado addresses en el que especificamos, separadas por comas, las direcciones de los servidores DNS primario, secundario, terciario, etc. En este ejemplo la única dirección que añadimos es la del servidor DNS que configuraremos a continuación.
Guardamos los cambios y cerramos el archivo.
Para aplicar todos estos cambios usamos el comando netplan:
~$ sudo netplan apply
Desde este momento la máquina Ubuntu 20.04 LTS resolverá nombres mediante el servidor DNS especificado manualmente.
Cómo configurar el servidor DNS Bind en Ubuntu 20.04 LTS
Para configurar el servicio DNS Bind en Ubuntu 20.04 LTS trabajaremos sobre sus archivos de configuración, ubicados en la ruta /etc/bind/.
El archivo principal es named.conf que se limita a cargar las configuraciones de los archivos named.conf.options, named.conf.local y named.conf.default-zones.
Trabajar únicamente con IPv4
Pero también podemos realizar ciertos ajustes sobre el archivo /etc/default/named. Por ejemplo, si sólo vamos a trabajar con IPv4 en nuestra red local puede ser interesante desactivar IPv6 para evitar errores. Esto lo haremos editando dicho archivo:
~$ sudo nano /etc/default/named
Buscamos la directiva OPTIONS:
... OPTIONS="-u bind"
Y le añadimos el parámetro -4:
... OPTIONS="-u bind -4"
Ya podemos cerrar y guardar este archivo, y recargar el servicio:
~$ sudo systemctl reload bind9
Desactivar DNSSEC
Si trabajamos con un servidor DNS local, como el de este ejemplo, no funcionará la capa de seguridad DNSSEC, así que debemos desactivarla. Para ello editamos el archivo named.conf.options:
~$ sudo nano /etc/bind/named.conf.options
Buscamos la directiva dnssec-validation:
... dnssec-validation auto; ...
Y cambiamos su valor por «no»:
... # dnssec-validation auto; dnssec-validation no; ...
En este caso hemos desactivado la directiva original y hemos añadido una nueva con el valor deseado.
Tras guardar el archivo, habrá que recargar la configuración del servicio para aplicar los cambios.
Si ahora volvemos a consultar el estado del servicio, veremos que han desaparecido los mensajes de error:
~$ systemctl status bind9
Resolución de nombres de Internet (forwarding)
Si los clientes de tu red local tienen acceso a Internet y quieres que además de los nombres de la red local puedan resolver nombres de Internet, habrá que permitir lo que se denomina recursión. Para ello editamos el archivo named.conf.options:
~$ sudo nano /etc/bind/named.conf.options
Dentro del bloque options añadimos un bloque forwarders con las direcciones de servidores DNS que puedan resolver nombres de Internet:
... forwarders { 8.8.8.8; 8.8.4.4; }; ...
En este caso usamos los servidores DNS de libre acceso de Google, pero puedes usar otros como, por ejemplo, los que proporciona tu proveedor de acceso a Internet.
Guardamos el archivo y recargamos el servicio.
Cómo configurar zonas o dominios
Para configurar un dominio o zona, creamos un archivo de zona para dicho dominio, normalmente utilizando el dominio como parte del nombre del archivo, lo que permite facilitar la configuración. En este caso vamos a crear el archivo de zona para el dominio de red local localnet.net:
~$ sudo nano /etc/bind/db.localnet.net
Comenzaremos con la estructura inicial, que sería similar a la siguiente:
$TTL 1D @ IN SOA ns.localnet.net. root.localnet.net. ( 1 ; serial 604800 ; refresh 86400 ; retry 2419200 ; expiration 604800 ; TTL negative cache ) ; Registros NS (Servidores de nombres) @ IN NS ns.localnet.net. ; Registros A ns.localnet.net. IN A 192.168.0.140
Toda esta configuración inicial se encarga de definir el dominio y el servidor DNS que lo gestiona, que en este caso es nuestro servidor Ubuntu 20.04 LTS.
Inicialmente hemos incluido el registro SOA, un registro NS y un registro A.
En la línea que comienza por @, el registro SOA o «Start of Authority«, indicamos cuál es el servidor de nombres del dominio y la dirección de correo electrónico del administrador, especificada sin el carácter @, es decir, root@localnet.net se indica como root.localnet.net. Puedes utilizar el nombre que quieras para tu servidor DNS, pero los cambios deben ser consistentes. Por ejemplo:
... @ IN SOA dns1.localnet.net. root.localnet.net. ( ... @ IN NS dns1.localnet.net. ... dns1.localnet.net. IN A 192.168.0.140
Ahora hemos decidido llamar dns1 en lugar de ns al servidor de nombres, enlazándolo a la misma cuenta de correo del administrador.
Es muy importante no olvidar ninguno de los puntos al final de cada nombre de máquina.
La línea etiquetada como ‘serial‘ recoge un número que deberá incrementarse manualmente cada vez que editemos este archivo, ya sea para modificar nombres o añadir nuevos.
Observa que el registro NS está indentado, ya que si no lo está la configuración no funcionará.
Guardamos los cambios y cerramos el archivo.
Para comprobar que la configuración es correcta podemos usar el comando named-checkzone, que recibe como parámetros el dominio que queremos comprobar y el archivo que lo configura:
~$ named-checkzone localnet.net /etc/bind/db.localnet.net zone localnet.net/IN: loaded serial 1 OK
Una vez que la configuración inicial es correcta, podemos editar el archivo de nuevo y añadir nombres de máquinas de nuestra red y sus correspondientes direcciones IP, mediante registros A adicionales:
... 2 ; serial ... ; Registros A ... router.localnet.net. IN A 192.168.0.1 nas.localnet.net. IN A 192.168.0.101 sat.localnet.net. IN A 192.168.0.102 ubuntu2.localnet.net. IN A 192.168.0.108
Guardamos el archivo y pasamos de nuevo el comando named-checkzone:
~$ named-checkzone localnet.net /etc/bind/db.localnet.net zone localnet.net/IN: loaded serial 2 OK
Observa que, además de devolvernos el mensaje ‘OK‘, también se muestra el serial actual, que hemos modificado manualmente.
Para que esta configuración sea tenida en cuenta por el servicio DNS Bind será necesario incluirla desde el archivo named.conf.default-zones, así que lo editamos:
~$ sudo nano /etc/bind/named.conf.default-zones
Añadimos un bloque zone como el siguiente al final del archivo:
... zone "localnet.net" IN { type master; file "/etc/bind/db.localnet.net"; };
Guardamos el archivo y recargamos el servicio:
~$ sudo systemctl reload bind9
El servicio está listo para aceptar y responder peticiones de resolución de nombres.
Cómo probar el servicio DNS Bind del servidor Ubuntu 20.04 LTS
Desde cualquier máquina de la red configurada manual o automáticamente para usar como servidor DNS la máquina Ubuntu 20.04 que acabamos de configurar, podemos abrir una terminal de consola y usar el comando ping; por ejemplo, para un nombre de Internet (si hemos configurado la recursión):
~$ ping kernel.org PING kernel.org (198.145.29.83) 56(84) bytes of data. 64 bytes from kernel.org (198.145.29.83): icmp_seq=1 ttl=46 time=152 ms 64 bytes from kernel.org (198.145.29.83): icmp_seq=2 ttl=46 time=151 ms 64 bytes from kernel.org (198.145.29.83): icmp_seq=3 ttl=46 time=152 ms
Podemos probar los nombres de nuestra propia red, como el propio servidor de nombres:
~$ ping ns.localnet.net PING ns.localnet.net (192.168.0.105) 56(84) bytes of data. 64 bytes from 192.168.0.105 (192.168.0.105): icmp_seq=1 ttl=64 time=0.370 ms 64 bytes from 192.168.0.105 (192.168.0.105): icmp_seq=2 ttl=64 time=0.480 ms 64 bytes from 192.168.0.105 (192.168.0.105): icmp_seq=3 ttl=64 time=0.584 ms
O cualquiera de las máquinas o dispositivos cuyo nombre hayamos configurado:
~$ ping router.localnet.net PING router.localnet.net (192.168.0.1) 56(84) bytes of data. 64 bytes from _gateway (192.168.0.1): icmp_seq=1 ttl=64 time=8.89 ms 64 bytes from _gateway (192.168.0.1): icmp_seq=2 ttl=64 time=2.93 ms 64 bytes from _gateway (192.168.0.1): icmp_seq=3 ttl=64 time=4.43 ms
La máquina debería contestar en unos instantes, e igual debería ocurrir con el resto de nombres del dominio.
Si alguno de los nombres corresponde a una máquina que está apagada, no responderá, pero observa cómo sí se obtiene la dirección IP:
~$ ping nas.localnet.net PING nas.localnet.net (192.168.0.101) 56(84) bytes of data. From ubuntu2 (192.168.0.108) icmp_seq=1 Destination Host Unreachable From ubuntu2 (192.168.0.108) icmp_seq=2 Destination Host Unreachable From ubuntu2 (192.168.0.108) icmp_seq=3 Destination Host Unreachable
¡Así de fácil!
Cómo configurar la resolución inversa con el servidor DNS Bind en Ubuntu 20.04
A veces es interesante poder obtener el nombre DNS que corresponde a una dirección IP concreta. Por ejemplo, muchos registros de eventos y conexiones guardan el nombre DNS en lugar de la dirección IP si es posible realizar la resolución inversa.
Para hacer esto crearemos un nuevo archivo de zona correspondiente a nuestra dirección de red:
~$ sudo nano /etc/bind/db.0.168.192
Arrancaremos con una configuración bastante parecida pero no igual a la configuración de zona que ya hicimos antes:
$TTL 1D @ IN SOA ns.localnet.net. root.localnet.net. ( 0 ; serial 604800 ; refresh 86400 ; retry 2419200 ; expires 604800 ; TTL negative cache ) @ IN NS ns.localnet.net. ; Registros PTR 140 IN PTR ns.localnet.net. 1 IN PTR router.localnet.net. 101 IN PTR nas.localnet.net. 102 IN PTR sat.localnet.net. 108 IN PTR ubuntu2.localnet.net. 112 IN PTR nox.localnet.net.
El registro SOA indica igualmente el servidor DNS principal de la zona a la que corresponde la resolución inversa, también incluye la dirección de correo-e del administrador y los parámetros de número de serie y tiempos.
Recuerda incrementar el número de serie si haces cambios en este archivo.
Para asociar la parte de dirección de máquina de la dirección IP con los nombres DNS usamos registros PTR.
En este ejemplo usamos una red clase C, así que usamos los 3 primeros números (dirección de red) para el nombre del archivo de zona y el cuarto y último número para los registros PTR.
Guardamos los cambios y comprobamos la corrección del archivo con named-checkzone:
~$ named-checkzone 0.168.192 /etc/bind/db.0.168.192 zone 0.168.192/IN: loaded serial 0 OK
Si todo es correcto editaremos de nuevo named.conf.default-zones:
~$ sudo nano /etc/bind/named.conf.default-zones
Y añadimos el siguiente bloque zone para incluir la configuración del archivo de resolución inversa:
... zone "0.168.192.in-addr.arpa" { type master; file "/etc/bind/db.0.168.192"; };
Guardamos los cambios y comprobamos que todo sea correcto con named-checkzone:
~$ named-checkconf
Y recargamos la configuración del servicio DNS:
~$ sudo systemctl reload bind9
Ya podemos realizar resolución inversa de direcciones IP usando alguna herramienta como nslookup (incluida en el paquete bind9-tools).
Desde el propio servidor Ubuntu 20.04 donde corre el servicio DNS Bind:
~$ nslookup 192.168.0.1 localhost 1.0.168.192.in-addr.arpa name = router.localnet.net.
Y desde cualquier otra máquina conectada en red, indicando si es necesario la dirección del servidor DNS:
~$ nslookup 192.168.0.1 192.168.0.140 1.0.168.192.in-addr.arpa name = router.localnet.net.
¡Así de sencillo!
Conclusión
Ahora que sabes cómo instalar el servicio DNS Bind en Ubuntu 20.04 LTS Focal Fossa ya puedes configurar tus propios dominios y subdominios locales en tu red local, de modo que cualquier dispositivo tenga su propio nombre y, a su vez, pueda resolver el resto de nombres de la red.
En caso de dudas, preguntas, sugerencias, etc. puedes dejar un comentario (están moderados, para evitar SPAM, pero se revisan diariamente).
¡Apoya comoinstalar.me!
¿Ya dispones de servicio de resolución de nombres en tu red local gracias a nuestra guía? Si es así y quieres agradecérnoslo, puedes ayudarnos a mantener este sitio en línea dejando 1 $ de propina desde PayPal:
O, si te sientes especialmente agradecido, puedes invitarnos a un cappuccino:
¡Gracias!
Hola, Instalador. Oye, ¿cómo tendría que configurar mi servidor DNS para que acepte peticiones de una red externa? ¿Bastaría con abrir el firewall o hay que configurar algo más? Gracias por adelantado 🙂
Hola, Nenya. Si la conexión de la máquina Ubuntu 20.04 donde corre el servicio DNS Bind es directa a Internet, sí bastaría con abrir el firewall, pero normalmente las conexiones se realizan a través de un router. En ese caso habría que realizar el típico redireccionamiento de puertos del router al servidor Ubuntu 20.04.
Por otro lado, si el servicio DNS resuelve direcciones locales ten en cuenta que tal vez los clientes de la red externa no puedan conectar a dichas direcciones internas. Tendrías que montar una VPN, conexión punto a punto, etc.
Buenos días,
Buen post. Me gustaría saber cómo podría realizar esta práctica a partir de máquinas virtuales. ¿Tendrían que estar en red interna tanto servidor como clientes?
Siguiendo todos tus pasos, el servidor DNS no muestra errores pero en el momento de realizar un ping kernel.org me salta el siguiente error: “Temporary failure in name resolution”
Si me pudieras ayudar me harías un gran favor.
Hola, Tomas. En cuanto a la configuración de red de las máquinas, en el caso de los clientes bastarí con que puedan alcanzar al servidor Ubuntu 20.04 donde corre el servicio DNS con el ping. Y por lo que respecta a tu problema, seguramente se trate de configuración de los sistemas clientes. Si no has configurado el servidor DHCP para que obtengan la dirección del servidor DNS, revisa la sección de configuración para los clientes de este tutorial. La he revisado y mejorado justo para este caso. Ya me dirás si te ha funcionado.
Acabo de hacer todos los pasos y efectivamente la zona inversa se por lugo (no acepta la IP que pongo para la zona inversa). Saludos y a ver cómo se podría solucionar.
Hola, Alberto. Acabo de revisar el tutorial y funciona bien. ¿Qué comando has usado y desde qué máquina?
Tanto la zona directa como inversa sí funcionan, rectifico mi comentario, tal vez debí de saltarme un paso el cual está solucionado. Muchas gracias por la atención recibida.
¡De nada, Alberto! Lo que importa es que te funcione.
¿Y la zona inversa? De vacaciones.
Así es, Alex. Se había tomado este mes de vacaciones, pero ya ha regresado.