Instalar un cache de DNS sobre Ubuntu es realmente sencillo gracias a los paquetes de D.J.Bernstein.

En primer lugar debemos instalar el paquete dnscache-run y sus dependencias (daemontools daemontools-run djbdns dnscache-run ucspi-tcp)

apt-get install dnscache-run

El svscan verifica dentro del directorio /service los programas a ejecutar, pero como esta carpeta no es creada durante el proceso de instalación arreglarlo y generar un enlace simbólico a /etc/dnscache

mkdir /service
ln -s /etc/dnscache /service

Ahora debemos configurar las variables de entorno de la siguiente manera:

Editamos /etc/dnscache/env/IP y modificamos el valor por defecto con nuestra IP.

vi /etc/dnscache/env/IP
192.168.1.10

y declaramos que redes pueden utilizar nuestro cache de DNS

touch /etc/dnscache/root/ip/192.168.1
touch /etc/dnscache/root/ip/10.10

El tamaño por default del cache es de 1M, se puede agrandar un poco cambiando las siguientes variables:

echo 100000000 > /service/dnscache/env/CACHESIZE
echo 104857600 > /service/dnscache/env/DATALIMIT

para ponerlo en funcionamiento debemos arrancar el servicio

/sbin/start svscan
update-service --add /etc/dnscache

Si queremos hacerla completa, podemos generar un script que actualice periódicamente los Root Hints. Si pegamos el siguiente código en /opt/actualizar_root_servers.sh y le damos permiso de ejecución (chmod +x /opt/actualizar_root_servers.sh) se puede agregar en el crontab para que se ejecute automáticamente.

#!/bin/bash
# Fuente: http://thedjbway.b0llix.net/djbdns/dnsroots.html
 
dnsip `dnsqr ns . | awk '/answer:/ { print $5; }' |sort` > /opt/root_servers_temp.txt 2>> /opt/actualizar_root_servers.log
echo "`date` - Listado de root servers obtenido:" >> /opt/actualizar_root_servers.log
cat /opt/root_servers_temp.txt >> /opt/actualizar_root_servers.log
echo "`date` - Fin del listado de root servers obtenido" >> /opt/actualizar_root_servers.log
 
# Si la cantidad de root servers es mayor que 8 cambiar la configuración
NRO_ROOT_SERVERS=`wc -l /opt/root_servers_temp.txt |cut -d' ' -f 1`
if [ $NRO_ROOT_SERVERS -ge 8 ]; then
    # echo $NRO_ROOT_SERVERS es mayor o igual que 10
    echo "`date` - Se obtuvieron $NRO_ROOT_SERVERS servidores de DNS raiz que se usaran para actualizar la conf. de root servers" >> /opt/actualizar_root_servers.log
    cp /etc/dnsroots.global /etc/dnsroots.global.old
    cp /opt/root_servers_temp.txt /etc/dnsroots.global
    cp /etc/dnsroots.global /service/dnscache/root/servers/@
    svc -du /service/dnscache
else
    echo "`date` - Se obtuvieron $NRO_ROOT_SERVERS servidores de DNS raiz, no se modifica la conf. de root servers" >> /opt/actualizar_root_servers.log
#    echo $NRO_ROOT_SERVERS es menor que 10
fi

Referencias: