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
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
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).
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
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
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.