jueves, 3 de mayo de 2012

Servidor DNS con BIND en CENTOS 5.7


A pedido de un amigo, les doy una ayuda con la configuracion del servidor DNS con BIND en Centos 5.7.

Basicamente un servidor de DNS es aquel que resuleve los nombres en una red, esto ayuda bastante cuando tienes una red LAN con servidores y necesitas que los usuarios de la red accedan a los diferentes sistemas de dichos servidores.

BIND DNS es uno de los servidores mas utilizados a nivel mundial, el DNS de Google (8.8.8.8) esta en BIND, al ser un servidor opensource es bastante accesible para utilizar practicar y entender como trabaja el servicio de resolución de nombres de domnio (DNS).

Los componentes basicos de un servidor DNS son 3:

- Dominio (Nombre de dominio de la red)
- Servidor DNS (equipo que aloja el servicio DNS y las listas de nombres e IP's, pertenecientes al dominio)
- Cliente DNS (equipos de la red que realicen peticiones al servidor DNS)


Basicamente el funcionamiento es el siguiente:




El cliente DNS (equipo de trabajo) ingresa a traves de su navegador al sistema Contabilidad, esta peticion se envia al servidor DNS el cual revisa sus tablas de nombres y encuentra que Contabilidad pertenece al dominio ejemplo.net y tiene la dirección 192.168.1.10, el servidor envia esta información al cliente DNS y este envia la peticion al servidor con la dirección 192.168.1.10.

Para configurar el servidor BIND en un servidor con Centos 5.7 o Red Hat 6 los pasos basicos a seguir son:

Instalacion de BIND en el servidor

Lo mas facil es instalarlo mediante YUM.

yum -y install bind bind-chroot caching-nameserver

Una vez instalado el BIND necesitamos configurar nuestras dos zonas necesarias, la del dominio y la del dominio inverso, para ello creamos un nuevo directorio llamado dynamics donde se guardaran nuestras dos zonas.

mkdir /var/named/chroot/var/named/dynamics 

Asignamos permisos de lectura, escritura y ejecución para el usuario y grupo named (770).

chmod 770 dynamics/
chown named.named dynamics/

Creamos nuestra primera zona (dominio ejemplo.net) dentro del directorio dynamics y despues lo editamos.

touch /var/named/chroot/var/named/dynamics/ejemplo.net.zone
vim /var/named/chroot/var/named/dynamics/ejemplo.net.zone 

Dentro del archivo ejemplo.net.zone escribimos los parametros basicos de la zona.

$TTL 86400
@               IN      SOA     dns1.ejemplo.net.      root.ejemplo.net. (
               2009081501 ; número de serie
               28800 ; tiempo necesario para el refresco de la tabla
               7200 ; tiempo necesario entre reintentos
               604800 ; tiempo que la zona expira si deja de resolver
               86400 ; tiempo total de vida (1 día)
               )
@              IN      NS      dns1.ejemplo.net.
@              IN      A       192.168.1.2
dns1           IN      A       192.168.1.2


Donde lo principal es definir la entrada del servidor DNS, que en nuestro caso es el equipo dns1.ejemplo.net, colocamos su traducción indicando que su dirección es la 192.168.1.2.

Guardamos la configuracion (esc :x enter) y continuamos con la creacion de nuestra segunda zona (zona inversa), para ello creamos el archivo dentro del directorio /dynamics y lo editamos.

touch /var/named/chroot/var/named/dynamics/1.168.192.in-addr.arpa.zone
vi /var/named/chroot/var/named/dynamics/1.168.192.in-addr.arpa.zone

Dentro del archivo escribimos los parametros basicos de la zona inversa.

$TTL 86400
@               IN      SOA     dns1.ejemplo.net.      root.ejemplo.net. (
               2009081501 ; número de serie
               28800 ; tiempo necesario para el refresco de la tabla
               7200 ; tiempo necesario entre reintentos
               604800 ; tiempo que la zona expira si deja de resolver
               86400 ; tiempo total de vida (1 día)
               )
@              IN      NS      dns1.ejemplo.net.
1              IN      PTR     proxy.ejemplo.net.

De la misma forma lo principal es indicar cual es nuestro servidor principal que en nuestro caso es dns1.ejemplo.net y colcamos los datos de la resolucion inversa para nuestra red.

Ahora asignamos permisos a ambos archivos:

cd /var/named/chroot/var/named/dynamics/
chown named:named ejemplo.net.zone
chown named:named 1.168.192.in-addr.arpa.zone
chcon -u system_u -r object_r -t named_zone_t ejemplo.net.zone 
chcon -u system_u -r object_r -t named_zone_t 1.168.192.in-addr.arpa.zone

Con nuestras zonas creadas y con permisos asignados, lo ultimo que nos queda es crear y editar nuestro archivo named.conf, que es el servidor DNS en si.

touch /var/named/chroot/etc/named.conf
vim /var/named/chroot/etc/named.conf

Dentro del archivo named.conf escribimos la configuracion basica del servidor DNS.

acl "ejemplo" {
               127.0.0.1/32;
               192.168.1.0/24;
               };
options {
        directory "/var/named";
        dump-file "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-recursion { red-local; };
        allow-query  { red-local; };
        forwarders { 8.8.8.8; 4.2.2.2;};
        forward first;
};

include "/etc/named.rfc1912.zones";
include "/etc/rndc.key";

zone "ejemplo.net" {
        type master;
        file "/var/named/dynamics/ejemplo.net.zone";
        allow-update { key "rndckey"; };
};
zone "1.168.192.in-addr.arpa" {
        type master;
        file "/var/named/dynamics/1.168.192.in-addr.arpa.zone";
        allow-update { key "rndckey"; };
};

Donde lo primero que realizamos es la creación de una lista de acceso llamada "ejemplo" (nombre del dominio, si el dominio fuera ejemplo.com.bo, la lista seria ejemplo.com) dentro de la lista de acceso definimos cuales son las subredes que pertenecen a este dominio, en este caso la interfaz del servidor 127.0.0.1/32 y la subred 192.168.1.0/24.
En forwarders indicamos al servidor donde realizar las consultas de direcciones que no conozca, en nuestro caso colocamos los DNS de Google (8.8.8.8) y de Sprint (4.2.2.2), finalmente indicamos al servidor la locacion de nuestros archivos de zonas.

Salimos de la configuracion (Esc :x enter) e iniciamos nuestro servidor DNS, cuyo servicio es named.

service named start

Si el servidor no nos indica ningun error, podemos configurar nuevas entradas en las zonas.

vim /var/named/chroot/var/named/dynamics/ejemplo.net.zone

$TTL 86400
@               IN      SOA     dns1.ejemplo.net.      root.ejemplo.net. (
               2009081501 ; número de serie
               28800 ; tiempo necesario para el refresco de la tabla
               7200 ; tiempo necesario entre reintentos
               604800 ; tiempo que la zona expira si deja de resolver
               86400 ; tiempo total de vida (1 día)
               )
@              IN      NS      dns1.ejemplo.net.
@              IN      A       192.168.1.2
dns1           IN      A       192.168.1.2
Contabilidad.ejemplo.net       IN      A       192.168.1.10 

Guardamos y salimos (Esc :x Enter).

Para comprobar si el servidor esta resolviendo los nombres correctamente, podemos realizar un ping desde el servidor a nuestro mismo nombre.

ping dns1

Si el servidor funciona correctamente nos entregara la siguiente respuesta.

PING dns1.ejemplo.net (192.168.1.2) 56(84) bytes of data.
64 bytes from dns1.ejemplo.net (192.168.1.2): icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from dns1.ejemplo.net (192.168.1.2): icmp_seq=2 ttl=64 time=0.024 ms
64 bytes from dns1.ejemplo.net (192.168.1.2): icmp_seq=3 ttl=64 time=0.045 ms
64 bytes from dns1.ejemplo.net (192.168.1.2): icmp_seq=4 ttl=64 time=0.021 ms
64 bytes from dns1.ejemplo.net (192.168.1.2): icmp_seq=5 ttl=64 time=0.033 ms

Probamos con nuestro servidor Contabilidad.ejemplo.net

ping Contabilidad

PING Contabilidad.ejemplo.net(192.168.1.10) 56(84) bytes of data.
64 bytes from Contabilidad.ejemplo.net (192.168.1.10): icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from Contabilidad.ejemplo.net (192.168.1.10): icmp_seq=2 ttl=64 time=0.022 ms
64 bytes from Contabilidad.ejemplo.net (192.168.1.10): icmp_seq=3 ttl=64 time=0.034 ms
64 bytes from Contabilidad.ejemplo.net (192.168.1.10): icmp_seq=4 ttl=64 time=0.021 ms
64 bytes from Contabilidad.ejemplo.net (192.168.1.10): icmp_seq=5 ttl=64 time=0.038
ms

Con esto comprobamos que nuestro servidor DNS con BIND se ha configurado correctamente, configuramos el servicio named para que arranque con el sistema.

chkconfig named on

Por ultimo verificamos que nuestro puerto 53 (DNS) este habilitado en las reglas del servidor para esponder a peticiones de otras maquinas.

service iptables status

Verificamos en la cadena INPUT (Chain INPUT) que el puerto 53 este permitido.

Tabla: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080
3    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:123
4    ACCEPT     udp  --  200.160.7.186        0.0.0.0/0           udp dpt:123
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3128
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:10000
7    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Como en nuestro caso no esta permitido, lo habilitamos, pero solamente permitimos que reciba peticiones en la interfaz de la LAN (nuestro caso toma en cuenta un servidor con salida a internet).

iptables -I INPUT -i eth0 -p udp --dport 53 -j ACCEPT
 
Verificamos que el puerto aparezca en nuestra cadena INPUT.

Tabla: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080
3    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:123
4    ACCEPT     udp  --  200.160.7.186        0.0.0.0/0           udp dpt:123
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3128
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:10000
7    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Guardamos la configuración de nuestras Iptables.

service iptables save

Y finalmente reiniciamos todos los servicios modificados.

service iptables restart
service network restart
service named restart

Una vez que todo inicia sin ningun error, podemos comprobar que el servidor responde a peticiones desde la LAN, realizando un ping desde un equipo en la red local.

ping Contabilidad

PING Contabilidad.ejemplo.net(192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_seq=1 ttl=32 time=0.125 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=32 time=0.092 ms
64 bytes from 192.168.1.10: icmp_seq=3 ttl=32 time=0.044 ms
64 bytes from 192.168.1.10: icmp_seq=4 ttl=32 time=0.011 ms

Con esto tenemos un servidor DNS funcional.

No hay comentarios:

Publicar un comentario