Cómo instalar un sencillo servidor DNS

(c) Guillermo Ballester Valor
gbv@oxixares.com
Ogijares, Granada, España

Version 0.2.1 (17-Sep-2003)
Este documento tiene licencia GPL.

Sumario:

1.- Introducción   
    Servidor cache DNS.
    Servidor maestro de un dominio.
2.- Instalación del  software
    2.1 Desde RPM
    2.2 Desde código fuente.
3.- Configuración
    3.1 Ficheros básicos de configuración.
4.- Configuración final
5.- Bibiografía


1.- Introducción

Cuando indicamos a nuestro navegador Web que, por ejemplo, vaya a una página en www.gnu.org, éste tiene que realizar algunas tareas antes de saber dónde buscar.

Como es bien sabido, los ordenadores conectados a Internet se identifican por un número, la dirección IP. En este aspecto funciona igual que los teléfonos. Si queremos llamar a alguien cuyo nombre y apellidos conocemos, o bien sabemos de antemano el número, o se tiene que consultar en una guía o listín telefónico. En internet es lo mismo, de alguna forma el navegador tiene que averiguar qué número tiene el servidor de cada una de las páginas o documentos que se consultan. ¿Cómo se hace?

Sin entrar en detalles, básicamente diremos que nuestro ordenador realiza los siguientes pasos

  1. Se consultan los ficheros /etc/nsswitch.conf y /etc/host.conf. Si la librería del sistema utilizada es muy antigua (libc4 o anterior) entonces solamente se consulta el segundo fichero. Para libc5 y librería GNU C 2.x se lee el primero. Si existen ambos ficheros entonces deben de ser coherentes. En esencia, indican el orden que hay que seguir en la búsqueda. En el fichero /etc/nsswitch.conf debemos tener una línea

    hosts: files dns

    De existir /etc/host.conf deberíamos tener, por ejemplo, la línea

    order hosts, bind

    Ambos ficheros indcan que se busque primero en los ficheros locales, normalmente en el fichero /etc/hosts y despues se realice una consulta DNS, los términos dns o bind se refieren a éste último tipo de consulta.

  2. Suponiendo el orden descrito en el punto anterior, mira si en el fichero /etc/hosts existe una linea con la forma

    dirección_ip servidor_buscado

    Si esto es así la búsqueda ha terminado, pero no es lo habitual. De esta forma se recurre a la consulta DNS

  3. La consulta DNS comienza con la inspección del fichero /etc/resolv.conf. En este fichero tenemos una serie de lineas con el formato

    nameserver dirección_ip

    Es la lista de servidores DNS que tuvimos que implementar en su día para poder acceder a la red, y que nos facilitó nuestro Proveedor de Servicios de Internet. Primero envía una consulta al primero de ellos (DNS primario), en caso de fallo al secundario y así normalmente tenemos hasta 3 servidores.

  4. Cada uno de los servidores DNS consultados, busca si en su memoria caché por casualidad existe esa información y todavía es válida, en cuyo caso la sirve rápidamente. En caso negativo, la tiene que buscar en la red. El proceso es más o menos como sigue, supongamos se desea saber la dirección IP de gcc.gnu.org

    1. El servidor elige al azar uno de los servidores raiz de entre los que figuran en el fichero root.hint y entonces pregunta al servidor raíz remoto acerca de gcc.gnu.org.
    2. El servidor raiz, dada su jerarquía, no se molesta demasiado en responder totalmente, y solo lo hace forma parcial :-) . De entre todos los registros donde figuran los IP de los servidores primarios de .org (que pueden ser muchos) elige uno al azar y nos lo envía como respuesta
    3. Bien, con la IP de esa primera búsqueda se pregunta de nuevo a este nuevo servidor acerca de gcc.gnu.org. Tampoco se molesta en responder totalmente, de todos sus registros donde figuran DNS de .gnu.org elige como respuesta uno al azar.
    4. Con este nuevo IP se pregunta por tercera vez acerca de gcc.gnu.org. Este nuevo servidor ya nos devuelve la respuesta completa: la IP de gcc.gnu.org.

    En el caso de que la respuesta en alguno de los pasos anteriores fuera negativa, el servidor DNS supondría que no existe IP válida para el dominio solicitado. Otra posible incidencia puede ser que la respuesta no llegue a tiempo, en cuyo caso se recurre al siguiente servidor de la lista en /etc/resolv.conf.

    Los pasos a seguir en el proceso inverso, es decir, en la busqueda de un nombre a partir de una IP, son muy parecidos. Por ejemplo, si se busca el nombre del host con IP 62.72.78.213 el servidor pregunta por 213.78.72.62.in-addr.arpa (obsérvese cómo se invierte en la petición el orden de los cuatro números que conforman la IP). La primera llamada al servidor raíz nos daría información acerca de algún DNS que sabe de *.62.in-addr.arpa, llamando a este servidor obtendriamos otro que contiene información de *.72.62-in-addr.arpa y así sucesivamente hasta que en algún paso uno de los servidores encuentra la respuesta completa y nos la devuelve como gcc.gnu.org

