Instalación de un servidor DNS con bind9 en Debian

Esto es lo primero que se configura para acelerar las resoluciones posteriores.

Con cambiar en el /etc/resolv.conf el nameserver por
nuestro localhost (127.0.0.1).

Despues en /etc/nsswitch.conf, en la linea hosts: debe aparecer "files dns" que indica que debe buscar primero el dns en /etc/hosts y luego en /etc/resolv.conf si no lo encuentra.

Vamos a suponer que quiero conseguir el subdominio max.debian.dominio.org. Los archivos de configuración se encuentran en /etc/bind/.

NOTA IMPORTANTE: en los db.* las ip y las url van seguidos de un . (punto)

Antes de continuar, hay que intentar dejar claro lo que son las views. En una funcionalidad que nos da BIND9 (no se si otros servidores tambien, supongo que si), que nos permite separar las peticiones de dns segun los hosts de los que provengan. En nuestros ejemplos lo vamos a usar para diferenciar las consultas externas y la internas a la red local.

Las views se declaran de la siguiente forma:

view "nombre" {
   match-clients { IPs a los que se les permite acceder a esta view };
   opciones

zonas

}

(Como declarar zonas lo vemos mas abajo)

Si en varias views y ponen alguna IP repetida, accederá a la view que este mas arriba (funcionan como los firewall, leyendo las reglas de arriba de abajo, y actuando según la primera que concuerde con las condiciones).

Todas las zonas (que es lo que usamos para definir los dominios y rangos de IP's a resolver) deben quedar dentro de alguna view.

Para empezar, definimos nuestra view privada de la forma:

view "internal" {
   match-clients { 10.0.0.1/8; 127.0.0.0/8; };
   recursion yes;

Modifiquen el match-client para su caso, pueden dejar solo el 127.0.0.1 que es el localhost por defecto
10.0.0.1/8 es el rango de nuestra hipotética red privada

y metemos las zonas que venían en la configuración estándar:

zone "." {
                type hint;
                file "/etc/bind/db.root";
        };
  zone "localhost" {
                type master;
                file "/etc/bind/db.local";
        };

Si tienen mas zonas, introduzcan las views en esta área.

}

y cerramos la view

Lo siguiente seria (si no tenemos esta zona añadida ya, casi con seguridad ya estara), definir nuestro localhost. En términos de bind, seria la zona 127.0.0; es decir, en el named.conf quedaria algo tal que:

zone "127.in-addr.arpa" {               Nuestra zona de red 127.*
        type master;                    Servidor DNS maestro, no obtiene informacion adicional de otro
        file "/etc/bind/db.127";        Lugar donde esta el archivo q define la zona
};

Ahora vamos a /etc/bind/db.127 y ahí tendremos algo como lo siguiente:

;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
1.0.0   IN      PTR     localhost.

El registro SOA es el preámbulo de todos los archivos de zona y debe haber uno exactamente en cada archivo de zona, como primer registro de todos. El registro SOA describe la zona, de dónde proviene (una máquina llamada localhost.), quién es el responsable de su contenido (root@localhost), qué versión del archivo de zona es (Numero de Serie, 1), y otras cosas que tienen que ver con el caché y los servidores secundarios DNS. Para el resto de los campos (Tasa de Refresco, Tasa de Reintento, Caducidad para secundario y Tiempo de Validez para clientes) use los valores que aparecen aquí para mayor seguridad.

Podemos cambiarlo por max.debian.dominio.org si queremos, pero no es necesario. Lo correcto es poner en el SOA nuestro servidor dns.

El registro NS indica quien es el servidor dns del host
El registro PTR, indica que 127.0.0.1 (el 127 lo sacamos de la zona definida en el named.conf, y el 0.0.1 es el
1.0.0 solo q se colocan al revés, pues es recursivo) es el localhost.

Nota: Generalmente cada vez que se cambia un archivo de zona, se suma 1 al serial, para indicar cuantas veces se ha modificado.

Reiniciamos el bind9

# /etc/init.d/bind9 restart

y hacemos dig para ver el nombre de
127.0.0.1 obtenemos:

debian:/etc/bind# dig -x 127.0.0.1

; <<>> DiG 9.2.0 <<>> -x 127.0.0.1
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42858
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:---;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:---1.0.0.127.in-addr.arpa. 604800  IN      PTR     localhost.

Si ponemos 1.0.0 IN PTR debian (en el archivo de zona), nos saldria
;; ANSWER SECTION:---1.0.0.127.in-addr.arpa. 604800 IN PTR debian.

Es decir, ya tenemos nombre para nuestra 127.0.0.1 con bind :)

Ahora vamos a definir nuestro max.debian.dominio.org.

Aquí queremos utilizar el uso principal de las views, para las conexiones externas a la red, la dns devolverá nuestra IP publica, y para la peticiones internas a la red devolvera ip privadas.

Nota: Voy a configurar un dominio de 3º nivel (creo que se llaman así) ya que no disponía de uno de 2º nivel para probar. Pero realmente la configuración es la misma solo que cambiando los nombres.

