Memorias de un cabrón

DNS Cache con Bind

deja un comentario

Últimamente he notado que el servidor tarda algo más en responder las peticiones de dominios, por lo que he supuesto que se podría utilizar las bondades de bind para crear una cache en el propio servidor, ahorrando un tiempo valioso en petición de resoluciones. Notese que solo hará de caché local, no es el ámbito de este tutorial explicar cómo configurar tus dominios, cnames, etc…

Esta solución es aplicable a cualquier sistema debian, ubuntu o derivados, aunque la configuración debería valer para cualquier distribución de GNU/Linux.

En primer lugar, evidentemente, instalamos el servicio:

# aptitude install bind9

Cargamos con un editor el archivo de opciones de bind

# pico /etc/bind/named.conf.options

Para editarlo tal y como se debe:

acl recurseallow { 127.0.0.1; XX.XX.XX.XX; YY.YY.YY.YY; };

options {
forwarders { Z1.Z1.Z1.Z1; Z2.Z2.Z2.Z2; };
allow-recursion { recurseallow; };
directory “/var/cache/bind”;
allow-query { localhost; };
listen-on { 127.0.0.1; };
query-source port 53;
auth-nxdomain no;
forward only;
};

OJO: Al copiar el texto anterior, algunas consolas sustituyen las comillas ( ” ) por puntos ( . )

En rojo lo que debes cambiar, donde:

XX.XX.XX.XX > La ip externa de tu equipo/servidor
YY.YY.YY.YY > Otra ip desde donde quieras que se pueda consultar a tu servidor, útil si tienes IP FailOver
Z1.Z1.Z1.Z1 > DNS más cercano a tu equipo/servidor, aconsejable el de tu ISP
Z2.Z2.Z2.Z2 > DNS secundario a la que hará las consultas, recomendable poner alguno tipo OpenDNS o GoogleDNS

Modificamos el fichero de resolución

# pico /etc/resolv.conf

Para que la máquina solo haga consultas a sí misma, con esta simple línea:

nameserver 127.0.0.1

De estar en un servidor en producción, sería aconsejable añadir las líneas search y domain, para más info, man resolv.conf

Reiniciamos el servidor bind

# /etc/init.d/bind9 restart

Y comprobamos el tiempo en un dominio que no hayamos visitado nunca, la primera vez, sin cache:

# time nslookup bleh.com
Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   bleh.com
Address: 208.113.234.221

real    0m0.210s
user    0m0.008s
sys     0m0.008s

Y la segunda vez, ya con la caché:

# time nslookup bleh.com
Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   bleh.com
Address: 208.113.234.221

real    0m0.023s
user    0m0.004s
sys     0m0.004s

Como se puede observar, la resolución ha pasado de las 0.2 décimas a las 0.02, una diferencia bastante apreciable en lo que a servidores se refiere, aunque a nosotros no nos lo parezca.

La misma prueba, con dig, primero sin cache:

# dig uclm.es

; <<>> DiG 9.6.1-P2 <<>> uclm.es
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19576
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;uclm.es.                       IN      A

;; AUTHORITY SECTION:
uclm.es.                10800   IN      SOA     dns1.uclm.es. hostmaster.uclm.es. 2010030300 86400 7200 2592000 172800

;; Query time: 25 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Mar  7 06:25:23 2010
;; MSG SIZE  rcvd: 77

Y seguídamente, con cache:

# dig uclm.es

; <<>> DiG 9.6.1-P2 <<>> uclm.es
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42920
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;uclm.es.                       IN      A

;; AUTHORITY SECTION:
uclm.es.                10765   IN      SOA     dns1.uclm.es. hostmaster.uclm.es. 2010030300 86400 7200 2592000 172800

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Mar  7 06:25:58 2010
;; MSG SIZE  rcvd: 77

Aquí la consulta se reduce en 20 milisegundos, unas cifras bastante óptimas.

Puesto que se va a tratar de un sistena de cache, no tiene sentido que cada poco tiempo esté consultando de nuevo a los servidores DNS reales, por lo que dejaremos la  base de datos tal y como viene por defecto, pero dejo los parámetros por si más adelante pasamos a un servidor en producción y queremos bajar los tiempos de consulta.

# pico /etc/bind/db.local

Donde

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
2         ; Serial
604800         ; Refresh
86400         ; Retry
2419200         ; Expire
604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
@       IN      AAAA    ::1

Medidas, así a ojo:

1800 > 30 minutos
21600 > 6 horas
86400 > 1 día
604800 > 1 semana
2419200 > 1 mes

¿Qué sugieres para mejorar la configuración de seguridad en bind?

# touch /var/cache/bind/

Posts relacionados

Escrito por Rafa

07 Marzo 2010 a las 7:19 am

Deja un comentario

¿Tienes twitter?
Identifícate con OAuth y no tendrás que registrarte para postear.

Renuncia: El autor de este blog NO se responsabiliza de los comentarios realizados por terceros. Tampoco está vinculado de manera alguna a los contenidos de las páginas que pudieran ser enlazadas en dichos comentarios. De igual forma, se reserva el derecho de eliminar cualquier entrada que pudiera vulnerar la integridad moral o violar en algun aspecto la ley vigente.