Page cover

DNS con ubuntu server

De la misma forma que configuramos el DHCP, el servicio de DNS irá junto a este. Utilizaremos en esta ocasión el paquete de isc Bind9

Veremos cómo configurar un servidor DNS primario con zonas directa e inversa para la resolución de nombres en nuestra red local. Configuraremos el uso de forwarders para las consultas externas y dicho servidor DNS será autoritativo para nuestra red.

  • Zona directa: Utilizada para resolver nombres de dominio a direcciones IP. La mayoría de las configuraciones de DNS en entornos de hosting web y servicios de red utilizan zonas directas.

  • Zona Inversa: Utilizada para realizar la búsqueda inversa y asociar direcciones IP con nombres de dominio. Es especialmente útil en situaciones donde necesitas conocer el nombre de dominio correspondiente a una dirección IP específica.

Empezaremos con una MV Ubuntu server en una red NAT con DHCP ya instalado con la siguiente información:

Nombre del host: jupiter
Nombre DNS: ns1
Dominio DNS primario: alexdns.local
FQDN: ns1.alexdns.local

enp0s3
Red NAT: 10.0.0.0/24
Máscara: 255.255.255.0
IP: 10.0.0.5
GW: 10.0.0.1
Rango DHCP: 10.0.0.10 - 10.0.0.50

Instalación paquetes

Actualizamos los repositorios de nuestro sistema:

sudo apt update
sudo apt upgrade

Una vez hecho esto, procedemos a instalar el paquete Bind9 y sus utilidades:

sudo apt install bind9 bind9-utils bind9-doc -y

Podemos comprobar si se ha instalado correctamente con:

systemctl status bind9

Configuración de DNS

Empezamos con la configuración:

El primer fichero a editar sería: /etc/bind/named.conf.local

Aquí será donde definiremos las zonas: directa e inversa, para el dominio alexdns.local haciendo uso de la cláusula zone.

  • Cada bloque de zona incluirá de que tipo será la zona y el fichero en el que estarán definidas las características, propiedades y entidades del dominio, para cada zona.

Una práctica adecuada sería hacer una copia de seguridad de los archivos de configuración, como es el caso del archivo named.conf.local para lo cual podemos hacer:

sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.BKP

Índice

1. Configuramos las opciones

Editamos el siguiente archivo:

sudo nano /etc/bind/named.conf.options

El archivo debe contener lo siguiente:

// creamos ACL que permita solo el tráfico LAN de 10.0.0.0 - 10.0.0.255
options {
    listen-on { any; };
    directory "/var/cache/bind";
    allow-query { localhost; LAN; }; 
    recursion yes; 
    forwarders { 1.1.1.1; };
    
};

acl LAN {
    10.0.0.0/24;
};
  • listen-on { }: la dirección donde estará escuchando Bind9, si no sabes con exactitud, utiliza la opción any.

  • allow-query { }: desde que redes o ip es posible realizar consultas, normalmente la misma red a la que pertenece el servidor DNS.

  • forwarders { }: define servidores DNS a los cuales Bind9 reenviará las consultas que el no pueda resolver.

  • recursion: define la recursión en la búsqueda de registros

Editamos el archivo de configuración para forzar las peticiones IPv4 y evitarnos resoluciones de IPv6. Para ello vamos a:

sudo nano /etc/default/named

Y editamos el archivo:

RESOLVCONF=no

//Modificar la línea dejándola así:
OPTIONS="-u bind -4"

Antes de continuar conviene revisar que no haya problemas:

sudo named-checkconf /etc/bind/named.conf.options
sudo systemctl restart bind9
systemctl status bind9

Si todo rula bien, ahora deberíamos poder hacer ping desde la máquina cliente a un dominio cualquiera y debería funcionar:

ping google.es

Vamos ahora a configurar nuestros propios archivos y registros de zona para el servidor!

2. Configuramos las zonas:

Edita el archivo de configuración principal de zonas de BIND9:

sudo nano /etc/bind/named.conf.local

Agrega una sección para tu zona directa y otra para la inversa. Por ejemplo, para el dominio "alexdns.local":

//zona directa
zone "alexdns.local" in {
    type master;
    file "/etc/bind/zonas/db.alexdns.local";
};

//Zona inversa
zone "0.0.10.in-addr.arpa" {
    type master;
    file "/etc/bind/zonas/db.0.0.10";
};

Donde:

  1. zone "XXXXXX": define la zona directa o inversa en notación de dominio o dirección IP inversa para la red 10.0.0.0.

  2. type master;: Esto le indica que este servidor DNS es el servidor maestro (master) para esta zona.

  3. file "/etc/bind/zonas/db.XXXXX";: Especifica la ubicación del archivo de zona que contiene la información de resolución directa o inversa.

Para comprobar que la configuración es la correcta y no hayamos cometido errores en la sintaxis, usamos el comando:

sudo named-checkconf /etc/bind/named.conf.local

3. Configuramos el archivo de zona directa:

Partiendo de los ficheros de zona predeterminados como es el de db.empty o db.127 podemos editarlos o crear nuevos:

sudo mkdir /etc/bind/zonas

