Contents
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:
- Utilizar el rndc para parar BIND.
- Borrar cualquier archivo .jnl del directorio de zona.
- Editar los archivos de zona cuanto sea necesario. Cerciorarse de incrementar el número de serie de cualquier archivo corregido.
- 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.
- La primera cosa a hacer era decidir donde poner todo. Decidí crear el directorio /etc/namedb que se convirtió en raíz de BIND.
- 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.
- 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.
- 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:
- 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.
- 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.
- 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.
- 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 |