Instalar y Configurar un Servidor DNS con BIND9 en Debian Etch con Chroot

En esta oportunidad veremos como instalar y configurar un servidor DNS con Bind9 en Debian 4.0 Etch. El protocolo de DNS (Domain Name System) es el que básicamente permite realizar la traducción entre un nombre de una página Web como lo entendemos nosotros (por ejemplo www.vensign.com) a una dirección IP (172.30.30.1) que es lo que realmente entienden los servidores en Internet. Es un servicio fundamental y sin el simplemente no existiría Internet como la conocemos hoy en día.

BIND9 es un servidor de DNS de código abierto, gratis y que es utilizado por la gran mayoría de los servidores DNS que existen en Internet.

Voy a suponer que tienes un cierto nivel de conocimientos de Linux (no mucho se requiere realmente) solo que sepas abrir un terminal y escribir comandos eso es todo. Te aconsejo que sigas esta guía paso a paso para que le saques el mayor provecho.

Esta instalación fue probada en servidores Debian Etch 4.0. Funciona bien en servidores basados en Debian y en versiones de Ubuntu previas a 8.04.

Vamos a comenzar…

En este caso vamos a hacer la configuración típica de servidores DNS con un servidor primario o maestro con dirección IP 192.168.249.1 y un servidor secundario con dirección IP 192.168.249.2 en caso de que falle el primero. Se utilizará como dominio ejemplo ejemplo.lan

Instalando BIND 9.5

Esta parte aplica tanto para instalar el servidor maestro como el secundario, para esto ejecutamos los siguientes comandos como root:

apt-get update && apt-get upgrade

Para asegurarnos de tener actualizados nuestros repositorios:

apt-get bind9 dnsutils

Con esto se instala el servidor Bind9 y los dnsutils son varias utilidades de DNS que nos serviran más adelante para comprobar nuestro servidor.

Chroot Bind

Cuando se habla de realizar un Chroot a un servicio en Linux se refiere que se va a crear una jaula a su alrededor, esto se hace para medidas de seguridad sobre todo en servidores que están expuestos a Internet como es el caso de nuestros servidores DNS. Esto hace que el servicio se ejecute con su propio usuario dentro de directorios que no tienen privilegios de root para que si llegan a quedar comprometidos el atacante no pueda accesar a otros recursos del sistema.

Para hacer el Chroot de Bind ejecutamos los siguientes pasos:

/etc/init.d/bind9 stop

Para detener el bind

Luego apuntamos el archivo de configuración al directorio que vamos a crear para el Chroot:

vim /etc/default/bind9

Puedes utilizar el editor de tu preferencia en cambio de vim (puede ser nano, emacs, etc)

Y modificamos la línea que dice OPTIONS=”-u bind” por:

OPTIONS="-u bind -t /var/lib/named"

Luego creamos los directorios necesarios para el Chroot

mkdir -p /var/lib/named/etc
mkdir /var/lib/named/dev
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/run/bind/run

Ahora movemos la configuración del Bind de /etc a /var/named/etc:

mv /etc/bind /var/lib/named/etc

Creamos un link simbólico entre la configuración vieja y la nueva para no tener problemas cuando se actualice el Bind:

ln -s /var/lib/named/etc/bind /etc/bind

Luego creamos los dispositivos necesarios para la jaula:

mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8

Y por último modificamos los permisos necesarios:

