Configuración de DNS & DHCP

Introducción

Este documento describe cómo el DNS y DHCP trabajan en la red de Arda. He utilizado muchas de las características del DNS y de DHCP en mi configuración así que este documento proporciona una guía bastante comprensiva en cuanto a cómo conseguir que funcione. Este documento incluye:

  • Actualizaciones dinámicas entre DHCP y DNS
  • Actualizaciones automáticas de la zona entre servidores de nombres Master y Slave
  • Control del DNS usando el rndc
  • Ejecución segura del DNS usando TSIG
  • Listas del control de acceso ACL
  • Vistas Views
  • Redes de CIDR

Este documento no es un tutorial de cómo trabajan el DNS o DHCP. No enseña cómo utilizar el software descrito. Este documento proporciona un ejemplo de configuración de DNS/DHCP. Si Ud. es nuevo utilizando DNS o DHCP, seguramente necesitará conocimientos adicionales para entender lo que será presentada aquí. No tenga pánico, los conocimientos del DNS y DHCP son básicos en la operación de las redes IP, tales conocimientos son fáciles de alcanzar.

Preliminares

Elegí utilizar la implementación del Internet Systems Consortium’s (ISC) del DNS y de DHCP para la red de Arda. ¿Por qué?, se preguntará Ud. Pues porque están ambos en amplio uso así que pensé que podría encontrar muchas facilidades para ayudarme a configurar el software. Resultó que estaba en lo correcto. Particularmente, confié en un libro excelente de O’Reilly Press llamado ‘DNS and BIND’. Este libro proporciona mucha información útil; lo recomiendo.

Las versiones de software que utilizo son:

  • BIND 9.3.2 y 9.3.1
  • DHCP 3.0.4

Conocer las versiones del software es muy importante. Para BIND, la sintaxis de la configuración ha cambiado muchísimo entre las versiones, tanto que lo descrito aquí puede ser aplicado únicamente para BIND 9.

En el archivo de configuración de DHCP, la opción utilizada para invocar las actualizaciones dinámicas con un servidor del DNS es también sensible a la versión de DHCP.

Podrá encontrar una descripción que incluye una muy bonito diagrama de Arda Network aqui.

¿Por qué he ido al apuro a instalar el DNS y DHCP en mi red?, seguramente se preguntará. Bien, la respuesta más simple es porque lo quise. La respuesta más complicada se divide en dos partes. Encuentro aburrido poner al día archivos del host teniendo el DNS que me permite actualizar dos archivos de zona en el servidor de DNS del amo siempre que algo cambie en mi red. También a veces traigo a mi casa una computadora portátil del trabajo y quiero conectarla en mi red casera para hacer transferir archivos desde y a ella. Puesto que utiliza DHCP en mi trabajo, pensé que podía instalarlos en casa también. Espero haya muchas maneras más simples de lograr lo, pero no me imagino que tan interesante como yo lo hice.

Algo a tener en mente en la lectura de este documento es que el DNS en la red de Arda está configurado para servir únicamente a mi red local. No configuré el DNS para que sirva al mundo exterior. y, de hecho, configuré mi servidor DNS para prevenir que desde el exterior se pueda tener acceso a leer mis archivos de zona. Si Ud. quiere tener una zona que sirva al internet, deberá diseñarla de forma diferente a la que se describe aquí. Si Uds. desean crear un DNS cache (un servidor de cache almacena resultados de un DNS de preguntas pero no un servidor de zona) refiéranse a DNS cache Configuré mi máquina Thebe utilizando djbdns.

DNS

El DNS en la red de Arda es manejado por dos máquinas, Europa y Io, que actúan en conjunto master/slave. El uso de estas dos máquinas automatizó las transferencias de la zona, aseguradas mediante TSIG keys, para estar sincronizados. El master del servidor de DNS también es puesto al día en forma dinámica por el servidor de DHCP. Las actualizaciones dinámicas también se aseguran usando TSIG keys.

En Europa y Io, todas las llaves de TSIG fueron generadas usando este comando:

    dnssec-keygen -a HMAC-MD5 -b 256 -n HOST <key name>

Las llaves (keys) fueron cortadas y pegadas en los archivos de configuración correspondientes. En los archivos de la configuración enumerados abajo, cuando dos llaves en diversos archivos son referidas por el mismo nombre, es porque la misma llave se utiliza en ambos archivos.

Dos dominios se describen en mi configuración DNS, arda.homeunix.net y arda.homelinux.net. El primer dominio es el típico dominio del Internet. Todas las máquinas en mi red casera son parte de este dominio. El segundo dominio es un dominio virtual. Es utilizado por Callisto, mi servidor de correo, de modo que pueda encaminar el email por este dominio. Ninguna máquina real pertenece al dominio de arda.homelinux.net. Aunque incluyo solamente un dominio virtual en este documento, no me limito a uno. Podría hacer que tantos dominios virtuales como quiera simplemente agregando los archivos de zona apropiados y actualizando eñ archivo de configuración del servidor DNS named.conf.

Servidor principal del DNS (Master)

Archivos de Configuración

Debido a que utilizo TSIG para asegurar la transferencia entre zona y rndc, presento los permisos de varios archivos de configuración por ser muy importante. Aquí­ está la propiedad y los permisos de varios archivos de la configuración en Europa. Tome nota de la propiedad y de los permisos de los archivos relacionados con rndc. Se fijan de esta manera para que el usuario named pueda leer estos archivos, pero solamente root puede cambiarlos.

Archivo Propietario Permisos
/etc/namedb/etc/named.conf root:root 644
/etc/namedb/etc/rndc.key root:named 640
/etc/rndc.conf root:root 600
/etc/resolv.conf root:root 644

 

Aquí está mi archivo de configuración del servidor DNS named.conf:

// named.conf

// secret must be the same as in /etc/rndc.conf
include "/etc/rndc.key";

acl "internal-net" { 192.168.10/27; 127.0.0.1; };
acl "colonies" { 10.10.0.1; };

controls {
    inet 127.0.0.1 allow { any; } keys { "rndc-key"; };
};

logging {
    channel "named_log" {
        // send most BIND logs to a dedicated log file
        file "/var/log/named.log" versions 10 size 500k;
        severity dynamic;
        print-category yes;
        print-severity yes;
        print-time yes;
    };

    channel "query_log" {
        // query logs go to a separate file
        file "/var/log/query.log" versions 10 size 500k;
        severity debug;
        print-severity yes;
        print-time yes;
    };

    category default { named_log; };
    category queries { query_log; };
};

options {
    directory "/";
    pid-file "var/run/named.pid";
    statistics-file "master/named.stats";
    dump-file "master/named.dump";
    listen-on { "internal-net"; };
    allow-query { "internal-net"; "colonies"; };
    allow-transfer { none; };
    notify no;

    forwarders { <ISP DNS server 1>; <ISP DNS server 2>; };

    /*
     * If there is a firewall between you and nameservers you want
     * to talk to, you might need to uncomment the query-source
     * directive below.  Previous versions of BIND always asked
     * questions using port 53, but BIND 8.1 uses an unprivileged
     * port by default.
     */
     // query-source address * port 53;
};

