Tinydns
Estas son las notas sobre la instalación y puesta en marcha del servicio de resolución de nombres con el programa tinydns de D. J. Bernstein.
Sumario
Enlaces y referencias
- Ref: tinydns data format
- Ref: Ejemplo procedente de Bytemark.co.uk
- En la web Troubleshooters:
Conceptos
El paquete djbdns no ofrece como otros todos los servicios en un único programa. En su lugar divide el servicio en cometidos muy concretos y utiliza un programa para cada uno. Estos programas pueden usarse entonces juntos o por separado, dependiendo de las necesidades concretas del sitio en el que vayan a desplegarse.
Resolutor recursivo
Un resolutor recursivo es aquél que, una vez que ha recibido una petición, realiza todas las consultas necesarias en todos los servidores que requieran para obtener una respuesta. El programa dnscache es el encargado de esta tarea, escuchando en el puerto estándar del servicio (53), y no devuelve nunca datos autorizados sobre un dominio puesto que no es su tarea gestionarlos.
Es el que uno instalaría en una red para que diese servicio de resolución de nombres a las máquinas que la componen y poder así comunicarse con el mundo exterior. Almacena en una memoria caché los resultados y es muy rápido en su tarea.
Resolutor autorizado
Un resolutor autorizado es aquél que sabe las direcciones IP y los nombres de uno o varios dominios de Internet. Cuando se le consulta sólo puede responder con lo que sabe y nunca realiza otras consultas a terceros para averiguar más cosas.
Es el que uno instalaría cuando se dispone de un dominio (interno o externo) que debe gestionar y para el que es la última y autorizada fuente de conocimientos sobre él. El programa tinydns es el encargado de este servicio. Escucha también en el puerto estándar (53) por lo que no puede coexistir con el programa dnscache en una misma dirección IP.
Servidores conjuntos
Cuando se necesita gestionar un dominio para una red y al mismo tiempo proporcionar resolución de nombres para las máquinas que la componen la solución consiste en:
- Ejecutar tinydns con los datos del dominio en el interfaz local (127.0.0.1).
- Ejecutar dnscache en el interfaz público (por ejemplo 192.168.0.1)
- Registrar el servidor tinydns como servidor raíz en la lista de dnscache.
De esta forma cuando las máquinas que forman la red solicitan un nombre interno, dnscache consulta directamente a tinydns sin salir al exterior (a menos que ya esté en su caché interno). La única pega de este montaje es que si actualizamos los nombres del dominio interno es necesario recargar también al resolutor recursivo de manera inmediata.
Instalación de paquetes y ajustes
La instalación de este software en Debian no está completamente afinada y no basta con instalar los paquetes para poner en marcha los servicios.
En mi caso he instalado los siguientes paquetes:
- daemontools
- daemontools-run
- dbndns (de la rama sid)
y luego he tenido que realizar varios ajustes a mano para poner en marcha el servicio. Entre éstos está crear un usuario para los archivos de registro y un directorio de trabajo.
$ sudo useradd -d /var/log/dns -s /bin/false -g nogroup dnslog $ sudo install -d -o dnslog -g adm /var/log/dns
dnscache
Este programa requiere un usuario bajo el que funcionar y varios directorios de trabajo. El usuario es dnscache y los directorios son uno para el almacenamiento y otro para los registros de actividad.
$ su # useradd -d /var/lib/dnscache -s /bin/false -g nogroup dnscache # dnscache-conf dnscache dnslog /var/lib/dnscache 192.168.0.99 # update-service --add /var/lib/dnscache
El programa dnscache-conf crea el entorno de trabajo en el directorio /var/lib/dnscache (en el que debe haber espacio libre porque allí se guardarán los cachés de nombres) y asigna la propiedad al usuario dnscache, la de los registros a dnslog y define la dirección IP en la que atenderá peticiones.
Con update-service situamos el servicio bajo el control de daemontools que en breve tiempo (unos segundos generalmente) lo pondrá en marcha. Una vez se ponga en marcha ya es posible resolver nombres sin más ajustes.
El directorio de trabajo de dnscache es en este caso /var/lib/dnscache/root
y en él aparecen dos directorios que sirven para:
- root/ip
- para indicar, mediante archivos con la dirección IP completa o parcial, quienes tienen acceso al servidor de nombres.
- root/servers
- para almacenar la lista de servidores raíz a los que tiene que consultar. Un símbolo arroba (@) como nombre define los servidores raíz en general y un nombre de dominio concreto contiene la IP del servidor autorizado para ese dominio.
tinydns
Ya que este programa debe conocer las direcciones IP y los nombres de máquinas en el dominio al que está dando servicio es necesario hacer alguna cosa más. En principio, y una vez instalado, hacemos:
$ su # useradd -d /etc/tinydns -s /bin/false -g nogroup tinydns # tinydns-conf tinydns dnslog /etc/tinydns 127.0.0.1 # update-service --add /etc/tinydns
Para luego añadir información sobre el dominio. Nos cambiamos al directorio /etc/tinydns/root y editamos el archivo data rellenando la información pertinente (ver la sección más abajo).
# # Registro SOA para el dominio .example.net::192.168.0.99 # # Resolución inversa # .0.168.192.in-addr.arpa:127.0.0.1:a:259200 # # Intercambiador de correo # @example.net:192.168.0.99:a:10 # # Definiciones para maginot # =example.net:192.168.0.99 =maginot.example.net:192.168.0.99 +www.example.net:192.168.0.99 +proxy.example.net:192.168.0.99 +mail.example.net:192.168.0.99 +smtp.example.net:192.168.0.99 +apt.example.net:192.168.0.99 +printers.example.net:192.168.0.99 +lp.example.net:192.168.0.99 +sync.example.net:192.168.0.99 +admin.example.net:192.168.0.99 # # Router inalámbrico # =wifi.example.net:192.168.0.98 # # Router ADSL # =dsl.example.net:192.168.2.1 # # Host: calcuta # =calcuta.example.net:192.168.0.31
y ahora le indicamos que convierta al formato binario y que relea los cambios con:
# pwd /etc/tinydns/root # make
Conviene firjarse en la línea que indica la resolución inversa ya que es un error común encontrar que apunta al servidor resolutivo (192.168.0.99) en lugar de a sí mismo (127.0.0.1). Ya que cualquier registro de tipo A (definido por el carácter igual =) crea dos registros, uno A y otro PTR para la misma máquina, no es necesario definir más que el servidor inverso para toda la zona (o zonas) sobre las que tiene autoridad.
dnscache y tinydns
Para que ambos servidores funcionen conjuntamente debemos indicar a dnscache que para nuestro dominio example.net utilice el servidor local en la dirección 127.0.0.1. Es decir, queremos indicarle que somos un servidor autorizado para dicho lugar y que no busque fuera.
dnscache emplea ficheros que contienen direcciones en un directorio concreto. En este caso dicho directorio es /var/lib/dnscache/root/servers y allí ya se encuentra un archivo de nombre @ y que contiene las direcciones IP de los servidores raíz a los que debe enviar en primer lugar las consultas.
# cd /var/lib/dnscache/root/servers # echo 127.0.0.1 > example.net # echo 127.0.0.1 > 0.168.192.in-addr.arpa # svc -t /var/lib/dnscache
La última orden sirve para finalizar el servidor dnscache y como el supervisor de daemontools lo vuelve a poner en marcha automáticamente al final se emplea como herramienta para recargar el servicio.
El árbol de archivos queda ahora así:
/var/lib/dnscache/root ├── ip │ └── 192.168.0 └── servers ├── @ ├── 0.168.192.in-addr.arpa └── example.net
Ahora sólo queda otro ajuste más y que consiste en alterar el archivo /etc/tinydns/root/Makefile de manera que cada vez que tenga que actualizar la base de datos de tinydns (suponemos que tras hacer un cambio) fuerce a dnscache a que haga lo mismo. Y es que el caché tiene un tiempo de espera muy largo de consulta sobre los servidores raíz y nosotros queremos que los cambios en nuestro dominio aparezcan inmediatamente.
El archivo quedaría así:
data.cdb: data
/usr/bin/tinydns-data
/usr/bin/svc -t /var/lib/dnscache
Archivos de registro
Los archivos de registro de actividades de los distintos servidores están bajo el directorio de trabajo de cada uno de ellos y eso puede no ser lo más aconsejable para revisarlos y mantenerlos.
Una vez configurados ambos servicios se pueden detener y mover los directorios a un lugar más adecuado:
# svc -d /var/lib/dnscache # install -d -o dnslog -g adm /var/log/dns # cd /var/lib/dnscache # cp -r log /var/log/dns/dnscache # mv log log-old # ln -s /var/log/dns/dnscache log # rm -rf log-old # svc -u /var/lib/dnscache
Es decir, detenemos el servicio, creamos el directorio de registros, copiamos el contenido actual e intercambiamos el nuevo directorio por el antiguo para, tras limpiar, activar el servicio otra vez.
Formato de tinydns
La base de datos de direcciones y nombres de tinydns tiene como fuente un archivo de texto en el que cada línea define un registro, a excepción de aquellas que comienzan por una almohadilla (#) que son tomadas como comentarios e ignoradas.
El primer carácter de cada línea es el que indica el tipo de registro y, por consiguiente, los campos de los que debe o puede estar compuesto. En cada registro los campos están separados de los demás por un signo de dos puntos (:).
Tipo de registro | Carácter | Registros creados | Ejemplo |
---|---|---|---|
Start of authority (SOA) | . |
|
.example.net:192.168.0.99 |
Name server (NS) | & |
|
&example.net:192.168.0.100:ns.example.net |
Address | = |
|
=db.example.net:192.168.0.33 |
Alias | + |
|
+lp.venexma.net:192.168.0.33 |
Mail exchanger | @ |
|
@example.net:192.168.0.3:mail.example.net:10 |
Otras configuraciones
DHCP
La actualización de la base de datos de nombres cuando se asignan direcciones IP dinámicamente es una carencia del programa que puede subsanarse fácilmente instalando un software de terceros. Este software (referenciado arriba) es obra de Michael Stella y tiene ya un buen número de años, tantos que no el autor no lo mantiene ya, pero que funciona bien porque en realidad sus principios de diseño son muy básicos. Eso sí, sólo está diseñado para interactuar con tinydns y el servidor DHCP de ISC (isc-dchp-server) o con programas completamente compatibles en funcionamiento.
El programa se llamada djb_update.pl y debe estar en funcionamiento constante ya que monitoriza el archivo de cesiones de IP y cuando se produce una nueva entrada en el mismo, modifica la base de datos de tinydns y le indica que la relea.
El archivo Makefile que acompaña al programa necesita adecuarse al entorno y para ello se debe modificar en parte:
# CONFIGURE HERE
# (no trailing slashes on directories)
PREFIX = /usr
DOMAIN = example.net
TINYDNSPATH = /etc/tinydns
DNSCACHEPATH = /var/lib/dnscache
LEASEFILE = /var/lib/dhcp/dhcpd.leases
Como además tiene que crear un archivo Makefile personalizado para tinydns debemos retocar también la plantilla que utiliza llamada djbmakefile
data.cdb: data
/usr/bin/tinydns-data
/usr/bin/svc -h DNSCACHEPATH
db.MYDOMAIN: static.MYDOMAIN dhcp.MYDOMAIN
@echo "# DO NOT EDIT THIS FILE DIRECTLY" > db.MYDOMAIN
cat static.MYDOMAIN dhcp.MYDOMAIN >> db.MYDOMAIN
dhcp.MYDOMAIN:
touch $?
data: db.MYDOMAIN
@echo "# DO NOT EDIT THIS FILE DIRECTLY" > data
cat db.* >> data
Una vez instalado el programa visitamos el directorio de tinydns y hacemos una copia de nuestro archivo data original como db.example.net que sirve para que el actualizador no permita que una asignación de dirección IP altere ningún nombre de los que hemos situado en nuestro dominio. Es una medida de seguridad muy razonable.
Para ponerlo en marcha podemos crear un pequeño script que situamos convenientemente en el arranque local del sistema (por ejemplo en /etc/rc.local
):
#!/bin/bash
PROGRAM=/usr/local/bin/djb_update.pl
LOGFILE=/var/log/dns/djb_update.log
if [ ! -e $LOGFILE ]; then
touch $LOGFILE
chown dnslog:adm $LOGFILE
fi
cd /etc/tinydns/root
exec $PROGRAM 2>&1 >$LOGFILE &
Es muy importante que el actualizador se lance sobre el directorio de datos de tinydns ya que busca los archivos de zonas (estático y dinámico) sin ruta alguna.
openDNS
Para emplear los servidores recursivos de openDNS es necesario seguir estos pasos:
- Situar los servidores raíz de openDNS como servidores raíz de dnscache en el archivo
/var/lib/dnscache/root/servers/@
:- 208.67.222.222
- 208.67.220.220
- Indicar a dnscache que dichos servidores no son servidores raíz creando un archivo no vacío con el nombre FORWARDONLY en el entorno del servidor. Concretamente en el archivo
/var/lib/dnscache/root/env/FORWARDONLY
en este caso y basta con rellenarle con el valor 1 (por ejemplo). - Reiniciar el servidor:
svc -t /var/lib/dnscache