Cómo configurar un resolvedor de DNS local con Unbound en Ubuntu 22.04
Unbound es un software de servidor DNS gratuito y de código abierto que puede utilizarse para resolver DNS de validación, recursivos y de caché. Es un servidor DNS rico en funciones que admite DNS sobre TLS (DoT), DNS sobre HTTPS (DoH), minimización de nombres de consulta, uso agresivo de caché validada por DNSSEC y compatibilidad con zonas de autoridad. Unbound se centra en la privacidad y seguridad del DNS, pero sin sacrificar la velocidad y el rendimiento.
Unbound está desarrollado principalmente por NLnet Labs y distribuido bajo licencia BSD, y es compatible con las modernas funciones sobre estándares abiertos del Servidor DNS. Unbound ha sido rigurosamente auditado, y puede ejecutarse en Linux, BSD y macOS. Unbound está disponible para la mayoría de estos sistemas operativos y puede instalarse mediante el gestor de paquetes del sistema.
En este tutorial, instalarás Unbound en el servidor Ubuntu 22.04 y lo configurarás como Servidor DNS Local con algunas funciones activadas, como DNSSEC, caché DNS, nombres de dominio y subdominios locales, y también DNS sobre TLS (DoT). También configurarás el registro de Unbound mediante Rsyslog y logrotate y configurarás una máquina cliente de Ubuntu para verificar tu instalación de Unbound.
Requisitos previos
Para completar este tutorial, debes tener los siguientes requisitos:
- Un servidor Ubuntu 22.04 – Este ejemplo utiliza un servidor Ubuntu con el nombre de host‘unbound-server‘ y la dirección IP‘192.168.5.100‘.
- Un usuario no root con privilegios de administrador sudo/root.
Ya está. Ya estás listo para proceder a la instalación de Unbound.
Instalación del servidor DNS Unbound
Por defecto, el repositorio de Ubuntu proporciona un paquete de Unbound que puedes instalar fácilmente mediante APT. Antes de iniciar la instalación de Unbound, ejecuta el siguiente comando apt para actualizar y refrescar el índice de paquetes de Ubuntu.
sudo apt update
Ahora comprueba los detalles del paquete Unbound mediante el siguiente comando.
sudo apt info unbound
En el momento de escribir esto, el repositorio por defecto de Ubuntu proporciona Unbound 1.13.
A continuación, instala Unbound mediante el siguiente comando apt. Cuando se te solicite, introduce y para confirmar y pulsa ENTER para continuar.
sudo apt install unbound
Salida:
Una vez instalado Unbound, ejecuta el siguiente comando systemctl para verificar el servicio Unbound.
sudo systemctl is-enabled unbound sudo systemctl status unbound
La salida ‘enabled‘ confirma que Unbound está activado y se iniciará automáticamente al arrancar el sistema. Y la salida «activo (en ejecución)» confirma que Unbound se está ejecutando.
Configurar Unbound como servidor DNS local
La configuración por defecto de Unbound se encuentra en ‘/etc/unbound/unbound.conf’. En este paso, modificarás el archivo de configuración principal de Unbound ‘/etc/unbound/unbound.conf‘ mediante tu editor preferido.
Ahora aprenderás la configuración básica de un servidor DNS de Unbound, a habilitar la caché DNS, a configurar nombres de dominio y subdominios locales, a configurar Unbound como resolvedor DNS con DoT (DNS-sobre-TLS) habilitado.
Configuración básica
Abre el archivo de configuración por defecto de Unbound ‘/etc/unbound/unbound.conf ‘ utilizando tu editor preferido. Este ejemplo utiliza nano para editar el archivo de configuración ‘ /etc/unbound/unbound.conf’.
sudo nano /etc/unbound/unbound.conf
Añade las siguientes líneas al archivo. La sección‘servidor‘ te permite establecer configuraciones básicas de Unbound. En este ejemplo, ejecutarás Unbound en la dirección IP local«192.168.5.100» con el puerto 53 por defecto. Además, configurarás el registro en mensajes Syslog y desactivarás IPv6. Por último, configurarás Unbound para que consulte recursivamente cualquier nombre de host de los servidores DNS raíz a través del archivo«root-hints».
#Adding DNS-Over-TLS support server: use-syslog: yes username: "unbound" directory: "/etc/unbound" tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt do-ip6: no interface: 192.168.5.100 port: 53 prefetch: yes
root-hints: /usr/share/dns/root.hints
harden-dnssec-stripped: yes
Parámetros detallados:
- use-syslog: activar el registro en mensajes Syslog.
- username: ejecutar como usuario unbound, que es el usuario por defecto.
- directorio: el directorio de trabajo por defecto de Unbound es el directorio ‘/etc/unbound’.
- tls-cert-bundle: Certificados que se utilizan para autenticar las conexiones que se establecen. En las distribuciones basadas en Debian, el archivo cert se encuentra en ‘/etc/ssl/certs/ca-certificates.crt‘.
- do-ip6: usa ‘sí’ para ejecutar Unbound con IPv6 o pon‘no‘ para desactivar IPv6.
- interfaz: interfaz de red o dirección IP en la que se ejecutará Unbound. Puedes utilizar una dirección IP o el nombre de la interfaz, como«eth0«. También puedes ejecutar en un puerto específico añadiendo un formato como este ‘DIRECCIÓN-IP@PUERTO‘.
- puerto: especifica el puerto en el que se ejecutará Unbound, y este puerto gestionará las conexiones del cliente. El puerto DNS por defecto es el 53.
- prefetch: establece‘yes‘ para activar la prefetch de las entradas de la caché de mensajes casi caducadas.
- root-hints: un archivo que contiene detalles del servidor DNS raíz. El archivo ‘/usr/share/dns/root.hints’ lo proporciona el paquete‘dns-root-data‘. Y también puedes descargar el archivo root-hints desde aquí‘https://www.internic.net/domain/named.cache’.
- harden-dnssec-stripped: ajústalo a«yes» para evitar la recepción de datos «dnssec-stripped».
Activar la caché DNS
A continuación, añade las siguientes líneas para habilitar la consulta de caché DNS en tu instalación de Unbound.
cache-max-ttl: 14400 cache-min-ttl: 11000
Parámetros detallados:
- cache-max-ttl: TTL o Tiempo de Vida para los RRSets y mensajes en la caché DNS. El formato es en segundos.
- cache-min-ttl: Tiempo de vida mínimo para la caché. El valor por defecto es 0, pero puedes cambiarlo a tu gusto, como por ejemplo«11000» segundos. No lo establezcas en más de 1 hora o tendrás problemas debido a los datos obsoletos.
Privacidad y seguridad sin límites
Ahora puedes añadir las siguientes líneas para configurar la privacidad y seguridad básicas de Unbound.
aggressive-nsec: yes hide-identity: yes hide-version: yes use-caps-for-id: yes
Parámetros detallados:
- aggressive-nsec: configúralo como«yes» para activar la NSEC agresiva y utilizar la cadena DNSSEC NSEC para sintetizar NXDOMAIN y otras denegaciones. Consulta la página web del IETF sobre ‘NSEC’ https://www.ietf.org/archive/id/draft-ietf-dnsop-nsec-ttl-00.html.
- hide-identity: configurado como sí para desactivar las respuestas de las consultas bind sobre id.servidor o hostname.bind.
- hide-version: establece sí para desactivar las consultas versión.servidor y versión.bind.
- use-caps-for-id: establece sí para activar el uso de «0x100-encoded» en la consulta para frustrar los intentos de suplantación.
Definir la red privada y las listas de control de acceso (ACL)
A continuación, tienes que definir la dirección privada de tu red y las ACL (Listas de Control de Acceso). Asegúrate de cambiar la subred local en las líneas de abajo con tu entorno de red actual.
private-address: 192.168.0.0/16 private-address: 192.168.5.0/24 private-address: 169.254.0.0/16 private-address: 172.16.0.0/12 private-address: 10.0.0.0/8 private-address: fd00::/8 private-address: fe80::/10
#control which clients are allowed to make (recursive) queries
access-control: 127.0.0.1/32 allow_snoop
access-control: ::1 allow_snoop
access-control: 127.0.0.0/8 allow
access-control: 192.168.5.0/24 allow
Parámetros detallados:
- dirección-privada: define subredes de red privadas en tu infraestructura. Sólo los nombres«private-domain» y «local-data » pueden tener estas direcciones privadas.
- access-control: define el control de acceso en el que se permite a los clientes hacer consultas (recursivas) al servidor de Unbound. El parámetro «allow» permitirá las recursivas, mientras que «allow_snoop» permitirá tanto las recursivas como las no recursivas.
Configurar el dominio local
Después de configurar la dirección privada y las listas de control de acceso, definirás la zona local de tu nombre de dominio. Esto es muy útil, sobre todo si tienes varias aplicaciones autoalojadas en tu red local. Puedes definir fácilmente tu nombre de dominio o subdominios y apuntar a la dirección IP de destino específica.
Este ejemplo creará la zona para el dominio«home.lan» con el tipo«static«, y luego creará múltiples subdominios mediante el parámetro«local-data«. Cada subdominio apuntará a una dirección IP concreta, y también crearás registros PTR mediante el parámetro «local-data-ptr«.
# local zone local-zone: "home.lan." static local-data: "firewall.home.lan. IN A 10.0.0.1" local-data: "vault.home.lan. IN A 10.0.0.2" local-data: "media.home.lan. IN A 10.0.0.3" local-data: "docs.home.lan. IN A 10.0.0.4" local-data: "wiki.home.lan. IN A 10.0.0.5" local-data-ptr: "10.0.0.1 firewall.home.lan" local-data-ptr: "10.0.0.2 vault.home.lan" local-data-ptr: "10.0.0.3 media.home.lan" local-data-ptr: "10.0.0.4 docs.home.lan" local-data-ptr: "10.0.0.5 wiki.home.lan"
Parámetros detallados:
- local-zone: define aquí el dominio local.
- local-data: define el registro A para los subdominios y qué dirección IP local se resolverá.
- local-data-ptr: define el registro ptr para tus subdominios.
Ajuste y mejora del rendimiento de Unbound
Añade las siguientes líneas para obtener más rendimiento. Puedes ajustar los siguientes parámetros a tu entorno actual.
num-threads: 4 msg-cache-slabs: 8 rrset-cache-slabs: 8 infra-cache-slabs: 8 key-cache-slabs: 8 rrset-cache-size: 256m msg-cache-size: 128m so-rcvbuf: 8m
Parámetros detallados:
- num-threads: el número de hilos que se crearán. El valor debe coincidir con los núcleos de CPU del servidor.
- msg-cache-slabs: el número de slabs a utilizar para la caché de mensajes. Establécelo en 8 para optimizar Unbound para que utilice más memoria para la caché.
- rrset-cache-slabs: el número de losas a utilizar para la caché RRset. Establécelo en 8 para optimizar Unbound para que utilice más memoria para la caché RRSet.
- infra-cache-slabs: el número de losas a utilizar para la caché de Infraestructura. Establécelo en 8 para que Unbound utilice más memoria para la caché de Infraestructura.
- key-cache-slabs: el número de losas a utilizar para la caché de claves. Establécelo en 8 para que Unbound utilice más memoria para la caché de claves.
- rrset-cache-size: especifica la cantidad de memoria para la caché RRSet. En este ejemplo se utilizan 256MB, mientras que el valor por defecto es de sólo 4MB.
- msg-cache-size: especifica la cantidad de memoria para la caché de mensajes. Este ejemplo utiliza 128MB, siendo el valor por defecto de sólo 4MB.
- so-rcvbuf: establece el tamaño del búfer para el puerto DNS 53/udp en 8 MB. En el sistema Ubuntu, también debes configurar un valor superior para el parámetro del núcleo‘net.core.rmem_max‘.
Configurar Unbound como resolvedor DNS con DNS-sobre-TLS (DoT)
Por último, añade una nueva sección ‘forward-zone ‘ para configurar Unbound como resolvedor DNS para tus redes locales. Este ejemplo utiliza servidores DNS Quad9 con DoT (DNS-over-TLS) activado.
forward-zone: name: "." forward-ssl-upstream: yes ## Also add IBM IPv6 Quad9 over TLS forward-addr: 9.9.9.9@853#dns.quad9.net forward-addr: 149.112.112.112@853#dns.quad9.net
Detalla los parámetros:
- forward-zone: define la zona de reenvío para Unbound.
- name: establece «.» para reenviar todas las consultas DNS.
- forward-addr: utiliza un reenviador específico para reenviar todas las consultas DNS. Este ejemplo utiliza Quad9 DNS con DNS sobre TLS (DoT) activado.
Guarda y sal del archivo ‘/etc/unbound/unbound.conf’ cuando hayas terminado. Con el archivo de configuración de Unbound modificado, ya puedes reiniciar el servicio Unbound y aplicar los cambios.
Ejecuta el siguiente comando de comprobación y verifica la configuración de Unbound. Si tiene éxito, deberías obtener una salida como‘unbound-checkconf: no errors in /etc/unbound/unbound.conf’.
sudo unbound-checkconf
A continuación, ejecuta el siguiente comando para aumentar el valor por defecto de ‘net.core.rmem_max’ de tu sistema a través del archivo ‘ /etc/sysctl.conf ‘. A continuación, aplica los cambios mediante el comando«sysctl«.
echo "net.core.rmem_max= 8388608" >> /etc/sysctl.conf sudo sysctl -p
A continuación, ejecuta el siguiente comando systemctl para reiniciar el servicio Unbound y aplicar los cambios.
sudo systemctl restart unbound
Con esto, el servicio Unbound debería estar funcionando con la nueva configuración en la dirección IP 192.168.5.100 en el puerto 53.
Comprueba la lista de puertos abiertos en tu sistema mediante el siguiente comando ss.
ss -tulpn
Recibirás una salida como ésta – El puerto DNS udp 53 por defecto es utilizado por el servicio Unbound.
Ahora que has terminado la configuración de Unbound, vas a configurar el cortafuegos UFW y a abrir el puerto DNS 53 por defecto.
Configurar el cortafuegos UFW
En Ubuntu, el cortafuegos que se instala por defecto es UFW. Está instalado, pero aún inactivo. En este paso, configurarás el cortafuegos UFW y abrirás el puerto UDP para Unbound.
Ejecuta el siguiente comando para abrir el servicio OpenSSH en UFW. A continuación, puedes añadir el puerto DNS 53/udp al cortafuegos UFW.
sudo ufw allow OpenSSH sudo ufw allow 53/udp
A continuación, ejecuta el siguiente comando para iniciar y habilitar el servicio de cortafuegos de UFW. Cuando se te solicite, introduce y para confirmar y pulsa ENTER para continuar.
sudo ufw enable
La salida«El cortafuegos está activo y habilitado al iniciar el sistema» confirma que el cortafuegos UFW se está ejecutando y está habilitado, lo que significa que el cortafuegos UFW se iniciará automáticamente al iniciar el sistema.
Resultado:
Ahora ejecuta el siguiente comando ufw para verificar el estado del cortafuegos UFW. Deberías recibir una salida que indique que el estado del UFW es«activo» con el servicio OpenSSH y el puerto DNS 53/udp habilitados.
sudo ufw status
Salida:
Configurar el registro no enlazado mediante Rsyslog y Logrotate
Tras configurar el cortafuegos de la UFW, ahora configurarás un archivo de registro para Unbound mediante rsyslog y logrotate. El servicio rsyslog creará un archivo de registro específico para Unbound y el logrotate rotará el archivo de registro de Unbound en un tiempo determinado.
Ejecuta el siguiente comando para añadir una nueva configuración de Rsyslog‘/etc/rsyslog.d/unbound.conf’ para el servicio Unbound. Con esto, los registros de Unbound se almacenarán en‘/var/log/unbound.log‘.
cat <<EOF | sudo tee /etc/rsyslog.d/unbound.conf # Log messages generated by unbound application if $programname == 'unbound' then /var/log/unbound.log # stop processing it further & stop EOF
A continuación, ejecuta el siguiente comando para añadir la configuración de logrotate ‘/etc/logrotate.d/unbound‘ para el servicio Unbound. Esto creará una rotación de registro para el archivo de registro de Unbound‘/var/log/unbound.log‘ diariamente.
cat <<EOF | sudo tee /etc/logrotate.d/unbound /var/log/unbound.log { daily rotate 7 missingok create 0640 root adm postrotate /usr/lib/rsyslog/rsyslog-rotate endscript } EOF
Ahora ejecuta el siguiente comando systemctl para reiniciar los servicios Rsyslog y Logrotate. Esto aplicará los cambios que has realizado en ambos servicios.
sudo systemctl restart rsyslog logrotate
Por último, puedes verificar el archivo de registro reiniciando el servicio Unbound mediante el comando siguiente.
Con esto, los mensajes generados por el servicio Unbound durante el proceso de reinicio se almacenarán en el archivo de registro‘/var/log/unbound.log‘. Ejecuta el comando cat para mostrar el contenido del archivo de registro ‘/var/log/unbound.log‘.
sudo systemctl restart unbound cat /var/log/unbound.log
Salida:
Configuración del resolvedor DNS en el cliente
En cuanto a la parte cliente, tienes que configurar el resolver DNS y utilizar Unbound como resolver por defecto en el sistema cliente. Para la distribución Ubuntu, puedes utilizar NetworkManager, el servicio systemd-resolved o configurar un archivo estático para‘/etc/resolv.conf’.
En este paso, aprenderás a configurar el resolver DNS en Ubuntu Desktop y Ubuntu Server.
Para Ubuntu Desktop
El servicio NetworkManager gestiona la red por defecto para la versión Ubuntu Desktop. Así que puedes configurar fácilmente el DNS resolver a través del NetworkManager, lo que se puede hacer a través de la GUI de la línea de comandos, o editando el archivo de configuración para cada interfaz de red.
Para configurar el resolver DNS a través de la línea de comandos, puedes utilizar nmcli. Ejecuta el siguiente comando para configurar el resolver DNS para la interfaz de red específica. Puedes sustituir el nombre de la interfaz por eth0.
sudo nmcli connection modify eth0 ipv4.dns "192.168.5.100"
Cada interfaz gestionada por NetworkManager tiene un archivo de configuración específico que se almacena en el directorio ‘/etc/NetworkManager/system-connections ‘ con el formato ‘.nmconnection‘.
Puedes modificar la configuración de la interfaz con tu editor de texto preferido y añadir las siguientes líneas a la sección ‘[ipv4]‘.
[ipv4] dns=192.168.5.100 ignore-auto-dns=true never-default=true
Si prefieres utilizar una aplicación GUI, abre la aplicación NetworkManager en tu máquina y edita el nombre de la interfaz que quieras modificar. Haz clic en la pestaña «Configuración IPv4» e introduce tu servidor DNS local. A continuación, haz clic en Guardar para confirmar.
Para servidor Ubuntu genérico
Para las máquinas servidoras genéricas de Ubuntu, la red la gestiona netplan con el servicio backend systemd-networkd. Y para la configuración del resolver DNS, se utiliza el systemd-networkd el systemd-resolved. Por tanto, para configurar el DNS resolver en un servidor Ubuntu genérico, puedes hacerlo mediante el servicio systemd-resolved‘.
Abre el archivo de configuración systemd-resolved con tu editor preferido. Este ejemplo utiliza un editor nano.
sudo nano /etc/systemd/resolved.conf
En la sección ‘[Resolver]‘, descomenta el parámetro‘DNS‘ e introduce la dirección IP de tu servidor DNS local.
[Resolve] DNS=192.168.5.100
Guarda el archivo y sal de él cuando hayas terminado.
Ahora ejecuta el siguiente comando para reiniciar el servicio systemd-resolved y aplicar los cambios. A continuación, puedes comprobar el estado del resolver DNS mediante el comando resolvectl como se indica a continuación.
sudo systemctl restart systemd-resolved sudo resolvectl status
Si se ejecuta correctamente, deberías ver una salida como ésta – El resolver DNS por defecto ha cambiado a la dirección IP 192.168.5.100 del servidor DNS local Unbound.
Probar el servidor DNS sin consolidar
Para asegurarte de que el servidor DNS de Unbound funciona como servidor DNS, ejecuta el siguiente comando dig desde la máquina cliente de Ubuntu. El parámetro«@192.168.5.100» garantiza que estás utilizando un servidor DNS Unbound que se ejecuta en la dirección IP«192.168.5.100«.
dig @192.168.5.100
Si la respuesta es correcta, recibirás una respuesta del servidor DNS raíz como la que se muestra a continuación. Además, observarás la bandera«ad«(datos auténticos) en la salida de la cabecera, lo que significa que la DNSSEC está activada.
A continuación, ejecuta el siguiente comando para asegurarte de que los clientes pueden acceder a los nombres de dominio en Internet.
dig github.com dig duckduckgo.com
Cuando lo consigas, deberías recibir una salida con los detalles del registro DNS para el dominio«github.com» y «duckduckgo.com«. Puedes ver que el resolver DNS que responde a la consulta es ‘127.0.0.53#53’, el systemd-resolved que utiliza Unbound como resolver por defecto. También puedes ver el ‘Tiempode consulta’ para cada consulta, el‘Tiempo de consulta‘ al dominio‘github.com’ es‘1748‘ y a‘duckduckgo.com‘ es‘999‘.
Salida para github.com:
Salida para duckduckgo.com:
Si vuelves a ejecutar el comando dig encima, el ‘Tiempo de consulta’ debería reducirse. Esto confirma que tus consultas se han almacenado en caché y que la caché DNS funciona.
dig github.com dig duckduckgo.com
Accede a Github después de almacenar la caché:
Accede a duckduckgo después de almacenar la caché:
A continuación, verifica el dominio o subdominio local mediante el comando dig que aparece a continuación. Si tienes éxito, cada subdominio apuntará a la dirección IP correcta configurada en el archivo de configuración de Unbound‘/etc/unbound/unbound.conf‘.
dig firewall.home.lan +short dig vault.home.lan +short dig media.home.lan +short
Resultado:
Ahora ejecuta el siguiente comando dig para asegurarte de que los registros PTR apuntan al nombre de dominio correcto.
dig -x 10.0.0.1 +short dig -x 10.0.0.2 +short dig -x 10.0.0.3 +short
Resultado:
También puedes verificar el DoT (DNS sobre TLS) mediante tcpdump. Instala el paquete«tcpdump» en tu servidor Unbound.
sudo apt install tcpdump
Introduce y cuando se te solicite y pulsa ENTER para continuar.
Ahora ejecuta el siguiente comando tcpdump para supervisar el tráfico en la interfaz«eth0» con el puerto 853 de DoT. En este ejemplo, el DNS Unbound se está ejecutando en la dirección IP«192.168.5.100» con la interfaz«eth0«.
tcpdump -vv -x -X -s 1500 -i eth0 'port 853'
Desplázate a la máquina cliente y ejecuta el siguiente comando para acceder a los nombres de dominio externos/internet mediante el comando dig que aparece a continuación.
dig google.com
Resultado:
Después de esto, vuelve al servidor Unbound y ahora deberías obtener una salida similar a ésta en la salida de tcpdump.
Con esto, ya has instalado y configurado el Servidor DNS Local a través de Unbound en el servidor Ubuntu. Además, has configurado un resolver DNS en los Escritorios y Servidores de Ubuntu mediante NetworkManager y systemd-resolved.