view "standard-in" in {

    zone "." {
        type hint;
        file "master/named.root";
    };

    zone "arda.homeunix.net" {
        type master;
        file "master/arda.homeunix.net.zone";
        allow-transfer { key "europa-io"; };
        //allow-update { key "europa-dhcp"; };
        update-policy { grant europa-dhcp subdomain arda.homeunix.net. A TXT; };
        notify yes;
    };

    zone "arda.homelinux.net" {
        type master;
        file "master/arda.homelinux.net.zone";
        allow-transfer { key "europa-io"; };
        notify yes;
    };

    zone "10.168.192.in-addr.arpa" {
        type master;
        file "master/10.168.192.in-addr.arpa";
        allow-transfer { key "europa-io"; };
        //allow-update { key "europa-dhcp"; };
        update-policy { grant europa-dhcp subdomain 10.168.192.in-addr.arpa. PTR TXT; };
        notify yes;
    };

    zone "0.10.10.in-addr.arpa" {
        type master;
        file "master/0.10.10.in-addr.arpa";
        allow-transfer { key "europa-io"; };
        notify yes;
    };

    zone "localhost" {
        type master;
        file "master/localhost.zone";
    };

    zone "0.0.127.in-addr.arpa" {
        type master;
        file "master/localhost.rev";
    };

    zone "0.in-addr.arpa" {
        type master;
        file "master/named.network";
    };

    zone "255.in-addr.arpa" {
        type master;
        file "master/named.broadcast";
    };
};

view "ultimate-chaos" chaos {

    recursion no;

    zone "." {
        type hint;
        file "/dev/null";
    };

    zone "bind" {
        type master;
        file "master/named.bind";
    };
};

Algunas aclaraciones referentes a mi archivo de named.conf :

  • Utilizo una instrucción incluide para insertar mis TSIG keys que están en un archivo separado: rndc.key. La razón es que las llaves de TSIG tienen valor si nadie puede acceder a ellas (excepto su propietario). El archivo rndc.key tiene mś¡s restricciones de acceso que el archivo named.conf.
  • Tengo dos listas del control de acceso (ACLs); ‘internal-net’ y ‘colonies’. Utilizo estas ACLs para restringir quién puede preguntar a mi servidor de nombres. En mi caso, permito preguntas solamente de las máquinas en mi red casera. Las ACL ‘colonies’ cuidan a Thebe, que está conectado con mi red casera a través de un túnel VPN.
  • La cláusula controls define de donde el rndc puede utilizarse por BIND. Tengo a BIND aceptando los comandos del rndc solamente desde loopback.
  • Utilizo una cláusula de registro (log) en dos canales. Un canal esencialmente substituye el registro al syslog. Pensé que teniendo a BIND enviando los registros a un archivo separado será más conveniente para encontrar mensajes importantes más facilmente. Definir un canal del registro independiente proporciona control sobre lo que se registra. Por ejemplo, fijar el nivel de información de manera dinámica me permite determinar si se envía o no la información producida por un trace al comando rndc. El segundo canal es para registrar el manejo de las preguntas a BIND. Se registran las preguntas solamente si das vuelta a la pregunta que entra con el rndc. Mi servidor del DNS no está muy ocupado así que puedo permitirme dejar abierta esta posibilidad a toda hora. En un servidor DNS con gran trabajo, posiblemente Ud. deba habilitar esta opción solamente para localizar un problema. Un servidor de nombres ocupado puede producir pilas de preguntas en un tiempo muy corto.
  • La zona arda.homelinux.net se refiere a un dominio virtual usado exclusivamente con mi servidor de correo; no existe un host verdaderos asociado a este dominio. Esta entrada me permite que encamine el correo para el dominio de arda.homelinux.net. Cada dominio virtual usado por mi servidor de correo necesita tener una zona similar en el archivo named.conf.
  • La zona 0.10.10.in-addr.arpa proporciona el servicio de reversión de la dirección de Thebe. Las búsquedas hacia adelante (forward) son manejadas por una entrada en la zona arda.homeunix.net. Mire algo un poco extraño que sucede en IP de 10.10.0.0 en la misma zona con otras máquinas que pertenecen a 192.168.10.0, pero es una solución simple que trabaja con mi personal configuración de VPN. Una explicación completa tendrá que esperar hasta que consiga escribir un documento que describa cómo VPN trabaja en la red de Arda.
  • Tengo la instrucción notify puesta en no en la sección options. Este ajuste se elimina en las zonas arda.homeunix.net, arda.homelinux.net, 10.168.192.in-addr.arpa, y 0.10.10.in-addr.arpa. Note que no he puesto el parámetro notify, los mensajes de notify pueden generarse por todas las zonas siempre que BIND sea reiniciado. Puesto que las cuatro zonas enumeradas son las únicas que cambiarán siempre, y están de acuerdo a la configuración conforme a las transferencias de la zona, decidí eliminar los mensajes de notify innecesarios. La zona de root puede cambiar de vez en cuando, pero la opción notify no está habilitada en esta zona.
  • La opcion allow-transfer en la sección option configura BIND con el comportamiento por defecto para rechazar todas las transferencias de la zona. Si no configura esta opción, cualquier persona puede transferir cualquier zona. Esta opción entonces se elimina en arda.homeunix.net, arda.homelinux.net, las zonas 10.168.192.in-addr.arpa, y 0.10.10.in-addr.arpa. La opcion allow-transfer en estas zonas dicen a BIND que las transferencias de zona sean permitidas solamente si el solicitante utiliza la llave especificada de TSIG.
  • La opción forwarders le dice a BIND que no utilice preguntas iterativas a sí mismo para obtener información que no conoce sino que transmite la pregunta recurrente a los servidores de nombres especificados. En mi caso, tengo mi servidor que señala a los servidores de nombres de mi ISP. Esto me permite que haga uso los caches en estos servidores de nombres, que son ciertamente más extensos que los que yo dispongo. Observe que mi configuración trabajará perfectamente bien sin usar la opción forwarders. Si debe utilizar forwarders depende de muchas cosas incluyendo su topología de red, el tipo de conexión a Internet disponible y el volumen y los tipos de preguntas que genera.
  • He instalado mi servidor BIND para que utilice views. Un uso común de views es permitir que su servidor de nombres conteste a preguntas de su red interna en forma diferente que a preguntas desde el Internet. En mi caso, estoy utilizando views para tener más control sobre cómo la información de la versión es servida por BIND con la zona de named.bind.
  • Las opciones allow-update y update-policy en las zonas arda.homeunix y 10.168.192.in-addr.arpa indican que pueden ser actualizadas por DHCP. Yo inicialmente utilizaba la opción allow-update hasta que tuve éxito en encontrar la sintaxis apropiado para la opción update-policy. Ambas opciones pueden utilizar una llave de TSIG para restringir quién puede realizar actualizaciones pero update-policy permite más control sobre qué clases de actualizaciones DHCP puede realizar en una zona.
  • La zona localhost se incorpora a menudo en otra zona; en mi caso esta será la zona de arda.homeunix.net. RFC1912 recomienda que la zona del localhost sea identificada por separado y he adoptado ese esquema aquí. Ver el RFC por la razón que está detrás de esta recomendación.
  • Las zonas 0.in-addr.arpa y 255.in-addr.arpa son genéricas, permiten que BIND se ocupe de las operaciones de búsqueda reversas erróneas de las direcciones 0.0.0.0 y 255.255.255.255 para no enviar estas preguntas al servidor de nombres root. Estas zonas se recomiendan en RFC1912.
  • La zona bind es diferente del resto. Su presencia permite que controle la información de la versión que BIND difunde. La opción version también hará esto pero especificar esta zona provee información de la versión oculta de algunos clientes que usan listas del control de acceso ACL. También permite registrar (log) tales peticiones, algo que no es posible al utilizar la opción version. BIND “complaines” si no están en la zona hint en esta view pero todavía parece trabajar. Puede recuperar la información en la zona bind con estas preguntas:
        dig version.bind txt chaos
      dig authors.bind txt chaos

