Instalación de BIND versión 9
El servidor DNS más utilizado actualmente es BIND (Berkeley Internet Name Domain) de ISC (Internet Systems Consortium), que fue totalmente reescrito para la última versión estable oficial, la versión 9. La instalación en Debian GNU/Linux es análoga a la de cualquier otro paquete, en este caso el paquete bind9:
# aptitude install bind9
La orden instalará BIND con una configuración por defecto que hace que funcione como un servidor DNS caché. Además el servicio se arranca automáticamente, lo cual podemos comprobar con el siguiente comando:
# service bind9 status
● bind9.service - BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/bind9.service; enabled)
Drop-In: /run/systemd/generator/bind9.service.d
└─50-insserv.conf-$named.conf
Active: active (running) since lun 2016-05-29 18:34:08 CEST; 6min ago
Docs: man:named(8)
Main PID: 590 (named)
CGroup: /system.slice/bind9.service
└─590 /usr/sbin/named -f -u bind
El demonio del servicio DNS que acabamos de instalar es el programa /usr/sbin/named y el script que utilizaremos para controlarlo es /etc/init.d/bind9, al cual también podremos llamar con el comando service como hemos hecho anteriormente:
# /etc/init.d/bind9
[info] Usage: /etc/init.d/bind9 {start|stop|reload|restart|force-reload|status}.
Podemos comprobar, que efectivamente funciona, obligándole a hacer una traducción de un nombre de dominio, para lo cual usamos el comando dig de la siguiente manera:
# dig @localhost www.facebook.com
; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> @localhost www.facebook.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5364
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.facebook.com. IN A
;; ANSWER SECTION:
www.facebook.com. 3600 IN CNAME star-mini.c10r.facebook.com.
star-mini.c10r.facebook.com. 60 IN A 173.252.89.132
;; AUTHORITY SECTION:
c10r.facebook.com. 3600 IN NS a.ns.c10r.facebook.com.
c10r.facebook.com. 3600 IN NS b.ns.c10r.facebook.com.
;; ADDITIONAL SECTION:
a.ns.c10r.facebook.com. 3600 IN A 69.171.239.11
a.ns.c10r.facebook.com. 3600 IN AAAA 2a03:2880:fffe:b:face:b00c:0:99
b.ns.c10r.facebook.com. 3600 IN A 69.171.255.11
b.ns.c10r.facebook.com. 3600 IN AAAA 2a03:2880:ffff:b:face:b00c:0:99
;; Query time: 231 msec
;; SERVER: ::1#53(::1)
;; WHEN: Mon May 29 19:01:53 CEST 2016
;; MSG SIZE rcvd: 213
# dig @localhost www.facebook.com
; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> @localhost www.facebook.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34237
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.facebook.com. IN A
;; ANSWER SECTION:
www.facebook.com. 3591 IN CNAME star-mini.c10r.facebook.com.
star-mini.c10r.facebook.com. 51 IN A 173.252.89.132
;; AUTHORITY SECTION:
c10r.facebook.com. 3591 IN NS b.ns.c10r.facebook.com.
c10r.facebook.com. 3591 IN NS a.ns.c10r.facebook.com.
;; ADDITIONAL SECTION:
a.ns.c10r.facebook.com. 3591 IN A 69.171.239.11
a.ns.c10r.facebook.com. 3591 IN AAAA 2a03:2880:fffe:b:face:b00c:0:99
b.ns.c10r.facebook.com. 3591 IN A 69.171.255.11
b.ns.c10r.facebook.com. 3591 IN AAAA 2a03:2880:ffff:b:face:b00c:0:99
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Mon May 29 19:02:02 CEST 2016
;; MSG SIZE rcvd: 213
El comando dig permite especificar el servidor que queremos que haga la traducción, para ello se usa el símbolo @ junto con el nombre o dirección del servidor DNS; en el ejemplo se ha puesto @localhost, donde localhost se ha traducido vía el fichero /etc/hosts en el que aparece con la dirección 127.0.0.1 (::1 IPv6), es decir, el equipo local, donde acabamos de instalar BIND. Por lo tanto, BIND ha hecho la traducción y funciona, pero además, hemos ejecutado dos veces seguidas el mismo comando, y vemos que la primera ejecución ha tardado 231 milisegundos, en cambio, la segunda ha sido instantánea, 0 milisegundos; claramente el motivo es el funcionamiento de BIND como caché. Para resolver la primera consulta BIND hizo una consulta recursiva, para resolver la segunda, utilizó la caché.
En este momento, ya podemos cambiar el fichero /etc/resolv.conf para que se use siempre nuestro servidor BIND:
# cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
# echo nameserver 127.0.0.1 > /etc/resolv.conf
# cat /etc/resolv.conf
nameserver 127.0.0.1
# ping www.facebook.com
PING star-mini.c10r.facebook.com (173.252.89.132) 56(84) bytes of data.
64 bytes from edge-star-mini-shv-06-atn1.facebook.com (173.252.89.132): icmp_seq=1 ttl=79 time=138 ms
64 bytes from edge-star-mini-shv-06-atn1.facebook.com (173.252.89.132): icmp_seq=2 ttl=79 time=138 ms
64 bytes from edge-star-mini-shv-06-atn1.facebook.com (173.252.89.132): icmp_seq=3 ttl=79 time=138 ms
^C
--- star-mini.c10r.facebook.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 138.048/138.231/138.325/0.330 ms
Todos los ficheros de la configuración por defecto de BIND se instalan en el directorio /etc/bind:
# tree /etc/bind
/etc/bind
├── bind.keys
├── db.0
├── db.127
├── db.255
├── db.empty
├── db.local
├── db.root
├── named.conf
├── named.conf.default-zones
├── named.conf.local
├── named.conf.options
├── rndc.key
└── zones.rfc1918
0 directories, 13 files
La configuración de BIND se encuentra en named.conf, la cual se distribuye, con la instrucción include, entre los ficheros: named.conf.options, named.conf.local y named.conf.default-zones:
- named.conf.options: En este fichero se encuentra la instrucción options que es donde se incluyen todos los parámetros a nivel global de BIND.
- named.conf.local: Aquí es donde crearemos nuestras zonas con la instrucción zone.
- named.conf.default-zones: Este fichero contiene las instrucciones zone de algunas zonas que incluye BIND por defecto.
# cat /etc/bind/named.conf
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
# cat /etc/bind/named.conf.default-zones
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/etc/bind/db.root";
};
// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
Los ficheros db.* son ficheros de zona, que BIND carga por defecto, pues se han creado en named.conf.default-zones. Cabe destacar db.root donde se encuentran los servidores raíz.
# cat /etc/bind/db.root
. 3600000 IN NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:BA3E::2:30
;
; FORMERLY NS1.ISI.EDU
;
. 3600000 NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201
...
...
El fichero db.local permitirá resolver el nombre localhost a 127.0.0.1. Ahora mismo, dicho nombre se resuelve vía /etc/hosts, pero si se elimina, se puede seguir utilizando, pues BIND lo traduce, sin que nosotros hagamos nada, gracias a db.local.
# cat /etc/bind/db.local
;
; BIND data file for local loopback interface
;
$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
El fichero db.empty lo utilizaremos para hacerle copias y a partir de ahí comenzar a crear nuestros propios ficheros de zona.
La instalación crea un usuario bind que pertenece al grupo principal bind que también se crea. Este usuario es el que ejecuta el demonio /usr/sbin/named, al que se le pasan los argumentos especificados en el fichero /etc/default/bind9, que nosotros podemos modificar (como administradores) si lo vemos necesario.
# cat /etc/default/bind9
# run resolvconf?
RESOLVCONF=no
# startup options for the server
OPTIONS="-u bind"
Un directorio importante en la instalación de BIND en Debian es /var/cache/bind, utilizado por BIND como referencia para todas las rutas relativas de ficheros. Esto es así pues la instrucción directory, que se encuentra a nivel global dentro de options, así lo indica, aunque si queremos podemos utilizar cualquier otro directorio, siempre que el usuario bind pueda acceder a él.
# cat /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
# ls -ld /var/cache/bind/
drwxrwxr-x 2 root bind 4096 ago 30 08:44 /var/cache/bind/
En este directorio crearemos nuestros ficheros de zona (db.*) a partir de /etc/bind/db.empty, y a la hora de referirnos a ellos con la instrucción file dentro de zone, no pondremos ninguna ruta. Es importante observar que en el caso de las zonas por defecto (named.conf.default-zones) se han utilizado rutas absolutas para hacer referencia a los ficheros db.*, de esta manera BIND siempre las encontrará en su sitio, independientemente del valor que nosotros le demos a la instrucción directory.
# cat /etc/bind/named.conf.default-zones
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/etc/bind/db.root";
};
...
La configuración por defecto presenta un problema de seguridad, pues al trabajar BIND como un servidor DNS totalmente abierto, acepta peticiones DNS de cualquier máquina y un usuario malintencionado podría utilizarlo para hacer ataques de DDoS, envenenamiento de la caché DNS, etc. Sin entran en estos momentos en consideraciones y configuraciones de seguridad, una acción fácil para asegurar nuestro servidor DNS que podemos hacer inmediatamente después de la instalación, es limitar los equipos de los que escucharemos consultas, y esto se hace con la instrucción listen-on que va a nivel global dentro de options; por ejemplo, si hemos instalado BIND en un equipo para que disponga de una caché DNS (GNU/Linux no dispone de caché DNS por defecto), y nada más, podemos asegurarlo haciendo que BIND solo acepte consultas del mismo equipo, y no de otro que se lo haya puesto como servidor DNS, o peor aún, que un usuario malintencionado le envíe consultas con la IP de origen falsificada.
listen-on { localhost; };
En este caso localhost no es un nombre de dominio a traducir vía DNS, sino una palabra reservada de BIND que hace referencia a todas las IP del equipo, incluida la de loopback (127.0.0.1), lo que nos ahorra tener que escribirlas todas, que como mínimo serían dos, la IP de una única tarjeta de red y la dirección de loopback.
Licencia: licencia de software libre GPL