Optimizar navegación web con un servidor DNS Bind local de sólo caché en Debian

En un artículo anterior hablé sobre las ventajas de utilizar OpenDNS. Pues ahora también voy a hablar de DNS, pero en este caso de cómo configurar un servidor Bind de sólo caché a nivel local. La ventaja de tener un servidor de solo cacheo es que las búsquedas DNS son todavía más rápidas. Los datos que están en caché no tienen que ir a consultarse al servidor DNS remoto, ya sea de OpenDNS, nuestro ISP o cualquier otro. El resultado de esto es una navegación web más rápida.

Servidor Bind de solo caché

Servidor Bind de solo caché

Como ves, sólo se realizan nuevas consultas DNS para los registros que no están cacheados en nuestro DNS local de sólo caché.

La infraestructura de red que te muestro arriba es discutible. No es muy recomendable instalarte un servidor DNS en local, más que nada por cuestiones de seguridad. Cuantos menos servicios tengas activos, no sólo ahorrarás en recursos sino que también serás menos vulnerable. Lo ideal sería utilizar un equipo antiguo en tu red local para dedicarlo a tareas como esta de DNS local para tu red, pero claro, no todos podemos montarnos un mini CPD en casa, así que yo expongo aquí la infraestructura más sencilla de todas.

Instalación y configuración básica de Bind

Para instalarlo lo tienes fácil. En Debian o distro derivada:

aptitude install bind9

En Red Hat o derivada (ojo que en estos momentos en los que escribo, tengo disponible bind10, pero la versión recomendada para entornos de Producción sigue siendo la 9):

yum install bind10

Por otro lado siempre podréis recurrir a los repositorios web de la Internet Systems Consortium (ICS).

Una vez instalado, debes saber que para administrar el servicio, lo típico:

service bind9 [ start | stop | restart ]

Pues bien, ahora pasamos a configurar el fichero principal named.conf. Esto debería ser sencillo en un principio pero no es raro que los servidores Bind se conviertan en un puto dolor de muelas porque la implementación en cada distro es de su padre y de su madre (como el servidor web Apache) y si además hemos instalado compilando desde código fuente, habrá también algunas variantes a tener en cuenta. Me refiero a la distribución de ficheros de configuración, estructura de los mismos, directorios, etc… Yo me baso en un Debian 7 Jessie, cuyo named.conf está en /etc/bind/ y tiene la siguiente estructura:

Fichero de configuración named.conf

Fichero de configuración named.conf

Pues bien, me dirijo a /etc/bind/named.conf.options y aquí necesito poner:

listen-on port 53 { any; }; 
listen-on-v6 port 53 { ::1; }; 
allow-query { any; }; 

forwarders {
             208.67.220.220;
             208.67.222.222;
        };

¿Qué es esto? Pues los DNS de OpenDNS que son los que yo utilizo (más info aquí).

Después tendremos que especificar en nuestro sistema en /etc/resolv.conf que el primer servidor DNS a utilizar sea el nuestro (en mi caso, lo he instalado en local, por lo que será 127.0.0.1):

nameserver 127.0.0.1 
nameserver 208.67.222.222 
nameserver 208.67.220.220

El primer servidor DNS a consultar será el mío en localhost (127.0.0.1). En caso de que no sea posible, se recurrirá en orden descendente a los que hay más abajo. OJO: si la información de DNS la distribuye nuestro router que actúa como DHCP a nivel local, o tenemos herramientas como el Network Manager corriendo… es posible que “pise” lo que hayamos modificado en el resolv.conf, ya que básicamente actúan como su fuente de información. En tal caso tendrás que desactivar el Network Manager, los DNS que distribuye tu router…

Por otro lado, en cuanto a las zonas necesarias en el servidor, en Debian ya vienen por defecto configuradas y especificadas en el fichero /etc/bind/named.conf.default-zones.

Comprobando la resolución de nombres y el estado del servidor

Basta con hacer un nslookup a una web que deseemos. La primera consulta deberá responderla 208.67.222.222 que es el segundo DNS especificado en el /etc/resolv.conf, puesto que 127.0.0.1 todavía no ha cacheado la respuesta:

Probando con nslookup

Probando con nslookup

Una vez realizada esa primera consulta, la repetimos y… ¿quién nos responde? Pues nuestro localhost, el servidor BIND en 127.0.0.1 en escucha en el puerto 53. Pongamos el caso de que hemos montado nuestro servidor BIND en un equipo de nuestra red local con IP 192.168.2.115, pues ahora sería esta IP la que resolvería, ya que habría cacheado la consulta que anteriormente resolvió 208.67.222.222.

La opción ligera y más sencilla: dnsmasq

Otra opción si no queréis mancharos demasiado con BIND, que puede llegar a ser un poco pesadilla, es la utilidad dnsmasq. De hecho, las últimas versiones de Ubuntu vienen con dnsmasq preinstalado para que actúe como DNS de sólo caché.

Tenéis un artículo que escribí hace poco aquí en el que explico cómo instalarlo y configurarlo.

¿Por qué prefiero BIND personalmente? Bueno, si quiero complicarme la vida, puedo hacerlo, mientras que dnsmasq es más limitado, pero cada cual tendrá que ver lo que le conviene. Si es un equipo únicamente de escritorio, no deja de ser una opción perfectamente válida sin tener que complicarse demasiado la vida.