aquí está mi archivo my rndc.conf:

/*
 * Copyright (C) 2000, 2001  Internet Software Consortium.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
 * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/* $Id: rndc.conf,v 1.7 2001/01/09 21:40:45 bwelling Exp $ */

options {
        default-server  localhost;
        default-key     "rndc-key";
};

server localhost {
        key     "rndc-key";
};

key "rndc-key" {
        algorithm       hmac-md5;
        secret
        "<rndc-key>";
};

y aquí mi archivo rndc.key:

key "rndc-key" {
        algorithm       hmac-md5;
        secret
        "<rndc-key>";
};

key "europa-dhcp" {
        algorithm       hmac-md5;
        secret
        "<europa-dhcp key>";
};

key "europa-io" {
        algorithm       hmac-md5;
        secret
        "<europa-io key>";
};

Mi archivo /etc/resolv.conf se mira así:

domain arda.homeunix.net
nameserver localhost
nameserver 192.168.10.5
Archivos Zona

Los nueve archivos zone están ubicados en /etc/namedb/master. La seccion que describe como se ejecuta BIND en chroot jail presenta un listado del directorio.

Hay dos archivos *.jnl en el directorio /etc/namedb/master. Se producen cuando el dhcpd actualiza mis archivos de la zona.

Aquí están lo que parecen ser mis archivos de zona:

Archivos Zone Contenidos
arda.homeunix.net.zone
$ORIGIN .
$TTL 86400      ; 1 day
arda.homeunix.net       IN SOA  europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                20060705   ; serial
                                21600      ; refresh (6 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                21600      ; minimum (6 hours)
                                )
                        NS      io.arda.homeunix.net.
                        NS      europa.arda.homeunix.net.
                        MX      10 callisto.arda.homeunix.net.
$ORIGIN arda.homeunix.net.
metis                   A       192.168.10.1
thebe                   A       10.10.0.1
io                      A       192.168.10.5
europa                  A       192.168.10.9
callisto                A       192.168.10.6
$TTL 14400      ; 4 hours
ganymede                A       192.168.10.28
                        TXT     "311cc5d6b2b528cc61e23c831e840a6bf4"
$TTL 86400      ; 1 day
mail                    CNAME   callisto
www                     CNAME   io
arda.homelinux.net.zone
$ORIGIN .
$TTL 86400      ; 1 day
arda.homelinux.net      IN SOA  europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                20070706   ; serial
                                21600      ; refresh (6 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      io.arda.homeunix.net.
                        NS      europa.arda.homeunix.net.
                        MX      10 callisto.arda.homeunix.net.
10.168.192.in-addr.arpa
$ORIGIN .
$TTL 86400      ; 1 day
10.168.192.in-addr.arpa IN SOA  europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                20060705   ; serial
                                21600      ; refresh (6 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                21600      ; minimum (6 hours)
                                )
                        NS      io.arda.homeunix.net.
                        NS      europa.arda.homeunix.net.
$ORIGIN 10.168.192.in-addr.arpa.
1                       PTR     metis.arda.homeunix.net.
$TTL 14400      ; 4 hours
28                      PTR     ganymede.arda.homeunix.net.
$TTL 86400      ; 1 day
5                       PTR     io.arda.homeunix.net.
6                       PTR     callisto.arda.homeunix.net.
9                       PTR     europa.arda.homeunix.net.
0.10.10.in-addr.arpa
$ORIGIN .
$TTL 86400      ; 1 day
0.10.10.in-addr.arpa    IN SOA  europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                20070705   ; serial
                                21600      ; refresh (6 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      io.arda.homeunix.net.
                        NS      europa.arda.homeunix.net.
$ORIGIN 0.10.10.in-addr.arpa.
1                       PTR     thebe.arda.homeunix.net.
localhost.zone
$TTL 1w
@        IN SOA europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                        1       ; Serial
                                        6h      ; Refresh after 6 hours
                                        1h      ; Retry after 1 hour
                                        1w      ; Expire after 1 week
                                        1d )    ; Negative caching TTL of 1 day

                        IN      NS      europa.arda.homeunix.net.
                        IN      NS      io.arda.homeunix.net.

localhost.              IN      A       127.0.0.1
localhost.rev
$TTL 1w
@        IN SOA europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                        1       ; Serial
                                        6h      ; Refresh after 6 hours
                                        1h      ; Retry after 1 hour
                                        1w      ; Expire after 1 week
                                        1d )    ; Negative caching TTL of 1 day

                        IN      NS      europa.arda.homeunix.net.
                        IN      NS      io.arda.homeunix.net.

1                       IN      PTR     localhost.
named.broadcast
named.network
$TTL 1w
@       IN SOA europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                        1       ; Serial
                                        6h      ; Refresh after 6 hours
                                        1h      ; Retry after 1 hour
                                        1w      ; Expire after 1 week
                                        1d )    ; Negative caching TTL of 1 day

                IN      NS      europa.arda.homeunix.net.
                IN      NS      io.arda.homeunix.net.
named.bind
$TTL 1d
$ORIGIN bind.
@       CHAOS SOA europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                        1       ; Serial
                                        6h      ; Refresh after 6 hours
                                        1h      ; Retry after 1 hour
                                        1w      ; Expire after 1 week
                                        1d )    ; Negative caching TTL of 1 day

                CHAOS   NS      localhost.

version.bind.   CHAOS   TXT     "BIND 9.3.2"
authors.bind.   CHAOS   TXT     "Are at home at the ISC."
named.root
; <<>> DiG 9.3.2 <<>> @a.root-servers.net . ns
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63591
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13

;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS      C.ROOT-SERVERS.NET.
.                       518400  IN      NS      G.ROOT-SERVERS.NET.
.                       518400  IN      NS      F.ROOT-SERVERS.NET.
.                       518400  IN      NS      B.ROOT-SERVERS.NET.
.                       518400  IN      NS      J.ROOT-SERVERS.NET.
.                       518400  IN      NS      K.ROOT-SERVERS.NET.
.                       518400  IN      NS      L.ROOT-SERVERS.NET.
.                       518400  IN      NS      M.ROOT-SERVERS.NET.
.                       518400  IN      NS      I.ROOT-SERVERS.NET.
.                       518400  IN      NS      E.ROOT-SERVERS.NET.
.                       518400  IN      NS      D.ROOT-SERVERS.NET.
.                       518400  IN      NS      A.ROOT-SERVERS.NET.
.                       518400  IN      NS      H.ROOT-SERVERS.NET.

;; ADDITIONAL SECTION:
C.ROOT-SERVERS.NET.     3600000 IN      A       192.33.4.12
G.ROOT-SERVERS.NET.     3600000 IN      A       192.112.36.4
F.ROOT-SERVERS.NET.     3600000 IN      A       192.5.5.241
B.ROOT-SERVERS.NET.     3600000 IN      A       192.228.79.201
J.ROOT-SERVERS.NET.     3600000 IN      A       192.58.128.30
K.ROOT-SERVERS.NET.     3600000 IN      A       193.0.14.129
L.ROOT-SERVERS.NET.     3600000 IN      A       198.32.64.12
M.ROOT-SERVERS.NET.     3600000 IN      A       202.12.27.33
I.ROOT-SERVERS.NET.     3600000 IN      A       192.36.148.17
E.ROOT-SERVERS.NET.     3600000 IN      A       192.203.230.10
D.ROOT-SERVERS.NET.     3600000 IN      A       128.8.10.90
A.ROOT-SERVERS.NET.     3600000 IN      A       198.41.0.4
H.ROOT-SERVERS.NET.     3600000 IN      A       128.63.2.53