Llegados a este punto, conviene aclarar que el término servidor DNS suele utilizarse para dos tipos de servicios totalmente distintos:

El objetivo de este documento es, fundamentalmente, instalar nuestro servidor local como servidor DNS primario funcionando como servidor caché, de forma que las consultas a lugares habituales se resuelven en pocos milisegundos en vez de superar, en algunos casos, una espera superior al segundo. La configuración como servidor maestro de algún dominio es algo más complicada, pero se darán indicaciones de cómo hacerlo.

2.- Instalación del software.

Como siempre, resulta mucho más sencillo utilizar los paquetes que ya vienen preparados en las distribuciones, aunque puede configurarse y compilarse desde el código fuente. El nombre usual del paquete en las distribuciones es bind9 . Es un código desarrollado por la Internet Software Consortium. La última versión puede conseguirse aquí

A continuación daremos dos breves descripciones de cómo puede instalarse el software, la primera a traves de RPM, utilizando como ejemplo la distribución SuSE 8.x. La segunda, compilando e instalando directamente desde el código fuente.

2.1 - Desde RPM.

En la distribución SuSE 8.0 y 8.1 los paquetes a instalar son bind9 y bind9-utils Si ya tiene instalados la version bind8, entonces es conveniente desinstalar previamente el paquete

#rpm -e bind8

Si se utiliza Yast2 para la instalación de paquetes, los pasos para instalar serían

En el caso de utilizar apt-get para actualizar paquetes, como root

#apt-get install bind9 bind9-utils

Una vez instalado el software, hay que configurarlo, lo cual se describe en el apartado 3.


2.2 - Desde código fuente.

Si se utiliza el código fuente, el método de instalación es el habitual.  Desde aquí podemos conseguir la última versión (suponemos en los ejemplos la 9.x.x).  Desde un directorio descomprimimos el  fichero

> tar -xvzf  bind-9.x.x.tar.gz

si está comprimido con gzip. En caso de que la compresión sea con bzip2

> tar -xvjf binf-9.x.x.tar.bz2

Se cambia al directorio creado,

> cd bind-9.x.x

Deberíamos leer el fichero README en ese directorio. El paso siguiente es configurar, podemos ver las opciones de configuración con

> ./configure --help

Una vez elegidas las opciones, se configura

> ./configure

El siguiente paso es la compilación,

>  make

y por ultimo, como root, se procede a la instalación

# make install

con ello, el software quedará instalado.  Ahora queda configurarlo.

3.- Configuración.

Una vez instalado el software, hay que configurarlo. En este punto, todo depende de qué configuración de red tenemos y qué tipo de servidor queremos configurar. Lo mas común es hacerlo como servidor caché DNS y quizás como maestro de algún dominio.

3.1 - Ficheros básicos de configuración.

El binario que realiza el servicio DNS se llama named. El fichero de configuración en muchas distribuciones es /etc/named.conf . El utilizado por SuSE puede servir como base. Si se utilizan los rpms de SuSE para instalar, todos estos ficheros ya estan convenientemente instalados en el directorio /var/named.

# Copyright (c) 2001 SuSE GmbH Nuernberg, Germany
#
# Author: Frank Bodammer <feedback@suse.de>
#
# Traducción y comentarios:
#         Guillermo Ballester Valor gbv@oxixares.com
#
# /etc/named.conf
#
# Este es un ejemplo de fichero de configuración de name para BIND9
# Funciona como servidor caché sin modificación.
#
# Un ejemplo para hacer de servidor maestro de tu propio dominio puedes
# verlo en /usr/share/doc/packages/bind9/sample-config.
#
# La descripción de todas las opciones posibles puede verse en
# /usr/share/doc/packages/bind9/misc/options.

options {

         # Aquí se define el nombre del directorio de trabajo

         directory "/var/named";

         # La Línea forwarders se puede descomentar, cambiando los
         # IP por los que facilita el Proveedor de Servicios de Internet
         # Si se habilita, el servidor puede pasar la petición a los
         # servidores indicados. En general, no es necesario habilitar
         # esta opción si en el fichero 'resolv.conf' ya están esos
         # servidores que suminstra el ISP.

         #forwarders { 10.11.12.13; 10.11.12.14; };

         # Si se habilita la siguiente línea, antes que intentar buscar la información
         # por sí mismo, el servidor la solicita la información a los 'forwarders'
         # definidos anteriormente

         #forward first;

         # Con la siguiente linea, se define la interface y el puerto en las
         # que named escucha las peticiones DNS. Por defecto escucha en todas
         # las interfaces definidas en el sistema. El puerto definido por defecto
         # es el 53, y puede cambiarse en esta línea.

         #listen-on port 53 { 127.0.0.1; };


         # Esta línea activa la escucha de interfaces IPV6
         # Los valores permitidos son 'any' y 'none'
         # o una lista de direcciones IPv6 se puede utilizar solamente
         # con el kernel 2.4 en esta version.

         listen-on-v6 { any; };

         # Las siguientes tres líneas se pueden necesitar si hay un firewall
         # entre el servidor e internet.

         #query-source address * port 53;
         #transfer-source * port 53;
         #notify-source * port 53;

         # La línea allow-query contiene una lista de redes o direcciones IP
         # para aceptar o rechazar peticiones. La opción por defecto es aceptar
         # todas las peticiones de todas las direcciones.

         #allow-query { 127.0.0.1; };

         # Si notify se pone a yes (por defecto), se envían mensajes 'notify' a otros
         # servidores cuando cambian los datos de alguna zona. En vez de utilizar esta
         # opción de forma global, es mejor hacerlo individualmente en la definición
         # de cada zona

         notify no;
 };


# Las siguientes tres definiciones no necesitan ninguna modificación.
# La primera define 'localhost', la segunda la inversa para 'localhost'
# y la tercera es la definición de los servidores raíz "."

zone "localhost" in {
         type master;
         file "localhost.zone";
 };

zone "0.0.127.in-addr.arpa" in {
         type master;
         file "127.0.0.zone";
 };

zone "." in {
         type hint;
         file "root.hint";
 };

# Aquí puedes introducir las definiciones de zona para tus propios
# dominios.

En las definiciones de zona que hay al final del fichero anterior, se hace referencia a tres ficheros de configuración de zona. EL fichero 127.0.0.zone

$TTL 1W
@               IN SOA          localhost.   root.localhost. (
                                20030325        ; Numero de serie
                                2D              ; refresh
                                4H              ; retry
                                6W              ; expiry
                                1W )            ; minimum

                IN NS           localhost.
1               IN PTR          localhost.

Para el fichero localhost.zone

$TTL 1W
@               IN SOA  @   root (
                                20030325        ; Numero de serie
                                2D              ; refresh
                                4H              ; retry
                                6W              ; expiry
                                1W )            ; minimum

                IN NS           @
                IN A            127.0.0.1

El fichero root.hint contiene la información de los servidores raíz. Puede obtenerse la última versión mediante ftp anónimo desde Internic aquí. La última versión es:

;       This file holds the information on root name servers needed to
;       initialize cache of Internet domain name servers
;       (e.g. reference this file in the "cache  .  <file>"
;       configuration file of BIND domain name servers).
;
;       This file is made available by InterNIC
;       under anonymous FTP as
;           file                /domain/named.root
;           on server           FTP.INTERNIC.NET
;
;       last update:    Nov 5, 2002
;       related version of root zone:   2002110501
;
;
; formerly NS.INTERNIC.NET
;
.                        3600000  IN  NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
;
; formerly NS1.ISI.EDU
;
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107
;
; formerly C.PSI.NET
;
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
;
; formerly TERP.UMD.EDU
;
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
;
; formerly NS.NASA.GOV
;
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
;
; formerly NS.ISC.ORG
;
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
;
; formerly NS.NIC.DDN.MIL
;
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
;
; formerly AOS.ARL.ARMY.MIL
;
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53
;
; formerly NIC.NORDU.NET
;
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
;
; operated by VeriSign, Inc.
;
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30
;
; housed in LINX, operated by RIPE NCC
;
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
;
; operated by IANA
;
.                        3600000      NS    L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.      3600000      A     198.32.64.12
;
; housed in Japan, operated by WIDE
;
.                        3600000      NS    M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
; End of File


