Sistema DNS con Bind Internal/External views

Bueno ahora toca otro de esos howtos “difíciles” de encontrar.

Hace tiempo emprendí la tarea de crear un sistema DNS con la máxima de disponer de varios servidores que resolvieran tanto las peticiones internas como las externas, ya que con ello, aprovechamos un solo servidor para las resoluciones de nombres que provengan bien de internet como de nuestra LAN.

La infraestructura se compone de un servidor master con Bind en Debian 6 con vista interna y externa, y varios servidores esclavos.

La particularidad de este tipo de instalaciones es que, para que las transferencias de zonas se realicen correctamente, es necesario de asignarles dos interfaces de red a cada servidor, con ello, una sirve para las peticiones de los clientes (internos o externos) y la otra para las transferencias de las zonas externas (dominios de internet).

Empezamos instalando el propio Bind:

apt-get update
apt-get install bind9

Tras esto, definimos una segunda interface de red o creamos una subinterface (sí, muy inglés, pero queda mejor ;)). Editamos el archivo "/etc/network/interfaces"

Ahora toca preparar el entorno…

Para mejorar la seguridad, vamos a hacer que éste se ejecute en modo “chroot”, así todo el entorno de DNS quedará aislado del sistema.

Creamos la estructura, aplicamos permisos y movemos las configuración de Bind desde su ubicación original…

/etc/init.d/bind9 stop

mkdir -p /var/chroot/bind9/dev
mkdir -p /var/chroot/bind9/etc
mkdir -p /var/chroot/bind9/var/log
mkdir -p /var/chroot/bind9/var/cache/bind
mkdir -p /var/chroot/bind9/var/run/bind/run