;; Query time: 99 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Thu Jul  6 08:00:26 2006
;; MSG SIZE  rcvd: 436

En los archivos .zone y 10.168.192.in-addr.arpa de arda.homeunix.net, los registros de fuente (resource records RR) para el host Ganymede fueron insertados por DHCP. Los otros archivos más el resto de los archivos de zona fueron creados a mano con una excepción:

El archivo de named.root no fue creado a mano sino por la salida de esta pregunta con dig:

    dig @a.root-servers.net . ns > named.root

Este comando se puede volver a efectuar periódicamente para actualizar la lista de servidores de nombres root . Los servidores de nombres root no cambian muy a menudo así que la puesta al día de este archivo dos veces por un año es más que suficiente. Las actualizaciones frecuentes pueden deshacer la carga de los servidores de nombres root; tienen bastantes que hacer mientras existen.

El archivo arda.homelinux.net .zone no contiene ningún registro A. Su único propósito es identificar el servidor de correos, vía el registro MX, al cual se debe enviar el correo.

Actualización manual de los archivos de Zona

Hay momentos en que he necesitado actualizar manualmente un archivo de zona. Puesto que en Europa está el servidor de nombres principal (Master), siempre realizo el cambio en esta máquina y no prohibo el normal proceso de transferencia de la zona y se difunda el cambio a Io. Por supuesto, porque tengo un servidor de nombres slave y porque estoy actualizando dinámicamente con DHCP, el proceso de hacer cambios tiene algunos pasos:

  1. Utilizar el rndc para parar BIND.
  2. Borrar cualquier archivo .jnl del directorio de zona.
  3. Editar los archivos de zona cuanto sea necesario. Cerciorarse de incrementar el número de serie de cualquier archivo corregido.
  4. Comenzar BIND utilizando el script de arranque.

Si necesita corregir los archivos de la zona que no están sujetos a actualizaciones dinámicas, entonces no necesita detener BIND. Cuando edite los archivos de zona recuerde incrementar el número de serie y ejecutar un comando de recarga del rndc, tan simple como eso. Siempre y cuando realice cambios en un servidor de nombres principal, el comando de recarga tendrá cuidado de inicializar cualquier transferencia de zona que necesite.

Ejecución de BIND Chrooted

En Europa, no sólo corre BIND con privilegios reducidos, también funciona chroot jail. Aquí está cómo lo hice.

  1. La primera cosa a hacer era decidir donde poner todo. Decidí crear el directorio /etc/namedb que se convirtió en raíz de BIND.
  2. Necesité agregar directorios y archivos a namedb. Aquí está como se veían las cosas:
    • drwxr-xr-x    6 root     root         4096 Jan 19 20:13 /etc/namedb/
      drwxr-xr-x    2 root     root         4096 Jan 19 20:21 /etc/namedb/dev/
      crw-rw-rw-    1 root     root       1,   3 Jan 19 20:00 /etc/namedb/dev/null
      crw-r--r--    1 root     root       1,   8 Jan 19 20:21 /etc/namedb/dev/random
      drwxr-xr-x    2 root     root         4096 Jan 19 19:59 /etc/namedb/etc/
      -rw-r--r--    1 root     root         1267 Jan 19 19:54 /etc/namedb/etc/localtime
      -rw-r--r--    1 root     root         1592 Jul  5 16:38 /etc/namedb/etc/named.conf
      -rw-r-----    1 root     named         344 Jan 19 19:55 /etc/namedb/etc/rndc.key
      drwxr-xr-x    2 named    named        4096 Jan 19 19:56 /etc/namedb/master/
      -rw-r--r--    1 root     root          412 Jul  5 17:00 /etc/namedb/master/0.10.10.in-addr.arpa
      -rw-r--r--    1 named    named         803 Jul  5 16:56 /etc/namedb/master/10.168.192.in-addr.arpa
      -rw-r--r--    1 named    named        1460 Jul  5 16:56 /etc/namedb/master/10.168.192.in-addr.arpa.jnl
      -rw-r--r--    1 root     root          781 Jul  5 17:35 /etc/namedb/master/arda.homelinux.net.zone
      -rw-r--r--    1 named    named         797 Jul  5 16:57 /etc/namedb/master/arda.homeunix.net.zone
      -rw-r--r--    1 named    named        1460 Jul  5 16:57 /etc/namedb/master/arda.homeunix.net.zone.jnl
      -rw-r--r--    1 root     root          620 Jul  5 16:46 /etc/namedb/master/localhost.rev
      -rw-r--r--    1 root     root          619 Jul  5 16:46 /etc/namedb/master/localhost.zone
      -rw-r--r--    1 root     root          592 Jul  5 16:47 /etc/namedb/master/named.bind
      -rw-r--r--    1 root     root          551 Jul  5 16:48 /etc/namedb/master/named.broadcast
      -rw-r--r--    1 root     root          551 Jul  5 16:48 /etc/namedb/master/named.network
      -rw-r--r--    1 root     root         1516 Jul  6 08:00 /etc/namedb/master/named.root
      drwxr-xr-x    3 root     root         4096 Jan 19 20:14 /etc/namedb/var/
      drwxr-xr-x    2 named    named        4096 Jan 19 20:24 /etc/namedb/var/run/
    • El directorio var/run donde está el archivo BIND pid funcionado. 
    • Crear el archivo especial dev/null utilizando el comando 'mknod /etc/namedb/dev/null c 1 3'. 
    • Crear el archivo especial dev/random usando el comando 'mknod /etc/namedb/dev/random c 1 8'. 
    • Cuando se crean ficheros especiales con mknod, es una buena idea comprobar los archivos correspondientes en el directorio de /dev para cerciorarse de los números mayor y menor sean los correctos. Ud. podría desear utilizar los  archivos en el directorio de /dev. 
    • El archivo etc/localtime se copia de /etc. Este archivo asegura a BIND la zona de tiempo adecuada en los mensajes del registro (log). 
    • Los archivos de zona arda.homeunix.net.zone y 10.168.192.in-addr.arpa deben ser escribibles por el usuario nombrado porque son actualizados dinámicamente por el dhcpd. Los dos archivos *.jnl son propiedad de named cuando son creados por dhcpd. 
  1. Antes de que comenzar a usar los canales del registro (log channels) en named.conf, necesité dar a BIND una manera de enviar mensajes al syslog dentro de chroot jail. Para lograrlo, modifiqué una lí­nea en el archivo /etc/sysconfig/syslog:
        SYSLOGD_OPTIONS=”-m 0″
            se convirtió en:
      SYSLOGD_OPTIONS=”-m 0 -a /etc/namedb/dev/log”

    Parar y comenzar el syslog harán que un nuevo zócalo (socket) en syslog aparezca en el directorio /etc/namedb/dev. Puesto que utilizo los canales del registro, no hago este paso otra vez.

  1. Lo hecho anteriormente modifica los parámetros de arranque de BIND diciéndole que funcione en “jail”. Hice esto agregando la línea siguiente al archivo /etc/sysconfig/named.

