# DNS con ubuntu server

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 <mark style="color:blue;">`forwarders`</mark> para las consultas externas y dicho servidor DNS será <mark style="color:blue;">`autoritativo`</mark> 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 ](https://apuntes-alex.gitbook.io/apuntes-sistemas-y-redes/servicios/dhcp/dhcp-con-ubuntu)con la siguiente información:

<pre><code>Nombre del host: jupiter
Nombre DNS: ns1
Dominio DNS primario: alexdns.local
FQDN: ns1.alexdns.local
<strong>
</strong><strong>enp0s3
</strong><strong>Red NAT: 10.0.0.0/24
</strong><strong>Máscara: 255.255.255.0
</strong>IP: 10.0.0.5
GW: 10.0.0.1
<strong>Rango DHCP: 10.0.0.10 - 10.0.0.50
</strong></code></pre>

## Instalación paquetes&#x20;

Actualizamos los repositorios de nuestro sistema:

```bash
sudo apt update
sudo apt upgrade
```

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

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

Podemos comprobar si se ha instalado correctamente con:

```bash
systemctl status bind9
```

## Configuración de DNS

Empezamos con la configuración:

El primer fichero a editar sería: <mark style="color:blue;">`/etc/bind/named.conf.local`</mark>&#x20;

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

* 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 <mark style="color:blue;">`named.conf.local`</mark> para lo cual podemos hacer:

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

### Índice

1. [Configuramos opciones](#a.-configuramos-las-opciones)
2. [Configuramos las zonas](#b.-configuramos-las-zonas)
3. [Creamos el archivo de zona directa](#c.-creamos-el-archivo-de-zona-directa)
4. [Creamos el archivo de zona inversa](#d.-creamos-el-archivo-de-zona-inversa)
5. [Verificamos la red](#e.-verificamos-la-red)
6. [Verificación de respuesta autoritativa](#id-6.-verificacion-de-respuesta-autoritativa)

### **1. Configuramos las opciones**

Editamos el siguiente archivo:

```bash
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:

```bash
sudo nano /etc/default/named
```

Y editamos el archivo:

```bash
RESOLVCONF=no

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

Antes de continuar conviene revisar que no haya problemas:

```bash
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:

```bash
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`:

```bash
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`":

```bash
//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:**&#x20;

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:&#x20;

```bash
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:

<pre class="language-bash"><code class="lang-bash">sudo mkdir /etc/bind/zonas

<strong>sudo cp /etc/bind/db.empty /etc/bind/zonas/db.alexdns.local
</strong>sudo cp /etc/bind/db.127 /etc/bind/zonas/db.0.0.10
</code></pre>

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

```bash
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:

```dns-zone-file
$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`" .

{% hint style="info" %}
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.
{% endhint %}

{% hint style="success" %}
Para editar el archivo de zonas de forma más cómoda puedes usar VSCode con la extensión [vscode-zonefile](https://marketplace.visualstudio.com/items?itemName=Compilenix.vscode-zonefile)&#x20;
{% endhint %}

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

```bash
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:

```bash
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:

```dns-zone-file
$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`:

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

### 5. Verificamos la re&#x64;**:**

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:

```bash
sudo nano /etc/resolv.conf
```

```bash
nameserver 127.0.0.1
nameserver 10.0.0.5
```

&#x20;Reinicia el Servicio BIND9:

```bash
sudo systemctl restart bind9
sudo systemctl status bind9
```

{% hint style="warning" %}
Recuerda que para que esto funcione correctamente ahora deberás incluir la IP del servidor como DNS en el cliente.
{% endhint %}

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:

```bash
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:

```bash
ls -l /etc/resolv.conf
```

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

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

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

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

&#x20;Ahora, comprueba haciendo:

```bash
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.

{% hint style="info" %}
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.
{% endhint %}

#### Bibliografía:

* <https://bind9.readthedocs.io/en/v9_18_12/>
*
