¿Cómo funciona el DNS en Internet?

Cómo funciona Internet: ¿Qué son y para qué sirven las DNS?

Instalación del servidor Bind en Ubuntu

En este artículo vas a aprender cómo puedes montar tu propio servidor DNS dentro de tu red local, de manera que se encargue de resolver las direcciones IP locales, pudiendo asignarle un nombre a cada host de la red.

Uno de los servidores DNS más utilizados para Linux es Bind. Es una aplicación gratuita, de código abierto, y se pueden encontrar versiones compiladas para Windows, Linux y Mac.

En Ubuntu se puede encontrar el software de este servidor en sus repositorios, por lo que la instalación se puede realizar con:

sudo apt-get install bind9

Archivo de configuración del servidor

Como suele ser habitual, este servidor se configura a través de un archivo de texto. En este caso, el archivo principal de configuración es: /etc/bind/named.conf que tiene el siguiente contenido:

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

Como se puede apreciar en el contenido anterior, lo que hace el archivo de configuración es cargar otros archivos, y nos informa que para añadir nuevas zonas se utilice el archivo /etc/bind/named.conf.local. Por tanto debes editar ese archivo para realizar la configuración del servidor DNS.

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

Configuración básica de una nueva zona

En primer lugar debes incluir en el archivo named.conf.local la declaración del nombre de la zona, su tipo y el archivo que va a contener la configuración de esa zona. 

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
};

En la estructura anterior deberás sustituir example.com por el nombre de dominio de la zona que estás creando, y el nombre del archivo example.com.db deberás modificarlo según el nombre anterior. Por convenio, los archivos que contengan la configuración de la zona tienen como nombre, el nombre del dominio precedido o seguido del término db.

Contenido del archivo de zona

Dicho archivo (por ejemplo db.example.com) debe contener, en primer lugar la directiva $TTL, la cual justa el valor Time to Live (TTL) predeterminado para la zona. Este es el tiempo, en segundos, que un registro de recurso de zona es válido. Cuando se decide aumentar este valor, permite a los servidores de nombres remotos hacer caché a la información de zona para un período más largo de tiempo, reduciendo el número de consultas para la zona y alargando la cantidad de tiempo requerido para proliferar cambios de registros de recursos. Por ejemplo, para establecer el TTL en 1 día:

$TTL 86400

A continuación debes especificar el registro de recursos Start Of Authority (SOA), que declara, al servidor de nombres, información importante de autoridad relacionada con los espacios de nombres. Esa sección debe tener el siguiente formato (¡OJO CON LOS PUNTOS QUE SE AÑADEN AL FINAL DE CADA NOMBRE!):

@ IN SOA <primary-name-server>. <hostmaster-email>. (
              <serial-number>
              <time-to-refresh>
              <time-to-retry>
              <time-to-expire>
              <minimum-TTL> )

  • El nombre del host del servidor de nombres que tiene autoridad para este dominio es la directiva <primary-name-server> y el correo electrónico (sustituyendo la arroba por un punto) de la persona a contactar sobre este espacio de nombres es la directiva <hostmaster-email>Ambos deben finalizar con un punto. Ten en cuenta que en el formato para indicar el email del administrador no se usa la arroba, se usa un punto en su lugar.
  • La directiva <serial-number> es un valor numérico que es incrementado cada vez que se cambia el archivo de zona para así indicar a named que debería recargar esta zona. Es frecuente usar una fecha para este valor.
  • La directiva <time-to-refresh> es el valor numérico que los servidores esclavos utilizan para determinar cuánto tiempo debe esperar antes de preguntar al servidor de nombres maestro si se han realizado cambios a la zona.
  • La directiva <time-to-retry> es un valor numérico usado por los servidores esclavo para determinar el intervalo de tiempo que tiene que esperar antes de emitir una petición de actualización de datos en caso de que el servidor de nombres maestro no responda.
  • Si el servidor maestro no ha respondido a una petición de actualización de datos antes que se acabe el intervalo de tiempo <time-to-expire>, los servidores esclavo paran de responder como una autoridad por peticiones relacionadas a ese espacio de nombres.
  • La directiva <minimum-TTL> es la cantidad de tiempo que otros servidores de nombres guardan en caché la información de zona.

Por ejemplo:

@ IN SOA ns.example.com. admin.example.com. (
         2001062501 ; número de serie
         21600 ; refrescar cada 6 horas
         3600 ; reintentar cada hora
         604800 ; expirar despúes de 1 semana
         86400 ) ; TTL mínimo de 1 día

Los tiempos se indican en segundos si no se indica otra cosa, pero puedes especificar otras unidades de tiempo como las siguientes:

  • s = segundos = x 1 segundo
  • m = minutos = x 60 segundos
  • h = horas= x 3600 segundos
  • d = días = x 86400 segundos
  • w = semanas = x 604800 segundos

Por ejemplo:

@ IN SOA ns.foo.com. root.foo.com. (
2003080800 ; número de serie
10800s ; refresco = 3 horas
15M ; actualización = 15 minutos
3W12h ; expira = 3 semanas + 12 horas
2h20M ; TTL mínimo = 2 horas + 20 minutos
)

Para cada nombre de host que haga de servidor de nombres (DNS) que quieras declarar en el dominio debes usar la siguiente línea (OJO DE NUEVO CON EL PUNTO FINAL):

@    IN     NS     <nameserver-name>.

Por ejemplo, para declarar que el servidor de nombres de dominio va a ser el host con nombre host1, se debe indicar la línea:

@    IN     NS     host1.example.com.

Para establecer la relación de un host con la IP correspondiente se debe usar el regitro A, con el siguiente formato:

<host>     IN     A     <IP-address>

Por ejemplo, para que el nombre de dominio completo host1.example.com se redirija a la IP 192.168.0.101:

host1    IN     A     192.168.0.101

Un ejemplo completo del archivo db.example.com podría ser el siguiente, donde el host1 va a hacer las funciones de servidor de nombres (NS) y las IPs asociadas serán 192.168.0.101 para el host1 y 192.168.0.102 para el host2:

$TTL   604800
@    IN  SOA host1.example.com. admin.example.com. (
                    2
            604800
              86400
           2419200
            604800 ) 
@      IN NS host1.example.com.
host1 IN A 192.168.0.101
host2  IN  A   192.168.0.102

Reiniciar el servidor Bind

Como suele ser habitual, la manera de reiniar el servidor es:

sudo /etc/init.d/bind9 restart

O bien:

sudo service bind9 restart

Deberás hacerlo cada vez que realices cambios en la configuración del servidor.

Recuerda que además de la opción restart, tienes las opciones start y stop para iniciar o parar respectivamente el servidor Bind.

Comprobar la sintaxis de la configuración

Para probar el funcionamiento puedes intentar un ping desde un equipo cliente hasta el servidor. Si no te funciona la configuración que has hecho, puede ser que tengas algún error de sintaxis en los archivos de configuración. Utiliza el comando named-checkconf para comprobarlo:

sudo named-checkconf

También se puede probar la orden named-checkzone seguido del nombre de zona y de su archivo de configuración:

sudo named-checkzone example.com /etc/bind/db.example.com

Limpiar la caché

Para acelerar el proceso de traducción de las direcciones, el servidor almacena la información en una caché, por lo que si realizas cambios en la configuración de Bind, debes limpiar la caché para que los cambios tengan efecto. No es suficiente con reiniciar el servicio. Para limpiar la caché del servidor DNS, utiliza el comando:

sudo rndc flush

Por otro lado, el equipo cliente que hace las consultas al servidor DNS también tiene una caché donde guarda las resoluciones anteriores que se hayan realizado. Por tanto, si estás realizando cambios en la configuración de Bind, es conveniente que limpies la caché del cliente cada vez para evitar errores de interpretación de los resultados.

Puedes comprobar el estado actual de la caché cliente DNS de una máquina Windows con:

ipconfig /displaydns

En Windows puedes limpiar la caché del cliente DNS con:

ipconfig /flushdns

Otros tipos de registros de configuración

  • CNAME: Permite crear una alias para un nombre de host.

<nombre-alias>     IN     CNAME       <nombre-real>

Por ejemplo:

www          IN     CNAME   host1
  • MX: Registro de Mail eXchange. Indica dónde debería ir el correo enviado a un espacio de nombres.

IN     MX     <orden-de-preferencia>  <nombre-servidor-email-server>

El valor más bajo del orden de preferencia es preferido sobre los otros.

Por ejemplo:

 IN   MX   10   mail.example.com.
IN MX 20 mail2.example.com.
  • PTR: Usado para la resolución inversa de nombres.

<ultimos-digitos-IP>      IN     PTR    <nombre-dominio-completo>

Por ejemplo:

20    IN    PTR    host2.example.com.
21 IN PTR host3.example.com.

Para hacer la resolución inversa (al indicar una dirección IP se obtendrá como resultado el nombre de dominio) es necesario crear un nuevo archivo de zona también declarado en el archivo named.conf.local:

zone "0.168.192.in-addr.arpa" IN {
type master;
file "/etc/bind/rev.example.com";
};

Archivo rev.example.com

$TTL 86400
@    IN    SOA example.com. admin.example.com. (
                    2
            604800
              86400
           2419200
            604800 ) 
@ IN NS host1.example.com.
101 IN PTR host1.example.com.

Realizando una llamada al comando nslookup con la IP buscada, debe obtenerse el nombre de dominio completo asociado a esa IP.

Por ejemplo:

nslookup 192.168.0.101

Debe obtener como respuesta:

Nombre: host1.example.com
Address: 192.168.0.101

Forwarders

Si has configurado una máquina cliente para que haga uso de este servidor DNS, sin especificar un DNS secundario, podrás observar que no puedes acceder a las direcciones de Internet usando sus nombres de dominio, ya que este servidor DNS sólo reconocerá las direcciones que se encuentren registradas en él (host1.example.com, etc).

Para que este mismo servidor DNS pueda resolver los nombres de dominio que se encuentren registrados en otro servidor de dominio (por ejemplo, el servidor DNS que suelas usar para conectarte a Internet), tienes que configurar al menos un forward en Bind.

Edita el archivo /etc/bind/named.conf.options y descomenta las siguientes líneas:

        // forwarders {
        //      0.0.0.0;
        // }; 

 En lugar de la dirección 0.0.0.0 indica la dirección IP del servidor DNS de Internet que quieras utilizar, por ejemplo:

        forwarders {
             8.8.8.8;
        }; 

Recuerda reiniciar Bind.

Con esta operación están indicando al servidor Bind, que si él no sabe resolver una petición de un nombre de dominio, le pase la petición a otro servidor DNS. Para comprobar que funciona correctamente el Forward, realiza un ping a una máquina del nombre de dominio que has creado y otro ping a un nombre de dominio de Internet, y ambos deberían funcionar correctamente.

Más recursos de ayuda