ROOTDIR= ” /etc/namedb ”

Scripts de Arranque

Corrí BIND bajo usuario y grupo “named”. Así es cómo se ve script de lanzamiento /etc/rc.d/init.d/named. Necesité modificarla de modo que buscara binarios en /usr/local/sbin en vez de /usr/sbin y buscara rndc.conf en /etc y no en chroot jail.

#!/bin/bash
#
# named           This shell script takes care of starting and stopping
#                 named (BIND DNS server).
#
# chkconfig: 345 55 45
# description: named (BIND) is a Domain Name Server (DNS) \
# that is used to resolve host names to IP addresses.
# probe: true

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 0

[ -f /etc/sysconfig/named ] && . /etc/sysconfig/named

[ -f /usr/local/sbin/named ] || exit 0

[ -f ${ROOTDIR}/etc/named.conf ] || exit 0

RETVAL=0
prog="named"

start() {
        # Start daemons.
        gprintf "Starting %s: " $prog
        if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then
                OPTIONS="${OPTIONS} -t ${ROOTDIR}"
        fi
        daemon /usr/local/sbin/named -u named ${OPTIONS}
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named
        echo
        return $RETVAL
}
stop() {
        # Stop daemons.
        gprintf "Stopping %s: " $prog
        killproc named
        RETVAL=$?
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named
        echo
        return $RETVAL
}
rhstatus() {
        #/usr/sbin/rndc -c ${ROOTDIR}/etc/rndc.conf status
        /usr/local/sbin/rndc -c /etc/rndc.conf status
        return $?
}
restart() {
        stop
        start
}
reload() {
        #/usr/sbin/rndc -c ${ROOTDIR}/etc/rndc.conf reload >/dev/null 2>&1 || /usr/bin/killall -HUP named
        /usr/local/sbin/rndc -c /etc/rndc.conf reload >/dev/null 2>&1 || /usr/bin/killall -HUP named
        return $?
}
probe() {
        # named knows how to reload intelligently; we don't want linuxconf
        # to offer to restart every time
        #/usr/sbin/rndc -c ${ROOTDIR}/etc/rndc.conf reload >/dev/null 2>&1 || echo start
        /usr/local/sbin/rndc -c /etc/rndc.conf reload >/dev/null 2>&1 || echo start
        return $?
}

# See how we were called.
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        status)
                rhstatus
                ;;
        restart)
                restart
                ;;
        condrestart)
                [ -f /var/lock/subsys/named ] && restart
                ;;
        reload)
                reload
                ;;
        probe)
                probe
                ;;
        *)
                gprintf "Usage: %s {start|stop|status|restart|condrestart|reload|probe}\n" $0
                exit 1
esac

exit $?

Servidor Slave de DNS

La configuración del DNS en Io sigue de cerca lo hecho para Europa. Las diferencias más grandes vienen del hecho que el Io es un servidor de nombres auxiliar slave y BIND en Europa debe acomodar actualizaciones dinámicas mientras que no lo hace en Io.

Archivos de Configuración

Aquí está la propiedad y los permisos de varios archivos de la configuración:

Archivos Propietario Permisos
/var/named/etc/namedb/named.conf root:wheel 644
/var/named/etc/namedb/rndc.key root:bind 640
/var/named/etc/namedb/rndc.conf root:wheel 600
/etc/resolv.conf root:wheel 644

Aquí está mi archivo named.conf:

// Refer to the named.conf(5) and named(8) man pages for details.  If
// you are ever going to setup a primary server, make sure you've
// understood the hairy details of how DNS is working.  Even with
// simple mistakes, you can break connectivity for affected parties,
// or cause huge amount of useless Internet traffic.

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

acl "internal-net" { 192.168.10/27; 127.0.0.1; };
acl "colonies" { 10.10.0.1; };

controls {
        inet 127.0.0.1 allow { any; } keys { "rndc-key"; };
};

//key to use for zone transfers
server 192.168.10.9 {
        keys { "europa-io"; };
};

logging {
    channel "named_log" {
        // send most BIND logs a dedicated log file
        file "/var/log/named.log" versions 10 size 500k;
        severity dynamic;
        print-category yes;
        print-severity yes;
        print-time yes;
    };

    channel "query_log" {
        // query logs go to a separate file
        file "/var/log/query.log" versions 10 size 500k;
        severity debug;
                print-severity yes;
        print-time yes;
    };

    category default { named_log; };
    category queries { query_log; };
};

options {
        directory "/etc/namedb";
                pid-file "/var/run/named/pid";
        statistics-file "/var/stats/named.stats";
        dump-file "/var/dump/named.dump";
        listen-on { "internal-net"; };
        allow-query { "internal-net"; "colonies"; };
        allow-transfer { none; };

// In addition to the "forwarders" clause, you can force your name
// server to never initiate queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
//      forward only;

// If you've got a DNS server around at your upstream provider, enter
// its IP address here, and enable the line below.  This will make you
// benefit from its cache, thus reduce overall DNS traffic in the Internet.
        forwarders {
                <ISP DNS server 1>; <ISP DNS server 2>;
        };

        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
        // query-source address * port 53;
};

// Setting up secondaries is way easier and the rough picture for this
// is explained below.
//
// If you enable a local name server, don't forget to enter 127.0.0.1
// into your /etc/resolv.conf so this server will be queried first.
// Also, make sure to enable it in /etc/rc.conf.

view "standard-in" in {

        zone "." {
                type hint;
                file "master/named.root";
        };

        zone "arda.homeunix.net" {
                type slave;
                file "slave/bak.arda.homeunix.net.zone";
                masters { 192.168.10.9; };
        };

        zone "arda.homelinux.net" {
                type slave;
                file "slave/bak.arda.homelinux.net.zone";
                masters { 192.168.10.9; };
        };

        zone "10.168.192.in-addr.arpa" {
                type slave;
                file "slave/bak.10.168.192.in-addr.arpa";
                masters { 192.168.10.9; };
        };

        zone "0.10.10.in-addr.arpa" {
                type slave;
                file "slave/bak.0.10.10.in-addr.arpa";
                masters { 192.168.10.9; };
        };

        zone "localhost" {
                type master;
                file "master/localhost.zone";
        };

        zone "0.0.127.in-addr.arpa" {
                type master;
                file "master/localhost.rev";
        };

        zone "0.in-addr.arpa" {
                type master;
                file "master/named.network";
        };

        zone "255.in-addr.arpa" {
                type master;
                file "master/named.broadcast";
        };
};

view "ultimate-chaos" chaos {

        recursion no;

        zone "." {
                type hint;
                file "/dev/null";
        };

        zone "bind" {
                type master;
                file "master/named.bind";
        };
};

Este archivo parece mucho a mi archivo named.conf en Europa pero hay algunas diferencias:

  • La cláusula del servidor dice a BIND qué llave de TSIG utiliza cuando transfiere zona con Europa, mi servidor de nombres primario.
  •  La opción allow-transfer en la sección de opciones no se elimina en las zonas arda.homeunix.net, arda.homelinux.net, 10.168.192.in-addr.arpa, y 0.10.10.in-addr.arpa. Las transferencias de zona se deben hacer solamente de un servidor de nombres primario para las zonas. No configure allow-transfer a none podría abrir una puerta trasera si no desea compartir sus zona de datos.