sudo cp /etc/bind/db.empty /etc/bind/zonas/db.alexdns.local
sudo cp /etc/bind/db.127 /etc/bind/zonas/db.0.0.10

Al terminar, entramos a editar el archivo de zona directa:

sudo nano /etc/bind/zonas/db.alexdns.local

Añade registros de recursos (A, MX, etc.) según tus necesidades. Aquí hay un ejemplo básico:

$TTL    86400
@       IN      SOA     alexdns.local. root.alexdns.local. (
                              2024100701 ; Serial (Formato AAMMDDnn)
                              604800     ; Refresh (cada 7 días)
                              86400      ; Retry (cada 1 día)
                              2419200    ; Expire (28 días)
                              604800 )   ; Negative Cache TTL (7 días)
                              
; Registro NS
@       IN      NS      ns1.alexdns.local.

; Registro A para el dominio base
@       IN      A       10.0.0.5

; Registros A adicionales
ns1        IN      A       10.0.0.5
www        IN      CNAME   alexdns.local. ;Esto apuntara www.alexdns.local a la IP del dominio base
mail       IN      A       10.0.0.5

; Registro MX para correos
@       IN      MX  10  mail.alexdns.local.

; Cliente
client    IN      A   10.0.0.10

Este ejemplo configura un servidor DNS para el dominio "alexdns.local" con direcciones IP asociadas a "bindserver.alexdns.local" .

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.

Puedes verificar que la configuración sea correcta usando la herramienta named-checkzone:

sudo named-checkzone alexdns.local /etc/bind/zonas/db.alexdns.local

Si no hay errores, deberías ver un mensaje indicando "zone alexdns.local/IN: loaded serial 1 OK".

4. Configuramos el archivo de zona inversa:

Si deseas configurar la zona inversa para asociar direcciones IP con nombres de dominio, ahora debemos editar el otro archivo copiado anteriormente:

sudo nano /etc/bind/zonas/db.0.0.10

Añade registros de recursos (A, MX, etc.) según tus necesidades. Aquí tienes el ejemplo básico:

$TTL    604800 ;
@       IN      SOA     alexdns.local. root.alexdns.local. (
                        1               ; Serial
                        12h             ; Refresh
                        15m             ; Retry
                        3w              ; Expire
                        2h      )       ; Negative Cache TTL

;Registros de zona inversa
@       IN      NS      ns1.alexdns.local.
ns1     IN      A       10.0.0.5

; Registros con IP servidor y 1 cliente
5       IN      PTR     ns1.alexdns.local.
10      IN      PTR     client.alexdns.local.

Fíjate que en el registro de IP ponemos el numero correspondiente al host de nuestra IP.

Ahora puedes proceder a probar la configuración con named-checkzone:

sudo named-checkzone alexdns.local /etc/bind/zonas/db.0.0.10

5. Verificamos la red:

Asegúrate de que tu máquina esté configurada para usar el servidor DNS local. Edita tu archivo /etc/resolv.conf y agrega la siguiente línea:

sudo nano /etc/resolv.conf
nameserver 127.0.0.1
nameserver 10.0.0.5

Reinicia el Servicio BIND9:

sudo systemctl restart bind9
sudo systemctl status bind9

Para verificar que la configuración funciona correctamente, usa el comando nslookup para buscar los dominios configurados, por ejemplo:

  • nslookup client

  • nslookup bindserver

  • nslookup client.alexdns.local

  • nslookup bindserver.alexdns.local

Esto debería resolverse correctamente y mostrar un output parecido a esto:

Server:         127.0.0.53
Address:        127.0.0.53 #53

Non-authoritative answer:
Name:   client.alexdns.local
Address: 10.0.0.10

6. Verificación de respuesta autoritativa

Gracias a Alina por hacerlo notar y buscar la solución al problema

Como habrás visto arriba, el servidor sigue mostrándonos respuestas no-autoritativas. Esto es debido a que las aplicaciones que hacen uso del resolver de systemd-resolved escuchan en la interfaz de loopback en la dirección 127.0.0.53, no a nuestro DNS.

El archivo /etc/resolv.conf es un enlace simbólico a otro fichero de configuración. Si revisamos sus enlaces:

ls -l /etc/resolv.conf

Veremos que el systemd-resolved, apunta a un archivo en:

/run/systemd/resolve/stub-resolv.conf

Entonces, modificamos el enlace simbólico haciendo lo siguiente para hacerlo apuntar al fichero adecuado:

sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Ahora, comprueba haciendo:

cat /etc/resolv.conf

Vuelve a probar el nslookup ahora y verás que la IP es correcta.

Recuerda adaptar los nombres de dominio y las direcciones IP según tu configuración. Después de completar estos pasos, tu máquina Ubuntu Desktop actuará como un servidor DNS local para el dominio que hayas configurado. Puedes agregar entradas adicionales a tu zona directa según sea necesario.

Para comprobar si funciona el DNS, prueba a conectar la máquina virtual cliente en la misma red interna y darle servicio de DHCP con la IP del DNS y resolver una petición nslookup google.es y revisa la IP y resolución si funciona.

Bibliografía:

Última actualización