Con los ficheros descritos hasta ahora, tendríamos configurado un simple servidor cache DNS.  Si el lector no pretende crear un servidor maestro para ningún dominio,  puede seguir en el apartado 4.

3.2 Configuración de servidor maestro de un dominio

Normalmente, al registrar un dominio en Internet, la empresa o Agente registrador además de realizar el registro nos proporciona el servicio de servidor maestro. Esto es, cualquier dato referente a nuestro dominio tendrá que ser buscado en el servidor que se nos facilita. Normalmente, las empresas que nos registran el dominio nos facilitan el acceso remoto al servidor maestro para poder introducir la información deseada.

Si tengo una linea ADSL con una IP fija XXX.XXX.XXX.XXX en la que un servidor Web quiero que preste los servicios al dominio mi_dominio.com, tengo que incluir esa información en el servidor maestro. También puedo decirle qué maquina sirve como agente de correo para ese dominio, qué otra como servidor ftp ...

Realmente, la forma en que se incluye toda esa información es la misma para todos los sevidores DNS de la Internet, lo único que varía en cada caso es la complejidad. Se puede gestionar el servidor maestro de un simple dominio compuesto por una sola máquina o la de un dominio que representa una gran red extendida por todo el mundo. Escribir en profundidad cómo se configura un DNS en todos los casos es una tarea que desborda este pequeño documento. No obstante, daremos alguna indicación de cómo configurar en casos sencillos.

Como ya se ha dicho, la configuración de BIND9 se introduce en el fichero /etc/named.conf .De la lectura del ejemplo en este documento puede inferirse su funcionamiento básico. Este puede ser muy complejo, si se quiere profundizar puede consultar este documento pdf en inglés.  En muchos casos, puede ser adecuada la configuración básica del ejemplo, añadiendo al final del fichero la definición de la zona o zonas para nuestro dominio.

En lo que sigue supondremos que el dominio es mi_dominio.com y que la direccion IP asignada es 201.202.203.204. Ello implica que al registrar el dominio mi_dominio.com ha habido que suministrar esa dirección IP como dirección IP del servidor maestro. Si nuestro registrador de dominio ha suministrado otro servidor DNS entonces NO podemos configurar en nuestro ordenador un servidor maestro para ese dominio, pero lo que sigue puede ayudarnos a configurar de forma remota el servidor DNS que el registrador pone a nuestra disposición.

Los datos de cada dominio suelen escribirse en ficheros separados, en el caso del ejemplo que sigue en dos ficheros "mi_dominio.com.zone" y "203.202.201.zone" ambos en el directorio /var/named . El primero de ellos servirá, en esencia, para que cualquiera en la internet que solicite información de xxx.mi_dominio.com obtenga como respuesta una dirección IP a la que dirigirse. El segundo se refiere a una búsqueda inversa: Cualquiera que solicite información acerca de qué host es el que tiene como dirección IP 201.202.203.XXX obtendrá como respuesta un nombre de host.


# Aquí puedes introducir las definiciones de zona para tus propios
# dominios.
zone "mi_dominio.com" {
        type master;
        file "zone/land-5.com.zone";
};




zone "203.202.201.in-addr.arpa" {
       type master;
        file "203.202.201.zone";
};


NOTA IMPORTANTE: Este segundo tipo de zona presenta frecuentemente muchos problemas. Así como generalmente disponemos de la libertad de hacer lo que queramos con el nombre de dominio que hemos registrado (colocarlo en el Host que deseemos con la IP que dispongamos), NO ocurre lo mismo con la resolución inversa de la IP. La diferencia es que nosotros podemos utilizar el servidor maestro de nuestro dominio y allí indicar cómo se traducen de nombres a direcciones IPs: en el dueño del dominio se da delegado la posibilidad de especificar registros tipo nombres->IP. En cambio, la posibilidad inversa no suele ser delegada. Por ejemplo, aunque dispongamos de una conexión ADSL con IP fijo, es habitual que nuestro Proveedor de Servicios tenga ya fijada una zona de resolución inversa para nuestra IP, de forma que nosotros NO podremos escribir una.