Aquí está mi archivo de rndc.conf:

/*
 * Copyright (C) 2000, 2001  Internet Software Consortium.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
 * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/* $Id: rndc.conf,v 1.7 2001/01/09 21:40:45 bwelling Exp $ */

options {
        default-server  localhost;
        default-key     "rndc-key";
};

server 127.0.0.1 {
        key     "rndc-key";
};

key "rndc-key" {
        algorithm       hmac-md5;
        secret
        "<rndc-key>";
};

Y aquí está mi archivo rndc.key.

key "rndc-key" {
        algorithm       hmac-md5;
        secret
        "<rndc-key>";
};

key "europa-io" {
        algorithm       hmac-md5;
        secret
        "<europa-io key>";
};

Mi archivo /etc/resolv.conf se parece a esto:

domain  arda.homeunix.net
nameserver      127.0.0.1
nameserver      192.168.10.9



Archivos de Zona

En Io, los archivos de zona están en el directorio /etc/namedb/master y /etc/namedb/slave. La seccion presenta la ejecución de BIND como chroot, los directorios aparecen asi:

Aquí están los nueve archivos de la zona en el Io:

Archivos Zone Contenidos
bak.arda.homelinux.net.zone

copiado de Europa automáticamente por transferencia de zona

bak.arda.homeunix.net.zone

copiado de Europa automáticamente por transferencia de zona

bak.10.168.192.in-addr.arpa

copiado de Europa automáticamente por transferencia de zona

bak.0.10.10.in-addr.arpa

copiado de Europa automáticamente por transferencia de zona

localhost.zone
$TTL 1w
@        IN SOA europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                        1       ; Serial
                                        6h      ; Refresh after 6 hours
                                        1h      ; Retry after 1 hour
                                        1w      ; Expire after 1 week
                                        1d )    ; Negative caching TTL of 1 day

                        IN      NS      europa.arda.homeunix.net.
                        IN      NS      io.arda.homeunix.net.

localhost.              IN      A       127.0.0.1
localhost.rev
$TTL 1w
@        IN SOA europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                        1       ; Serial
                                        6h      ; Refresh after 6 hours
                                        1h      ; Retry after 1 hour
                                        1w      ; Expire after 1 week
                                        1d )    ; Negative caching TTL of 1 day

                        IN      NS      europa.arda.homeunix.net.
                        IN      NS      io.arda.homeunix.net.

1                       IN      PTR     localhost.
named.broadcast
named.network
$TTL 1w
@       IN SOA europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                        1       ; Serial
                                        6h      ; Refresh after 6 hours
                                        1h      ; Retry after 1 hour
                                        1w      ; Expire after 1 week
                                        1d )    ; Negative caching TTL of 1 day

                        IN      NS      europa.arda.homeunix.net.
                        IN      NS      io.arda.homeunix.net.
named.bind
$TTL 1w
$ORIGIN bind.
@       CHAOS SOA europa.arda.homeunix.net. postmaster.arda.homeunix.net. (
                                        1       ; Serial
                                        6h      ; Refresh after 6 hours
                                        1h      ; Retry after 1 hour
                                        1w      ; Expire after 1 week
                                        1d )    ; Negative caching TTL of 1 day

                        CHAOS   NS      localhost.

version.bind.           CHAOS   TXT     "BIND 9.3.1"
authors.bind.           CHAOS   TXT     "Are at home at the ISC."
named.root
; <<>> DiG 9.3.1 <<>> @a.root-servers.net . ns
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41586
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13

;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS      F.ROOT-SERVERS.NET.
.                       518400  IN      NS      B.ROOT-SERVERS.NET.
.                       518400  IN      NS      J.ROOT-SERVERS.NET.
.                       518400  IN      NS      K.ROOT-SERVERS.NET.
.                       518400  IN      NS      L.ROOT-SERVERS.NET.
.                       518400  IN      NS      M.ROOT-SERVERS.NET.
.                       518400  IN      NS      I.ROOT-SERVERS.NET.
.                       518400  IN      NS      E.ROOT-SERVERS.NET.
.                       518400  IN      NS      D.ROOT-SERVERS.NET.
.                       518400  IN      NS      A.ROOT-SERVERS.NET.
.                       518400  IN      NS      H.ROOT-SERVERS.NET.
.                       518400  IN      NS      C.ROOT-SERVERS.NET.
.                       518400  IN      NS      G.ROOT-SERVERS.NET.

;; ADDITIONAL SECTION:
F.ROOT-SERVERS.NET.     3600000 IN      A       192.5.5.241
B.ROOT-SERVERS.NET.     3600000 IN      A       192.228.79.201
J.ROOT-SERVERS.NET.     3600000 IN      A       192.58.128.30
K.ROOT-SERVERS.NET.     3600000 IN      A       193.0.14.129
L.ROOT-SERVERS.NET.     3600000 IN      A       198.32.64.12
M.ROOT-SERVERS.NET.     3600000 IN      A       202.12.27.33
I.ROOT-SERVERS.NET.     3600000 IN      A       192.36.148.17
E.ROOT-SERVERS.NET.     3600000 IN      A       192.203.230.10
D.ROOT-SERVERS.NET.     3600000 IN      A       128.8.10.90
A.ROOT-SERVERS.NET.     3600000 IN      A       198.41.0.4
H.ROOT-SERVERS.NET.     3600000 IN      A       128.63.2.53
C.ROOT-SERVERS.NET.     3600000 IN      A       192.33.4.12
G.ROOT-SERVERS.NET.     3600000 IN      A       192.112.36.4

;; Query time: 86 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Mon May 15 00:01:43 2006
;; MSG SIZE  rcvd: 436

Los archivos de zona arda.homelinux.net .zone, arda.homeunix.net .zone, 10.168.192.in-addr.arpa y 0.10.10.in-addr.arpa en Europa se copian a su “bak” correspondiente en Io no los enumero otra vez aquí.

Los archivos localhost.zone, named.broadcast, named.network y named.bind simplemente se copian de Europa sin modificación.

FreeBSD proporciona el script make-localhost para crear el reverso de zona del localhost. No uso este script, copié el archivo localhost.rev de Europa junto con todo.

Como con Europa, el archivo named.root es salida de un comando dig que enumerar toda la raíz de servidores de nombres.

Ejecución de BIND Chrooted

Como en Europa, en Io corrí BIND sin privilegios y en chroot jail. Realmente no hay nada que hacer en FreeBSD, el script de arranque que viene con el Sistema Operativo hace todo por uno la primera vez que se inicia named. En mi caso, debí editar el archivo named.conf, copié los archivos de zona desde Europa, y cree los archivos rndc.key, y rndc.conf. El directorio FreeBSD utilizado por jail para esto es /var/named. Aquí está una vista después que añadí archivos y después que se transfirió la zona desde Europa.