En la view interna del named.conf definimos la zona "debian.dominio.org" :

Mis zonas

zone "debian.dominio.org" {
        type master;
        file "/etc/bind/db.debian.int";
};

En el db.debian.int debemos introducir lo siguiente (yo use la guia del howto y modifique los nombres a mi gusto):

; Zone file for debian.dominio.org
;
;
;
;
$TTL 3D
@       IN      SOA     max.debian.dominio.org. root.debian.dominio.org. (
                        199802151       ; serial, todays date + todays serial #
                        8H              ; refresh, seconds
                        2H              ; retry, seconds
                        4W              ; expire, seconds
                        1D )            ; minimum, seconds
;
                NS      max.debian.dominio.org ; Inet Address of name server
;
localhost       A      127.0.0.1
max             A      172.16.0.2     
papa            A      172.16.0.4     
padre           CNAME  papa

Los registro SOA y NS son iguales, pero ahora al final definimos los subdominios a debian.dominio.org, en este caso

  • con localhost A 127.0.0.1 decimos q localhost.debian.dominio.org es 127.0.0.1
  • con max A 127.0.0.1 decimos q max.debian.dominio.org es 172.16.0.2
  • con papa A 172.16.0.4 decimos q papa.debian.dominio.org es 172.16.0.4
  • con padre CNAME papa q padre.debian.dominio.org es lo mismo q papa.debian.dsland.org

Para configurar la view externa hacemos un proceso similar. La declaramos, y añadimos la zona respectiva al named.conf. Quedaria algo de la siguiente forma:

public address (external) view
view "external" {
   match-clients { any; };  Ponemos any ya que hemos declarado antes la zona interna. "any" se refiere al resto de ips que no hayan sido declaradas en algun match-clients anterior.
   recursion no;

zone "debian.dominio.org" {
                type master;
                file "/etc/bind/db.debian.ext";
        };

};

Y creamos el db.debian.ext:

; Zone file for debian.dominio.org
;
;
$TTL 3D
@       IN      SOA     max.debian.dominio.org. root.debian.dominio.org. (
                        199802151       ; serial, todays date + todays serial #
                        8H              ; refresh, seconds
                        2H              ; retry, seconds
                        4W              ; expire, seconds
                        1D )            ; minimum, seconds
;
                NS     213.92.115.203 ;Inet Address of name server
;
                A      213.92.115.203 ;IP publica inventada

DNS Inverso

En resumen, nuestro bind sabe resolver unos cuantos host de debian.dominio.org a su ip. ¿Pero al reves? No, a eso
vamos:
De momento todas las ips se refieren a 172.16.0.*, vamos a definir esta zona en el named.conf

zone "0.16.172.in-addr.arpa" {  Recuerdo q el ip esta al reves, los host se ponen al derecho :)
        type master;
        file"/etc/bind/db.172.16.0";
};

Ahora vamos al /etc/bind/db.172.16.0 (y vamos a hacer algo similar a lo que hicimos con 127.*)

$TTL 3D
@       IN      SOA     localhost. root.localhost. (
                        199802151 ; Serial, todays date + todays serial
                        8H      ; Refresh
                        2H      ; Retry
                        4W      ; Expire
                        1D)     ; Minimum TTL
                NS      localhost.

2               PTR     max.debian.dominio.org.
4               PTR     papa.debian.dominio.org.

Creo q se entiende, es igual q el de 127.* solo que como ahora definimos en el named.conf hasta 172.16.0. solo nos hace falta el ultimo octeto. El 172.16.0.2 ira a max.debian.dominio.org y 172.0.0.4 a papa.debian.dominio.org

¿Por que no hacemos lo mismo para la ip publica?
No lo he añadido porque la resolución de nuestra supuesta ip publica (en el ejemplo 213.92.115.203) corre a cuenta de nuestro ISP. Tendriamos que pedirle que nos pasara las peticiones a nuestra maquina, pero no creo que esten por la labor :)

La delegación de zona se usa para que el siguiente subdominio sea resuelto por su propio servidor dns.

Para ello, simplemente hay q añadir una entrada NS para ese servidor. Seguimos en el db.debian.dominio :
Añadimos un supuesto subdominio pino.debian.dominio.org con

pino            A       62.36.145.234 ; Otra ip inventada q nos sirve para el ejemplo

Y luego le añadimos su propio servidor dns, para q las consultas a subdominios inferiores a el se las pase a su dns, mediante la sintaxis:

subdominio      NS      servidor_dns_del_subdominio

pino.debian.dominio.org          NS              dns1.pino.debian.dominio.org

(si el dns del subdominio fuera el mismo pino.debian.dsland.org, pues se podria ese)

Nota: para q todo esto funcione, el subdominio de 2º nivel dominio.org tiene q redelegar el subdominio debian.dominio.org en su servidor dns (en este caso es el mismo debian.dominio.org).