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 😉
muy muy interesante, guardo el enlace