drwxr-xr-x   5 root    wheel      512 Oct 10 00:28 /var/named
dr-xr-xr-x  4 root  wheel  512 Oct  9 15:46 /var/named/dev
crw-rw-rw-  1 root  wheel    2,   2 Oct 11 18:00 var/named/dev/null
crw-rw-rw-  1 root  wheel  246,   0 Oct  5 20:28 var/named/dev/random
drwxr-xr-x  3 root  wheel  512 Oct 10 00:28 /var/named/etc
-r--r--r--  1 root  wheel  1252 Sep 11 12:10 /var/named/etc/localtime
drwxr-xr-x  5 root  wheel   512 Oct 10 00:28 /var/named/etc/namedb
-rw-r--r--  1 root  wheel   423 May  8 03:05 /var/named/etc/namedb/PROTO.localhost-v6.rev
-rw-r--r--  1 root  wheel   423 May  8 03:05 /var/named/etc/namedb/PROTO.localhost.rev
drwxr-xr-x  2 bind  wheel   512 May  8 03:00 /var/named/etc/namedb/dynamic
-rw-r--r--  1 root  wheel  1093 May  8 03:05 /var/named/etc/namedb/make-localhost
drwxr-xr-x  2 root  wheel   512 Oct  9 15:01 /var/named/etc/namedb/master
-rw-r--r--  1 root  wheel   621 Oct  9 21:46 /var/named/etc/namedb/master/localhost.rev
-rw-r--r--  1 root  wheel   597 Oct  9 21:46 /var/named/etc/namedb/master/localhost.zone
-rw-r--r--  1 root  wheel   581 Oct  9 15:41 /var/named/etc/namedb/master/named.bind
-rw-r--r--  1 root  wheel   562 Oct  9 21:47 /var/named/etc/namedb/master/named.broadcast
-rw-r--r--  1 root  wheel   562 Oct  9 21:47 /var/named/etc/namedb/master/named.network
-rw-r--r--  1 root  wheel  1516 Oct  9 15:44 /var/named/etc/namedb/master/named.root
-rw-r--r--  1 root  wheel  4468 Jun 12 07:46 /var/named/etc/namedb/named.conf
-rw-------  1 root  wheel   299 Oct 10 00:28 /var/named/etc/namedb/rndc.conf
-rw-r-----  1 root  bind    314 Oct  9 15:37 /var/named/etc/namedb/rndc.key
drwxr-xr-x  2 bind  wheel   512 Oct  9 21:57 /var/named/etc/namedb/slave
-rw-r--r--  1 bind  wheel   412 Jul  5 21:40 /var/named/etc/namedb/slave/bak.0.42.10.in-addr.arpa
-rw-r--r--  1 bind  wheel   718 Jul  5 22:37 /var/named/etc/namedb/slave/bak.42.168.192.in-addr.arpa
-rw-r--r--  1 bind  wheel   503 Jul  5 22:20 /var/named/etc/namedb/slave/bak.arda.homelinux.net.zone
-rw-r--r--  1 bind  wheel   796 Jul  5 21:48 /var/named/etc/namedb/slave/bak.arda.homeunix.net.zone
drwxr-xr-x  6 root  wheel  512 May  8 03:00 /var/named/var
drwxr-xr-x  2 bind  wheel  512 May  8 03:00 /var/named/var/dump
drwxr-xr-x  2 bind  wheel  512 Oct 11 06:47 /var/named/var/log
-rw-r--r--  1 bind  wheel  300465 Oct 11 18:24 /var/named/var/log/named.log
-rw-r--r--  1 bind  wheel  240046 Oct 11 18:30 /var/named/var/log/query.log
drwxr-xr-x  3 bind  wheel  512 May  8 03:00 /var/named/var/run
drwxr-xr-x  2 bind  wheel  512 Oct  9 21:54 /var/named/var/run/named
-rw-r--r--  1 bind  wheel  6 Oct  9 21:54 /var/named/var/run/named/pid
drwxr-xr-x  2 bind  wheel  512 May  8 03:00 /var/named/var/stats

Todos los archivos y dispositivos necesitaron correr BIND en jail, automaticamente aparecen cuando el named inicia. Revise la sección que describe el funcionamiento de BIND en chroot jail en Europa para una explicación sobre qué hacen estos archivos y dispositivos.

Scripts de Arranque

Para ejecutar BIND desde el arranque del sistema (system boot), inserte estas línea en /etc/rc.conf.

    named_enable=”YES”

Si realmente quiere que BIND ejecute chroot jail desde un directorio diferente, puede añadir esta línea en /etc/rc.conf:

    named_chrootdir=”/camino(path)/a su directorio/elegido”

Si decide hacer esto, recuerde copiar la estructura del directorio encontrado en /var/named a su chroot elegido, de otra manera toda esa automatización maravillosa que expliqué no trabajará.

Menciono eso porque FreeBSD configura BIND para trabajar como usuaria bind sin privilegios. ¿Si es así, Ud no necesita crear usuario o realizar configuraciones extra en named. No está mal, no?

DHCP

Cuando instalé DHCP en Europa, utilicé un tarball en lugar de un RPM porque quise aplicar un parche (patch) que permite a DHCP funcionar con privilegios reducidos y ser chrooted. Encontrará un enlace (link) a este parche en la sección Sitios de interés en el final de este documento. Este parche se llama “dhcp-3.0+paranoia”. Para utilizar este parche, necesita pasar algunas opciones en configure cuando compile DHCP, no se olvide de leer los comentarios al inicio del archivo. Aquí estan las opciones que utilicé cuando compilé DHCP:

./configure --copts "-DPARANOIA"

Archivos de Configuración

Aquí está mi my dhcpd.conf:

# DHCP Daemon configuration file

authoritative;

max-lease-time 86400;
default-lease-time 14400;
ddns-update-style interim;
ddns-ttl 14400;

subnet 192.168.10.0 netmask 255.255.255.224 {
    range 192.168.10.24 192.168.10.30;

    # don't let clients modify their own A records
    ignore client-updates;

    # options
    option subnet-mask 255.255.255.224;
    option broadcast-address 192.168.10.31;

    option domain-name "arda.homeunix.net";
    option domain-name-servers 192.168.10.9, 192.168.10.5;
    option routers 192.168.10.1;

    option ntp-servers 192.168.10.1;

    option netbios-scope "";
    option netbios-node-type 8;
    option netbios-name-servers 192.168.10.9;
    option netbios-dd-server 192.168.10.9;

    # dynamic DNS updates
    ddns-updates on;
    ddns-domainname "arda.homeunix.net.";
    ddns-rev-domainname "in-addr.arpa.";

    key "europa-dhcp" {
        algorithm       hmac-md5;
        secret
        "<europa-dhcp key goes here>";
    };

    zone arda.homeunix.net {
        primary 192.168.10.9;
        key "europa-dhcp";
    }

    zone 10.168.192.in-addr.arpa {
        primary 192.168.10.9;
        key "europa-dhcp";
    }

}

El archivo dhcpd.conf provee toda la información que será entregada al cliente DHCP y también controla la actualización dinámica con el servidor DNS. Varios puntos en referencia a este archivo:

  • Estoy utilizando CIDR network. Esto suena razonable únicamente teniendo en cuenta el número pequeño de máquinas que tengo funcionamiento. El tamaño de la red (32 direcciones IP comenzando con 192.168.10.0) es especificado en las líneas de subnet y netmask. Cerciórese que las instrucciones subnet mask y broadcast-address correspondan, de otra manera su red va a ser muy confusa. Puede calcular todos los parámetros de red que se necesitan para instalar una red CIDR con mi página IP Addressing for CIDR Networks.
  • Los parámetros del ddns-* controlan las actualizaciones dinámicas entre DHCP y BIND. Esté seguro del valor correcto de ddns-update-style. El parámetro acepta diversos valores pero no todos trabajan y son muy sensibles a la versión de DHCP y BIND que Ud. utilice. Utilicé “ad-hoc” en este parámetro pero cuando actualicé a mi actual configuración necesité cambiarlo a“interim”.
  • Interim update style permite que los clientes de DHCP pongan al día sus propios registros A elegidos por ellos. Quiero controlar todas las actualizaciones a mi servidor DNS que vengan de mi servidor DHCP, para ello añadí ignore client-updates a mi archivo dhcpd.conf.
  • Todas las opciones de netbios-* entregan información a los clientes de Windows. Estas opciones permiten a mis clientes de Windows acceder a la red y compartir archivos (shares) desde mi servidor Samba.
  • La clave TSIG europa-dhcpd a la que se hace referencia en el archivo de configuración es la misma clave que aparece en el archivo rndc.key en Europa.