De todas formas, siempre puede solicitarse al Proveedor de Servicios la delegación de la resolución inversa , aunque me temo que o bien la respuesta será negativa o ello implicará mayores costes :(.


 
 

4.- Configuración final.


Para que un sistema llame a nuestro servidor DNS en primer lugar, no olvidarse de insertar como primera línea de /etc/resolv.conf

nameserver mi_direccion_ip

téngase en cuenta que hay que poner la dirección IP adecuada para acceder al servidor. Esta IP puede ser 127.0.0.1 si estamos en el mismo sistema donde instalamos named, puede ser una IP desde nuestra red interna 192.168.xxx.xxx y desde fuera puede ser una IP válida en la Internet.

No conviene borrar los IP de los servidores que nos suministró nuestro proveedor de servicios, en caso de que nuestro nuestro servidor falle, se recurre a estos otros como alternativa.

Recuérdese que hay que dejar abierto el puerto #53 (o el que se defina en el fichero de configuración /etc/named.conf) para que se pueda acceder desde los sistemas a los que desemos prestar el servicio DNS, normalmente una red local. Si se deja libre el acceso desde la Internet sin restricciones puede haber un abuso de peticiones DNS que pueden colapsar nuestro sistema. Para evitarlo, se debe configurar adecuadamente nuestro firewall o al menos ajustar el parametro allow-query en /etc/named.conf

Una vez que se ha instalado el software, hay que activar el servidor. Se trata del demonio named. Lo habitual es que en los paquetes precompilados ya se incluya el script de inicio y control de tal forma que se pueda configurar como servicio al arrancar el sistema.

En el caso de SuSE, con el sistema de inicio tipo system V, este script se halla en el directorio /etc/init.d y también se llama named. Tras la instalación del rpm, se activa el servicio con

#rcnamed start

rcnamed es simplemente un enlace blando que se halla en /usr/sbin

Bien, para ver si funciona el servidor podemos intentar el comando dig que siempre se incluye con el paquete. Ahora no hace falta trabajar como root.

>dig www.gnu.org

Si el resultado es similar a

; <<>> DiG 9.2.2 <<>> www.gnu.org
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39212
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 1

;; QUESTION SECTION:
;www.gnu.org.                   IN      A

;; ANSWER SECTION:
www.gnu.org.            86400   IN      A       199.232.41.10

;; AUTHORITY SECTION:
gnu.org.                86400   IN      NS      ns1.gnu.org.
gnu.org.                86400   IN      NS      ns2.gnu.org.
gnu.org.                86400   IN      NS      ns3.gnu.org.
gnu.org.                86400   IN      NS      ns4.gnu.org.

;; ADDITIONAL SECTION:
ns4.gnu.org.            86400   IN      A       193.201.200.170

;; Query time: 122 msec
;; SERVER: 192.168.0.4#53(192.168.0.4)
;; WHEN: Mon Sep  1 18:41:11 2003
;; MSG SIZE  rcvd: 133

Entonces nuestro servidor funciona. Fíjese en la última parte de la salida, se supone que la IP de nuestro servidor es 192.168.0.4. Ha tardado 122 milisegundos en obtener una respuesta. Si repetimos de nuevo la misma consulta, la última parte será parecida a

;; Query time: 2 msec
;; SERVER: 192.168.0.4#53(192.168.0.4)
;; WHEN: Mon Sep  1 18:55:07 2003
;; MSG SIZE  rcvd: 133

¡Ahora solo ha tardado 2 milisegundos!. Ya tiene esa información en el caché (que expira 86400 segundos despues de la primera consulta). Nuestro servidor esta listo para trabajar :-). Es importante notar que named no genera ningun fichero, el caché esta en memoria. De tal forma cuando se interrumpe el demonio o se inicia el sistema el caché parte de cero.

Queda por comentar cómo se hace para que al arrancar el sistema se active named. Esto dependerá en cada caso de la distribución. En el caso de SuSE 8.2 esto se realiza facilmente con yast2
yast2 -> Runlevel editor -> RunLevel properties -> Activar named en niveles 3 y 5

5.- Bibliografía.

El documento básico es la traducción al español de Cómo ser un administrador DNS en poco tiempo. .

Para finalizar, solo expresar mi deseo de que este pequeño documento sea útil, al menos en mi caso he mejorado notablemente la velocidad de navegación en la Internet. Las críticas, aviso de fallos y sugerencias me las podeis enviar aquí.