chown -R bind:bind /var/chroot/bind9/var/*

mknod /var/chroot/bind9/dev/null c 1 3
mknod /var/chroot/bind9/dev/random c 1 8
chmod 666 /var/chroot/bind9/dev/*

mv /etc/bind /var/chroot/bind9/etc
ln -s /var/chroot/bind9/etc/bind /etc/bind

Editamos el archivo de opciones de inicio de Bind "/etc/default/bind9", y donde aparece OPTIONS, lo dejamos tal que así:

OPTIONS="-u bind -t /var/chroot/bind9"

Iniciamos el servicio y comprobamos si se ha iniciado correctamente:

/etc/init.d/bind9 start

ps xa | grep bind9

Nos aparece una línea como:

2100 ? Ssl 0:00 /usr/sbin/named -u bind -t /var/chroot/bind9

Una vez hecho esto, vamos a crear dos directorios que nos servirán para almacenar las configuraciones de las zonas que vayamos a servir:

mkdir /etc/bind/db.interno
mkdir /etc/bind/db.externo

Ya está todo el entorno listo para configurarlo…..

Editamos el archivo "/etc/bind/named.conf" y lo dejamos tal como este:

// 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";

// Servidores esclavos para la vista interna
acl slaves_int {
       192.168.1.20;
};

// Servidores esclavos para la vista externa
acl slaves_ext {
       192.168.1.21;
};

// Redes internas permitidas
acl trusted {
        127.0.0.0/8;
        172.16.0.0/16;
        192.168.0.0/16;
};

view "internal" {
        match-clients { !slaves_ext; trusted; }; // Clientes que pueden realizar las peticiones a esta vista
	allow-transfer { slaves_int;}; // Servidores esclavos permitidos
	also-notify { 192.168.1.20; }; // Las ips internas del resto de servidores esclavos
        recursion yes; // Permitimos la recursión
        additional-from-auth yes; // http://www.zytrax.com/books/dns/ch7/queries.html
        additional-from-cache yes; // http://www.zytrax.com/books/dns/ch7/queries.html
	notify-source 192.168.1.10; // La ip interna de nuestro propio servidor
	transfer-source 192.168.1.10; // La ip a utilizar como origen de las transferencias internas
 	query-source address 192.168.1.10; // La ip a utilizar como origen de las consultas internas

	// 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";
	};

	// Declaraciones de zonas de dominios internos.
	zone "cygnux.local" {
		type master;
		file "/etc/bind/db.interno/db.cygnux.local";
	};

	// También podemos hacer un include de un archivo de declaración de zonas
	//include "/etc/bind/named.conf.local.interno";
};

view "external" {
        match-clients { slaves_ext; !trusted; any;}; // Clientes que pueden realizar las peticiones a esta vista
	allow-transfer { slaves_ext;}; // Servidores esclavos permitidos
	also-notify { 192.168.1.21; }; // Las ips internas del resto de servidores esclavos
        recursion no; // Denegamos la recursión
        additional-from-auth no; // http://www.zytrax.com/books/dns/ch7/queries.html
        additional-from-cache no; // http://www.zytrax.com/books/dns/ch7/queries.html
	notify-source 192.168.1.11; // La ip externa de nuestro propio servidor
	transfer-source 192.168.1.11; // La ip a utilizar como origen de las transferencias externas
	query-source address 192.168.1.11; // La ip a utilizar como origen de las consultas externas

	// Declaraciones de zonas de dominios externos.
	zone "cygnux.org" {
		type master;
		file "/etc/bind/db.interno/db.cygnux.org";
	};

	// También podemos hacer un include de un archivo de declaración de zonas
	//include "/etc/bind/named.conf.local.externo";

};

// Opciones de configuración adicionales
include "/etc/bind/named.conf.local";

Esta configuración es igual en los servidores esclavos, solo que hay que cambiar las direcciones IPs de las vistas interna y externa por la del propio servidor y la del master.

Lo siguiente es editar algunas opciones globales de Bind y el logging en el archivo "/etc/bind/named.conf.options":

options {
	//directory "/var/cache/bind";

	// If there is a firewall between you and nameservers you want
	// to talk to, you may need to fix the firewall to allow multiple
	// ports to talk.  See http://www.kb.cert.org/vuls/id/800113

	// If your ISP provided one or more IP addresses for stable
	// nameservers, you probably want to use them as forwarders.
	// Uncomment the following block, and insert the addresses replacing
	// the all-0's placeholder.

	// forwarders {
	// 	0.0.0.0;
	// };

	auth-nxdomain no;    # conform to RFC1035
	listen-on-v6 { any; };

        //query-source address * port *;
        //allow-recursion { localhost; localnets; };
        //allow-query { localhost; any; };
        statistics-file "/var/log/named.stats";
        memstatistics-file "/var/log/named.memstats";
        zone-statistics yes;

        // Prevent DoS attacks by generating bogus zone transfer
        // requests.  This will result in slower updates to the
        // slave servers (e.g. they will await the poll interval
        // before checking for updates).

        notify explicit;

        // Generate more efficient zone transfers.  This will place
        // multiple DNS records in a DNS message, instead of one per
        // DNS message.
        transfer-format many-answers;

        // Set the maximum zone transfer time to something more
        // reasonable.  In this case, we state that any zone transfer
        // that takes longer than 60 minutes is unlikely to ever
        // complete.  WARNING:  If you have very large zone files,
        // adjust this to fit your requirements.
        max-transfer-time-in 60;

        // We have no dynamic interfaces, so BIND shouldn't need to
        // poll for interface state {UP|DOWN}.
        interface-interval 0;

        allow-query { any;};

        allow-query-cache {
                // Accept queries of our cache from our "trusted" ACL.
                trusted;
        };

	rrset-order {order random;};
};

logging {

	// Registramos en el syslog los eventos de error
        channel default_syslog {
                // Send most of the named messages to syslog.
                syslog local2;
                // severity info;
                severity error;
                print-category yes;
                print-severity yes;
        };

	// Archivo de log para todos los eventos
        channel audit_log {
                file "/var/log/audit.log";
                severity debug;
                print-time yes;
		//versions 30;
		//size 10m;
        };

	// Archivo de log de transferencias entre servidores
	channel xfer_log {
                file "/var/log/xfer.log";
                severity debug;
                print-time yes;
		//versions 30;
		//size 10m;
        };

	// Categorías y sus opciones de logging
        category default { default_syslog; };
        category general { default_syslog; };
        category security { audit_log; default_syslog; };
        category config { default_syslog; };
        category resolver { audit_log; };
        category xfer-in { xfer_log; };
        category xfer-out { xfer_log; };
        category notify { xfer_log; };
        category client { audit_log; };
        category network { audit_log; };
        category update { audit_log; };
        category queries { audit_log; };
        category lame-servers { audit_log; };
        category edns-disabled { audit_log; };
        category resolver { audit_log; };
        category database { audit_log; };
        category unmatched { audit_log; };
        category dispatch { audit_log; };
};

Ahora sólo nos queda crear los archivos de zona en "/etc/bind/db.externo/" y "/etc/bind/db.interno/":

;
; Ejemplo de archivo de zona para cygnux.org
;
$TTL	86400
$ORIGIN cygnux.org.
@  1D  IN	 SOA ns1.cygnux.org.	hostmaster.cygnux.org. (
			      2002022401 ; serial
			      3H ; refresh
			      15 ; retry
			      1w ; expire
			      3h ; minimum
			     )
cygnux.org     IN  NS     ns1.cygnux.org.

; Definiciones de hosts
ns1    IN  A      192.168.1.10
www    IN  A      192.168.1.10

Reiniciamos Bind y listo!!

  • Revisar los archivos de registro para verificar el correcto funcionamiento.
  • Tener en cuenta que Bind está en un “chroot” y su directorio de trabajo es “/var/chroot/bind9”

Hasta la próxima 😉

Referencias: Debian | Bind

One thought on “Sistema DNS con Bind Internal/External views

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA Image

*