Ejecución de DHCP Chrooted

Igual que BIND, ejecuté DHCP con privilegios reducidos y en chroot jail. El proceso para hacerlo es similar al que hice para BIND, pero hay algunas diferencias. Aquí está cómo instalé DHCP para que funcione desde el directorio /etc/dhcpdb:

  1. Lo primero es crear el usuario y grupo dhcpd. A diferencia de BIND, hice esto manualmente. Elegí el conocido y enteramente fiable nombre ‘dhcpd’ tanto para el usuario como para el grupo.
  2. Necesité agregar directorios y archivos a /etc/dhcpdb. Así es como quedó una vez que terminé:
    drwxr-xr-x    2 root     root         1024 Jul 17 10:12 /etc/dhcpdb/dev/
    crw-rw-rw-    1 root     root       1,   3 Jul 17 22:06 /etc/dhcpdb/dev/null
    crw-r--r--    1 root     root       1,   8 Jul 17 22:07 /etc/dhcpdb/dev/random
    drwxr-xr-x    2 root     root         1024 Jul 17 15:32 /etc/dhcpdb/etc/
    -rw-r--r--    1 root     root         1218 Jul 17 15:32 /etc/dhcpdb/etc/localtime
    drwxr-xr-x    4 root     root         1024 Jul 17 10:02 /etc/dhcpdb/var/
    drwxr-xr-x    2 dhcpd    dhcpd        1024 Jul 17 15:40 /etc/dhcpdb/var/run/
    drwxr-xr-x    3 root     root         1024 Jul 17 10:09 /etc/dhcpdb/var/state/
    drwxr-x---    2 dhcpd    dhcpd        1024 Jul 18 11:31 /etc/dhcpdb/var/state/dhcp/
    • El directorio var/run está donde el archivo pid puede ubicarse.
    • Crear el archivo especial dev/null utilizando el comando ‘mknod /etc/dhcpd/dev/null c 1 3′.
    • Crear el archivo especial dev/random utilizando el comando ‘mknod /etc/dhcpd/dev/random c 1 8′.
    • Igual que en BIND, el mayor y menor números para null y random son los mismos que sus correspondientes archivos ubicados en /dev. No conozco si estos archivos son necesarios para que DHCP se ejecute como chrooted, dhcpd no se complica cuando se inicia sin la presencia de estos archivos especiales. Los puse allí más por seguridad que por otra cosa.
    • El archivo etc/localtime fue copiado de /etc. Este archivo nos asegura que DHCP utilice la zona de tiempo adecuada cuando envíe los mensajes a syslog.
    • El directorio var/run es de propiedad de dhcpd:dhcpd. Esto es porque el archivo pid es escrito después que dhcpd ha perdido sus privilegios.
  1. Necesité dar a DHCP una manera de enviar mensajes al syslog desde chroot jail. Para lograr esto modifiqué una línea en el archivo /etc/sysconfig/:
        SYSLOGD_OPTIONS=”-m 0″
            se convirtió en:
      SYSLOGD_OPTIONS=”-m 0 -a /etc/dhcpdb/dev/log”

    Parar e iniciar syslog causará que un nuevo zócalo de syslog aparezca en /etc/dhcpdb/dev.

  2. Note que el archivo de configuración de dhcpd no está en jail. Está ubicado en /etc. Aquí están las características de este archivo:
    	-rw-------    1 root     root         1225 Jul 17 10:51 /etc/dhcpd.conf

    El parche de dhcp-3.0+paranoia pide al dhcpd que lea dhcpd.conf antes de que pierda privilegios e invoque a chroot jail, esto porque el archivo es propiedad de root y se localiza fuera de jail. Fijé restricciones a los permisos de este archivo porque contiene las claves TSIG utilizadas para la actualización dinámica de BIND. Con la propiedad y permisos sobre este archivo con esta particular forma previene que el demonio pueda modificarlo mientras lo lee en el arranque. Solamente un proceso con privilegios de root (probablemente un sysadmin entrado como root) puedan modificar este archivo.

Scripts de Arranque

No sólo ejecuto, especifico el usuario, grupo y chroot jail en el arranque de DHCP, también especifico la interfaz particular DHCP que escucha las peticiones. Aquí está mi script de arranque /etc/rc.d/init.d/dhcpd. Modifiqué este archivo, algo problemático, para que DHCP se ejecute en chrooted.

#!/bin/bash
#
# dhcpd           This shell script takes care of starting and stopping
#                 dhcpd (dynamic boot parameter server).
#
# chkconfig: 345 55 45
# description: dhcpd dynamically assigned network \
# parameters to clients at boot time.
# probe: true

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 0

#[ -f /etc/sysconfig/named ] && . /etc/sysconfig/named

[ -f /usr/sbin/dhcpd ] || exit 0

# set the chroot directory
chrootdir="/etc/dhcpdb"

[ -f /etc/dhcpd.conf ] || exit 0

RETVAL=0
prog="dhcpd"

start() {
        # Start daemons.
        gprintf "Starting %s: " $prog
        daemon $prog -q -user dhcpd -group dhcpd -chroot $chrootdir eth0
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dhcpd
        echo
        return $RETVAL
}
stop() {
        # Stop daemons.
        gprintf "Stopping %s: " $prog
        pid=`pidofproc $prog`
        kill -TERM $pid
        RETVAL=$?
        [ $RETVAL -eq 0 ] && success "dhcpd shutdown" || failure "dhcpd shutdown"
        [ $RETVAL -eq 0 ] && rm -f $chrootdir/var/run/dhcpd.pid
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/dhcpd
        echo
        return $RETVAL
}
status() {
        status dhcpd
}
restart() {
        stop
        start
}
reload() {
        stop
        start
}

# See how we were called.
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        status)
                status
                ;;
        restart)
                restart
                ;;
        condrestart)
                [ -f /var/lock/subsys/dhcpd ] && restart
                ;;
        reload)
                reload
                ;;
        *)
                gprintf "Usage: %s {start|stop|status|restart|condrestart|reload}\n" $0
                exit 1
esac

exit $?

Sitios de interés

BIND
DHCP
http://www.isc.org/
dhcp-3.0+paranoia.patch http://www.episec.com/people/edelkind/patches/

Lecturas adicionales

Bind9.net – Una muy buena fuente de información sobre DNS y DHCP http://www.bind9.net/
DNS Página del Grupo Webstart – Enlaces a información sobre DNS http://www.the-paynes.com/DNS/
Configuración del DNS y localización de errores – Desarrolla la versión 8 de BIND http://www.troubleshooters.com/linux/dns.htm
Compilación y ejecución de BIND 9 http://www.unixwiz.net/techtips/bind9-chroot.html
Plantillas seguras de BIND http://www.cymru.com/Documents/secure-bind-template.html