chmod 666 /var/lib/named/dev/*
chown -R bind:bind /var/lib/named/var/*
chown -R bind:bind /var/lib/named/etc/bind

Con esto ya creamos la Jaula y Bind tiene su propio espacio de directorios para sus procesos.

Ahora debemos modificar sysklogd para que se registren (log) los eventos del Bind:

vim /etc/default/syslogd

Puedes utilizar el editor de tu preferencia en cambio de vim (puede ser nano, emacs, etc)

Y modificamos la línea que dice SYSLOGD=”" por:

SYSLOGD="-a /var/lib/named/dev/log"

Ahora debemos modificar el archivo resolv.conf de nuestro servidor:

vim /etc/resolv.conf

Y agregamos la siguientes líneas (recuerda cambiar ejemplo.lan por tu nombre de dominio):

search ejemplo.lan
nameserver 127.0.0.1

Reiniciamos el sysklogd:

/etc/init.d/sysklogd restart

E iniciamos el Bind:

/etc/init.d/bind9 start

Este procedimiento lo tenemos que repetir para el servidor secundario.

Ahora vamos a configurar nuestros servidores.

Configurar Servidor Maestro

Ahora que tenemos el Bind9 instalado vamos a proceder a configurarlo, lo primero que vamos a hacer es decirle que envie las peticiones externas hacia el servidor DNS de nuestro ISP o hacia cualquiera que queramos, yo en lo personal utilizo OpenDNS. Para esto modificamos el archivo /etc/bind/named.conf.options:

vim /etc/bind/named.conf.options

Y descomentamos las líneas que dicen forwarders para que quede de la siguiente forma:

forwarders { 208.67.222.222 };

Recuerda utilizar la IP del DNS de tu ISP, también puedes utilizar la que está en el ejemplo ya que es la de OpenDNS.

Luego vamos a crear nuestra zona que no es más que lo que va a manejar nuestro dominio de ejemplo.lan para esto seguimos los siguientes puntos:

mkdir /etc/bind/zones/
vim /etc/bind/zones/master_ejemplo.lan

Luego dentro de este archivo colocamos la siguiente configuración:

$TTL 3D

@       IN      SOA     ns1.ejemplo.lan. hostmaster.ejemplo.lan. (
                        200808161       ; serial, fecha AAAA-MM-DD + serial
                        8H              ; refrescamiento, en segundos
                        2H              ; reentrar, segundos
                        4W              ; expira, segundos
                        1D )            ; minimo, segundos
;
                TXT     "Ejemplo.LAN, servicio de DNS"
                NS      ns1             ; Direccion Inet del servidor de dominio
                NS      ns2
                MX      10 mail        ; Exchanger de Mail primario
localhost    A    127.0.0.1
ns1          A    192.168.249.1
ns2          A    192.168.249.2
www          CNAME    ns1

Este es un archivo de Zona básico donde declaramos el dominio de ejemplo.lan, los servidores de dominio ns1 y ns2, además declaramos como servidor www (servidor web) a ns1 pero podría ser cualquier otro servidor donde tengas instalado Apache o algún otro servidor Web.

Ahora editamos el archivo /etc/bind/named.conf.local:

vim /etc/bind/named.conf.local

Y escribimos las siguientes líneas:

zone "ejemplo.lan" {
        type master;
        file "/etc/bind/zones/master_ejemplo.lan";
};

Ya con esto podemos probar nuestro servidor master a ver si funciona:

/etc/init.d/bind9 restart

ping ns1.ejemplo.lan

Deberia responder nuestro servidor ns1, recuerda que el servidor debe tener una dirección IP fija y que no debe estar corriendo ningún cliente dhcp.

Tambien podemos probar ejecutando:

host ns1.ejemplo.lan

Debería responder con la dirección de nuestro servidor.

Por útilmo para configurar nuestro servidor master modificamos el archivo /etc/bind/named.conf.options y agregamos la siguiente línea:

dnssec-enable yes;

Creamos una llave segura esto es para que la comunicación entre el servidor master y el secundario sea encriptada.

dnssec-keygen -a hmac-md5 -b 128 -n host ejemplo.lan

Anota el resultado ya que lo utilizaremos tanto en el servidor MASTER como en el SECUNDARIO.

Modificamos el archivo /etc/bind/named.conf y agregamos las siguientes líneas:

include "/etc/bind/rndc.key";

key "TRANSFER" {
        algorithm hmac-md5;
        secret "---HASHKEY---";
};

server 192.168.249.2 {
        keys {
        TRANSFER;
    };
};

Donde dice HASHKEY colocas la clave que generamos anteriormente. Y luego reiniciamos el servidor Bind:
/etc/init.d/bind9 restart

Con esto ya tenemos configurado nuestro servidor master vayamos ahora con nuestro servidor secundario.

Configurar Servidor Secundario o Esclavo DNS

La instalación del servidor Bind en el Secundario es exactamente igual que la del servidor Maestro, voy a mostrar sólo los archivos de configuración que necesitan modificación:

mkdir /etc/bind/zones/
vim /etc/bind/zones/slave_ejemplo.lan

Luego dentro de este archivo colocamos la siguiente configuración:

$TTL 3D

@       IN      SOA     ns1.ejemplo.lan. hostmaster.ejemplo.lan. (
                        200808161       ; serial, fecha AAAA-MM-DD + serial
                        8H              ; refrescamiento, en segundos
                        2H              ; reentrar, segundos
                        4W              ; expira, segundos
                        1D )            ; minimo, segundos
;
                TXT     "Ejemplo.LAN, servicio de DNS"
                NS      ns1             ; Direccion Inet del servidor de dominio
                NS      ns2
                MX      10 mail        ; Exchanger de Mail primario
localhost    A    127.0.0.1
ns1          A    192.168.249.1
ns2          A    192.168.249.2
www          CNAME    ns1

Esto es idéntico al master solo que identificamos como slave al archivo. Luego modificamos el archivo:

vim /etc/bind/named.conf.local

Y escribimos:

zone "ejemplo.lan" {
        type slave;
        file "/etc/bind/zones/slave_ejemplo.lan";
        masters { 192.168.249.1; };
        allow-notify { 192.168.249.1; };
};

Luego modificamos:

vim /etc/bind/named.conf

Y agregamos las siguientes líneas

server 192.168.249.1 {
        keys {
        TRANSFER;
    };
};

Y repetimos lo que hicimos de último con el servidor Maestro.

Modificamos el archivo /etc/bind/named.conf y agregamos las siguientes líneas:

include “/etc/bind/rndc.key”;

key “TRANSFER” {
algorithm hmac-md5;
secret “—HASHKEY—”;
};

server 192.168.249.1 {
keys {
TRANSFER;
};
};

Donde dice HASHKEY colocas la clave que generamos anteriormente. Y luego reiniciamos el servidor Bind:

/etc/init.d/bind9 restart

Ya con esto tenemos configurado el servidor Esclavo o Secundario, ahora debes indicarle a tus PC que que estan son las direcciones de servidores DNS primario y secundario que deben utilizar y si quieres probar que uno funciona cuando el otro se cae puedes detener el bind en cualquiera de los dos.

Espero que les haya servido este tutorial, cualquier duda, pregunta o sugerencia puedes dejar tu comentario y lo responderé a la brevedad posible.

Saludos

Olivers

Si quieres recibir notificaciones de cuando se publican nuevos artículos y tutoriales en Vensign por favor subscribete a nuestro boletín RSS.

Respuesta de los Usuarios ( 69 )

  1. Gerardo dijo:

    Hola Olivers estube haciendo la instalación de un servidor dns con el bind9 para colocarlo como esclavo una vez que yo reinicio el bind /etc/init.d/bind9 restart me sale el siguiente error:

    Stopping domain name service…: bind9rndc: connect failed: 127.0.0.1#953: connection refused
    .
    Starting domain name service…: bind9 failed!

    Cuando busco el los log /var/log/syslog me dice algo de “TRANSFER” si me puedes ayudar de que se trata lo del TRANSFER

    loading configuration from ‘/etc/bind/named.conf’
    using default UDP/IPv4 port range: [1024, 65535]
    using default UDP/IPv6 port range: [1024, 65535]
    listening on IPv4 interface lo, 127.0.0.1#53
    listening on IPv4 interface eth0, 172.16.5.7#53
    /etc/bind/named.conf:13: configuring key ‘TRANSFER’: bad base64 encoding
    loading configuration: bad base64 encoding
    exiting (due to fatal error)

    • Olivers dijo:

      Hola Gerardo el error está cerca de la línea 3 de tu configuración en /etc/bind/named.conf como te lo dice el error.

      Revisa si cerca de esa línea hay una línea que dice algo como :

      secret “use /usr/sbin/dns-keygen to generate TSIG keys”;

      Si es así simplemente ejecuta esto en el terminal:

      /usr/sbin/dns-keygen

      Y copias el resultado de ese comando dentro de las comillas dobles de la línea anterior (borrando lo que estaba antes entre las comillas)

      Con esto se debería solucionar tu problema

      Dinos como te fue
      Saludos

  2. Felix Utrera dijo:

    Saludos, tremenda explicacion, funciona todo ok.
    En mi empresa tenemos un servidor de dominio en windows server 2003, el dns funciona bien, nos hacemos ping por ip y por nombre. La red esta conformada por VLAN y esta configurado todo por DHCP. El problema es el siguiente: Tengo un equipo con ubuntu 10.04 el cual tiene instalado Apache2, Mysql 5.0, postgresql 8.4 y todos los sistemas corren bien. Configure el bind y localmente no arroja ningun tipo de error pero cuando intento acceder por nombre a la aplicacion desde un cliente XP no resuelve.
    Cree Hosts Virtuales y si resuelven pero asi “nombre-de-mi-servidor-linux.dominio-de-mi-empresa” cuando deberia ser solo el nombre del host virtual, aunque de igual forma no me gustaria resolver el problema a traves de apache si no por bind. Espero me puedas ayudar

    • Olivers dijo:

      Hola Felix, gracias por tu comentario.

      Tengo una duda a quien tienes como Servidor de Dominio configurado en los Clientes XP? porque según dices al principio tu servidor de dominio principal es un Windows Server 2003 si vas a utilizar a Bind como tu servidor de dominio principal o secundario debes configurarlo en el cliente o configurarlo en tu servidor DHCP para que se asigne automáticamente. Esa es uno de los problemas que pueden estar ocurriendo.

      Verifica esto y cualquier duda vuelve a escribir estamos a la orden por aqui

      Saludos

  3. Felix Utrera dijo:

    Los clientes XP estan unidos al windows server 2003. Ahora ¿Le puedo decir al server 2003 que mi ubuntu es DNS? Disculpa mi ignorancia. Yo he hecho lo siguiente, configuro bind como dns en mi red local y coloco la direccion ip en el XP de mi servidor linux en la parte de servodres DNS y no resuelve. Ahora tu sugerencia se refiere si no me equivoco es que el servidor dhcp le asigne la direccion de mi servidor a los clientes automaticamente. Se las he colocado estatico y no resuelve. Bueno seguire intentando. Espero me puedas seguir ayudando y un millon de gracias.

    • Felix Utrera dijo:

      Hola nuevamente, en teoria lo que debo hacer es que mi servidor linux sea dns secundario y configurar en el windows server indicar que este existe. Ahora alguien sabe como hacer eso en el windows server, porq el server linux ya esta super recontra configurado porque ya hice la prueba sin dominio windows y resuelve perfectamente, pero cuando uso un cliente xp que esta en el dominio es donde no resuelve. La unica forma que resuelva es “nombre.dominio-windows”. Gracias

  4. Ale Hamann dijo:

    Hola, que tal.
    Muy bueno y muy útil el tutorial.

    Pero tengo una duda. ¿Cómo configuro el reenvío condicional en BIND9?

    Resulta que tengo un dominio Active Directory del tipo ad-domain.local (con un PDC Windows 2003 y un BDC Windows 2008) funcionando Ok.
    Además, tengo un enrutador GNU/Linux Debian Lenny (que está unido al dominio AD como miembro). La función de este linux es servir una DB MySQL, un servidor proxy SQUID y eventualmente un enrutador hacia internet para ciertos equipos para los cuales necesito la salida directa (y no a través del proxy). Pero ahora además, necesito servir nombres (e IPs) a una subred del tipo subnet.ad-domain.local
    Entonces quería configurar un servidor DNS en este linux, de forma tal que:
    resuelva los nombres de subred.ad-domain.local, reenvíe las consultas para ad-domain.local a los DNS del dominio ad-domain.local, y que para el resto los reenvíe al servidor DNS de mi ISP.
    He estado probando configuraciones pero no se como hacerlo de forma correcta.

  5. Jorge dijo:

    Hola!!

    antes que nada gracias por el manual, creo que es el mas completo que he leido hasta ahora, pero continuo teniendo un problema, cuando levanto bind9 me lanza el error:

    rndc: connect failed: 127.0.0.1#953: connection refused
    * Starting domain name service… bind9 [fail]

    me suena a permisos…. he hecho la primer parte de este manual pero aun continua el problema (no levanta bind9)

    en /etc/passwd en la ultma linea tengo:

    bind:x:115:124::/var/cache/bind:/bin/false

    y aparentemente todo lo que esta dentro de la “jaula” el own y group es bind

    alguna idea de donde puedo estar mal?

    mi ubuntu es: 9.04 jaunty (no lo puedo actualizar debido al libc6 :( necesito esa libreria y dejo de tener soporte y ya no esta en las demas….pero esa es otra historia :)

    de antemano agradezco la ayuda!!

  6. Jorge dijo:

    Que tal amigos….

    pues resulta que hize la jaula para el bind, pero algo hize mal ya que no puedo levantar el servicio bind9

    me aparece:

    /etc/init.d/bind9 restart
    * Stopping domain name service… bind9
    rndc: connect failed: 127.0.0.1#953: connection refused
    …done.
    * Starting domain name service… bind9
    …fail!

    en dmesg me dice cada que lo quiero levatar;

    [1278195.137882] type=1503 audit(1292466587.396:64): operation=”inode_permission” requested_mask=”r::” denied_mask=”r::” fsuid=115 name=”/var/lib/named/etc/bind/named.conf” pid=2935 profile=”/usr/sbin/named”

    y en el syslog me aparece que:

    Dec 15 20:29:47 cs named[2929]: starting BIND 9.5.1-P2.1 -4 -u bind -t /var/lib/named
    Dec 15 20:29:47 cs named[2929]: found 4 CPUs, using 4 worker threads
    Dec 15 20:29:47 cs named[2929]: using up to 4096 sockets
    Dec 15 20:29:47 cs named[2929]: loading configuration from ‘/etc/bind/named.conf’
    Dec 15 20:29:47 cs named[2929]: none:0: open: /etc/bind/named.conf: permission denied
    Dec 15 20:29:47 cs named[2929]: loading configuration: permission denied
    Dec 15 20:29:47 cs named[2929]: exiting (due to fatal error)

    obviamente se trata de un problema de permisos… pero para serles honesto, me he quedado sin ideas…. :(

    ojala alguien de ustedes pueda ayudarme….

    la parte de los fw y reverse no tengo problemas (funcionaba antes de la jaula jejeje) asi que aparentemente el problema es el permiso…..

    alguna idea de favor??

    Saludos y excelente manual!!!

    • Olivers dijo:

      Hola Jorge asegurate que hayas ejecutado las lineas de los permisos que están en el tutorial y que estes ejecutando /etc/init.d/bind9 restart como root.

      Saludos

  7. Jorge dijo:

    Gracias Olivers por la respuesta….!

    pues he hecho las lineas, de seguro algo me falta de permisos, aunqe no encuentro que….

    me sigue apareciendo…:

    * Stopping domain name service… bind9
    rndc: connect failed: 127.0.0.1#953: connection refused
    …done.
    * Starting domain name service… bind9
    …fail!

    ahora.. mientras logro (o logramos) desifrar que paso.. en que me equivoque.. como hago para “desenjaular” al bind9?

    de antemano te agradezco infinitamente tu ayuda!!!

    Saludazos!!

  8. Erwin dijo:

    Tengo el mismo problema, una manitoooo…..?
    alguna idea??

    Saludos,

  9. Carlos dijo:

    Para los que tengan el error con los permisos (permission denied) es porque, obviamente, la carpeta no tiene los suficientes permisos.
    Para eso, fijense qué archivo no les levanta debido a eso… para luego hacer un chmod a la carpeta a donde se encuentra el archivo, y le dan los permisos de lectura y escritura.

    ej: a mi no me levantaba mi dominio.txt en /var/cache/bind

    asi que tuve que hacer un:
    sudo chmod 666 /var/cache/bind/*

    reiniciar bind, y listo

  10. Alexei dijo:

    Me sale el mismo error xD y lo he revisado todo y nada

  11. Miguel dijo:

    Hola, tengo un problema he hecho muchas veces server bind en ubuntuserver y solo logro que se vea localmente pero por internet no se ve.. he visto muchos tutos pero siempre me queda igual.. tambien quisiera como configurar los ns por ejemplo ns1.ejemplo.com que es lo que me piden para comprar dominio gracias por su respuesta…

  12. Jorge dijo:

    Hola Olivers.
    Mi consulta es la siguiente. compre un dominio y quiero que apunte a mi servidor web en debian. que debo hacer para configurar dns publicos para darselos a mi proveedor de dominio. tengo 5 ip estatica publica.

  13. Ignacio dijo:

    Hola Olivers, muchas gracias por la guía, he aquí dos pequeños inconvenientes que me aparecieron.
    1) Nunca pude configurar el SYSLOGD, dado a que no existe el archivo en cuestión (etc/default/syslogd).
    2) a pesar de esto seguí adelante y continué, modifique resolv.conf y al momento de iniciar el servicio del bind (/etc/init.d/bind9 start) aparece lo siguiente
    * Starting domain name service… bind9 [fail]
    reviso el log del sistema y me dice lo siguiente:
    “Apr 27 18:48:52 Server named[4696]: starting BIND 9.8.1-P1 -u bind -t /var/lib/named
    Apr 27 18:48:52 Server named[4696]: built with ‘–prefix=/usr’ ‘–mandir=/usr/share/man’ ‘–infodir=/usr/share/info’ ‘–sysconfdir=/etc/bind’ ‘–localstatedir=/var’ ‘–enable-threads’ ‘–enable-largefile’ ‘–with-libtool’ ‘–enable-shared’ ‘–enable-static’ ‘–with-openssl=/usr’ ‘–with-gssapi=/usr’ ‘–with-gnu-ld’ ‘–with-geoip=/usr’ ‘–enable-ipv6′ ‘CFLAGS=-fno-strict-aliasing -DDIG_SIGCHASE -O2′ ‘LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro’ ‘CPPFLAGS=-D_FORTIFY_SOURCE=2′
    Apr 27 18:48:52 Server named[4696]: adjusted limit on open files from 4096 to 1048576
    Apr 27 18:48:52 Server named[4696]: found 2 CPUs, using 2 worker threads
    Apr 27 18:48:52 Server named[4696]: using up to 4096 sockets
    Apr 27 18:48:52 Server named[4696]: initializing DST: openssl failure
    Apr 27 18:48:52 Server named[4696]: exiting (due to fatal error)”
    Estoy trabajando sobre Ubuntu 12.04
    Saludos!!!

    • Olivers dijo:

      Hola Ignacio, en Ubuntu hay un par de cosas que cambian:

      1. El SYSLOGD lo vas a encontrar en

      /etc/init.d/sysklogd

      Ahí colocas la misma línea SYSLOGD=”-a /var/lib/named/dev/log”

      2. Este fallo se debe a AppArmor hay dos opciones deshabilitarlo (que no es para nada recomendable) o seguir los pasos que encuentras aquí:

      http://ubuntuforums.org/showthread.php?t=800471&page=2&p=5828381#post5828381

      Que es básicamente modificar el archivo de configuración de AppArmor en /etc/apparmor.d/usr.sbin.named (sino existe tienes que crearlo) y luego agregar las líneas que aparecen en ese link y también especificar un directorio diferente para el archivo PID de bind9.

      No he probado esta configuración si te funciona por favor dímelo, igual cuando tenga tiempo la pruebo y haré un nuevo tutorial con estás instrucciones para Ubuntu.

      Saludos

  14. Ignacio dijo:

    Mil y un gracias! En instantes me voy a poner a probar, en cuanto tenga algún veredicto te aviso.

    Saludos!!




Algún comentario?