viernes, 6 de abril de 2012

Instalar un servidor DNS doméstico en Debian GNU/Linux

Hola a todos,

Hoy os quiero contar cómo instalar un servidor DNS doméstico en nuestro sistema Debian GNU/Linux. Algunos os preguntaréis, ¿para qué diablos quiero un servidor DNS en mi red local? Muy buena pregunta, por cierto ;-)

La respuesta es sencilla. Se trata de tener en nuestra red local la facultad de acceder a nuestros equipos mediante su nombre de red en lugar de su dirección IP local, y cuando digo equipos, me refiero a todo aquel dispositivo que pueda conectarse a Internet a través de nuestra red local, como un ordenador, un móvil, un tablet, una televisión, una consola de videojuegos, una impresora, etc.

Cada vez es más común entre nosotros tener varios equipos interconectados entre sí, más aún si disponemos de un ordenador en el que alojamos todos nuestros datos, y habitualmente conectamos nuestro smartphone, tablet u ordenador portátil a este ordenador para enviar o recibir datos de cualquier tipo, como por ejemplo música o vídeos.

Bueno, pero ¿qué es un servidor DNS? En muy pocas palabras, es un servidor que traduce o resuelve direcciones IP, muy difíciles de aprender para las personas, en nombres de red fáciles de recordar.

Bien, ¿qué ventajas puede aportarnos tener un servidor DNS en nuestra red local? De entre todas las que hay, mi favorita es la comodidad de no tener que aprenderme las direcciones IP de todos mis dispositivos conectados, que a día de hoy no son pocos.

Además, nuestro servidor DNS podrá resolver direcciones IP que no pertenezcan a nuestra red local, pudiendo resolver también las direcciones IP de Internet, por tanto podremos utilizar este servidor DNS como DNS principal en todos nuestros equipos. Cuando un cliente haga una consulta de DNS, este la resolverá por sí solo si conoce el nombre por el que se le ha preguntado, y si no lo conoce entonces redirigirá la consulta a otro servidor que sí lo conozca.

El servidor DNS que vamos a montar está fuertemente enfocado a ser utilizado en un entorno doméstico, pero su configuración es perfectamente extrapolable a cualquier entorno de más envergadura.

No obstante debemos de tener en cuenta algo importante para la implementación del servidor DNS. Debe quedar claro que el servidor DNS no asigna direcciones IP a los dispositivos que se conectan, de eso se encarga un servidor DHCP como el que incorporan los routers de las ADSL o el propio servidor DHCP del sistema operativo, en caso de que tengamos uno. Nuestro servidor DNS no será más que una base de datos a la que nuestros equipos le preguntarán de forma transparente al usuario la dirección IP que corresponde a un equipo en concreto.

Por tanto, y dado que lo habitual es que tengamos un servidor DHCP activado en nuestra red local, creo que el problema se ve por sí solo. Si el servidor DHCP asigna a un dispositivo una dirección IP distinta a la que tenemos registrada, algo muy frencuente si tenemos más de un equipo conectado, nuestro servidor DNS no conocerá la nueva dirección IP, y cada vez que le pregunten por esa dirección, él ofrecerá la anterior, y por tanto, la incorrecta.

Así pues, queda patente que cada dispositivo conectado siempre debe tener la misma IP. ¿De qué forma se consigue esto? Bien, que yo conozca hay dos.

La primera de ellas es configurar nuestro servidor DHCP para que asigne siempre las mismas direcciones IP a los mismos dispositivos. Todo servidor DHCP incorpora la función de hacer reservas de direcciones IP. Esto es posible gracias a la dirección física de la tarjeta de red del dispositivo que se conecta, o la dirección MAC como se le llama oficialmente. Esto es, configuramos el servidor DHCP de forma que a cada dirección física se le asigne siempre la misma dirección IP. Por tanto, si es tu forma elegida, no tienes más que acceder a la configuración de tu router y configurar el servidor DHCP para que haga reservas de direcciones IP asociadas a las direcciones físicas de tus dispositivos. Sin duda alguna, esta es la forma recomendada para cualquier usuario.

Sin embargo, y dado que debo tener inclinaciones masoquistas (xD) yo he escogido la segunda opción. Ni más ni menos, esta opción consta de prescindir totalmente de un servidor DHCP. ¿Cómo nos conectamos entonces a nuestra red? Sencillo, estableciendo manualmente las direcciones IP en cada uno de los dispositivos que se conectan. Antes de que me acribilléis, dejad que me explique ;-)

Es cierto que puede ser tedioso establecer manualmente las direcciones IP, pero pensad que esto nos ofrece un elemento de seguridad adicional si tenemos una red inalámbrica. Si por alguna de aquellas alguien consiguiera colarse en nuestra red inalámbrica, nuestro servidor DHCP le ofrecería en bandeja la llave de acceso a nuestra red, ya que le estaría proporcionando una dirección IP para conectarse. Al no haber servidor DHCP, digamos que se lo ponemos un poquíto más difícil. A todo esto, es evidente que para que esto funcionara, el rango de direcciones de nuestra red local tendría que ser distinto al que proporciona el router por defecto, pero eso es otra historia ;-)

No obstante, reconozco que soy un poco paranoico en lo que a seguridad y control se refiere. Sin la menor duda, yo os recomiendo usar el primer método, que es de lejos el más cómodo.

Una vez claros los términos, nos ponemos manos a la obra.

En GNU/Linux tenemos disponible el más famoso y utilizado de todos los servidores DNS, Bind. En nuestro sistema Debian GNU/Linux y derivados, lo instalaremos así:

$ sudo aptitude install bind9

Una vez instalado, procederemos a configurar las zonas de autoridad que va a gestionar nuestro servidor. Para ello modificamos el siguiente fichero:

$ sudo nano /etc/bind/named.conf.local

En este fichero vamos a añadir dos zonas, una para la resolución directa y otra para la resolución inversa. La zona de resolución directa vendrá determinada por el nombre de zona, que puede ser uno de nuestra invención, en mi caso es casita.com. La zona de resolución inversa será la que nos permitirá traducir direcciones IP en nombres de red, algo muy útil en determinadas ocasiones. Esta zona vendrá determinada por el rango de direcciones IP de nuestra red local.

Así pues, añadimos ambas zonas al fichero de la forma en que os muestro aquí:

zone "casita.com" {
      type master;
      file "/etc/bind/zones/db.casita.com";
      };

zone "10.168.192.in-addr.arpa" {
      type master;
      file "/etc/bind/zones/rev.10.168.192.in-addr.arpa";
      };


He marcado en negrita lo que debemos modificar personalmente con nuestros propios datos, concretamente el nombre de la zona (casita.com), el rango de direcciones IP y los ficheros asociados. En mi caso el rango es 192.168.10.x, pero como podéis ver debe ponerse de forma inversa y omitiendo el último dígito.

La cosa debería quedar como esto:


Bien, ahora debemos crear los dos archivos a los que hacemos referencia en el fichero anterior.

$ cd /etc/bind/
$ sudo mkdir zones
$ sudo cp db.local zones/db.casita.com
$ sudo cp db.127 zones/rev.10.168.192.in-addr.arpa

Ahora vamos a modificar el primer fichero creado:

$ cd zones/
$ sudo nano db.casita.com

En este fichero añadiremos la lista de todos nuestros dispositivos con sus respectivas direcciones IP, haciendo las modificaciones pertinentes.

Primero modificaremos el campo SOA (Start of Authority) que hace referencia al servidor de nombres con autoridad en la zona y a la cuenta de correo del administrador encargado de administrarla, donde la arroba es reemplazada por un punto. Así pues nosotros dejaremos la línea relativa al campo SOA como sigue, prestando especial atención a no borrar los puntos finales:

@      IN      SOA      casita.com.      root.casita.com. (

Después modificaremos el campo NS que hace referencia al servidor de nombres de la zona. Por tanto dejaremos la línea así, sin olvidar también el punto del final:

@      IN      NS      ekipotonety.casita.com.

Y después ya podremos añadir los registros A (de dirección) que se corresponderán con los dispositivos conectados a nuestra red, como primer ejemplo el mismo ordenador que hace de servidor DNS:

ekipotonety      IN      A      192.168.10.2

Al añadirlos todos, el fichero debería quedar similar a este:


Ahora vamos a modificar el fichero de resolución inversa:

$ sudo nano rev.10.168.192.in-addr.arpa

Este fichero tiene la misma estructura que el anterior, por tanto debemos modificar prácticamente las mismas cosas, empezando por el registro SOA y el registro NS, dejándolos exactamente igual que en el fichero anterior.

Lo que cambia en este fichero es que en vez de utilizar registros A utilizaremos registros PTR para resolver las direcciones IP en nombres de dominio. Así pues, para el primer registro PTR, que coincidirá también con el propio servidor DNS, añadiremos la siguiente línea:

2      IN      PTR      ekipotonety.

Nótese que en la primera columna hemos puesto el último dígito de la dirección IP de ese equipo. En este caso, puesto que el ordenador llamado ekipotonety tiene la dirección IP 192.168.10.2, pondremos el número 2 por ser el último dígito. Y además no debemos olvidarnos de los puntos que hay al final de cada nombre de host. 

Cuando terminemos, nuestro fichero quedaría más o menos así:


Bien, con esto ya tenemos definidas las dos zonas. Ahora vamos a modificar nuestro servidor DNS para que redirija las peticiones a otro servidor DNS cuando no pueda resolver una petición. 

Para ello modificamos el siguiente archivo:

$ sudo nano /etc/bind/named.conf.options

Añadiremos pues los servidores DNS que nos interesen, ya sea los que nos proporciona nuestro ISP u otros cualesquiera, como por ejemplo los de Google o los de OpenDNS. En mi caso prefiero los de OpenDNS:

forwarders {
      208.67.222.222;
      208.67.220.220;
};


Y el fichero, una vez completado, quedaría así:


Por último, reiniciaremos el servicio bind9 para hacer efectivas las modificaciones que hemos hecho:

$ sudo /etc/init.d/bind9 restart

Con esto habremos terminado de configurar el servidor DNS propiamente dicho. Ahora nos queda configurar los equipos que se conectan a nuestra red para que hagan uso de este servidor DNS.

Empecemos por configurar el ordenador que hace de servidor DNS. Es evidente que su configuración dependerá del modo en que esté gestionada la conexión de red, pero en esencia será similar para todos. 

Si usamos un gestor de redes gráfico como por ejemplo Network Manager o Wicd, lo único que tendremos que cambiar es el servidor DNS de la conexión que estemos usando, sustituyendo la dirección del DNS por la de nuestro servidor:


En este caso, como el ordenador que estamos configurando es a la vez el propio servidor DNS, se establece que para consultas DNS se pregunte a sí mismo. Por tanto redirigimos las consultas DNS a la dirección 127.0.0.1.

Y para el resto de equipos que se conecten a nuestra red haremos lo mismo pero cambiando la dirección del DNS por la que tendrá nuestro servidor en la red, en este caso 192.168.10.2.

Si por el contrario no usamos un gestor de redes gráfico, tendremos que modificar el fichero /etc/resolv.conf añadiendo la línea nameserver 192.168.10.2, cambiando la dirección IP del DNS por la que corresponda en nuestro caso.


Con esto ya tendremos configurado nuestro servidor DNS doméstico. Ahora sólo nos queda probar que funciona. Para ello podemos, por ejemplo, consultar la dirección IP de nuestro servidor DNS desde el propio servidor o desde cualquier otro equipo conectado a la red y configurado adecuadamente para que haga uso del servidor DNS:

$ host ekipotonety.casita.com
ekipotonety.casita.com has address 192.168.10.2

Nótese que  para hacer la consulta debemos usar el nombre completo, es decir, el nombre de host seguido del dominio.

Podemos por ejemplo solicitar la dirección IP de nuestro smartphone:

$ host movil.casita.com
movil.casita.com has address 192.168.10.4

Y para probar la resolución inversa, podemos proceder así:

$ host 192.168.10.2
2.10.168.192.in-addr.arpa domain name pointer ekipotonety.

$ host 192.168.10.4
4.10.168.192 in-addr.arpa domain name pointer movil.

Como vemos, el servidor DNS nos resuelve tanto la consulta directa como la inversa, esto demuestra que funciona perfectamente.

Con nuestro servidor DNS funcionando ya podemos hacer uso de él en los demás dispositivos que se conecten a la red, de tal forma que exista resolución interna de nombres y la navegación por la web vaya considerablemente más fluida.

Además, cada vez que queramos acceder a un dispositivo de nuestra red podremos hacerlo a través de su nombre completo, por ejemplo cuando queramos montar un recurso Samba o NFS, o conectarnos a un servidor SSH, por ejemplo.

Así que, sin más que añadir, me despido con un saludo.

34 comentarios:

  1. Muchas gracias por el tutorial, de a poco voy sumando conocimientos gracias a personas que hacen buenos tutoriales como el tuyo!!! ;) Saludos desde Buenos Aires.

    ResponderEliminar
  2. Muchas gracias a vosotros por vuestra visita y comentarios.

    Saludetes ;-)

    ResponderEliminar
    Respuestas
    1. Una Pregunta Tony, si tu servidor DNS solo hace la resolución inversa y no la resolución directa, ¿qué es lo primero que revisas?
      He revisado los nombres de los archivos, los puntos, los nombres que sean correctos y nada hace que haga la resolución directa.
      Gracias por la ayuda....

      Eliminar
  3. Muchisimas gracias, es lo mejor que e encontrado, todo muy bien explicado
    gracias!!!!

    ResponderEliminar
  4. Muchas gracias me sirvió mucho!!! ;)

    ResponderEliminar
  5. Muchas gracias muy bueno, a ver si haces otro igual de claro que este pero con un servidor dhcp, y te hago un monumento xD

    ResponderEliminar
  6. @Anónimo:

    Jeje muchísimas gracias compañero ;-p

    ResponderEliminar
  7. excelente, tengo una red en DEBIAN squeeze con dos servers WEB y estaba buscando algo asi para no depender de los DNS de los proveedores de INTERNET, en este caso tambien es aplicable a esto?

    Muchas Gracias

    ResponderEliminar
  8. Tras dos días de busquedas por blogs, gracias a tu articulo he podido configurar correctamente las DNS. Y ademas esta perfectamente explicado.
    Enhorabuena!

    ResponderEliminar
  9. Muchísimas gracias a todos por vuestras palabras, es un placer poder ayudaros :-)

    @Andres: sí que es aplicable, pero posiblemente el servidor DNS propio no sea capaz de resolver algunas peticiones, por lo que en ese caso deberás recurrir a otro servidor DNS externo mediante los fordwarders.

    ResponderEliminar
  10. Muchas gracia esta muy bien quisiara preguntarte sia hay alguna forma de hacer lo siguiente, supongamos que el dhcp de direcciones dinamica como se puede configurar el dns para que actualice los registro que lleva de los host.

    ResponderEliminar
    Respuestas
    1. http://laesa.com.ar/2012/01/24/configuracion-de-servidor-dhcp-en-ubuntudebian-server/

      Eliminar
    2. http://laesa.com.ar/2012/01/24/configurar-un-servidor-dns-con-bind9-en-ubuntu-server-yo-debian-server/

      Eliminar
  11. Esta muy estatico este servidor DNS, no podrá ser muy util en una red local con crecimiento de host

    ResponderEliminar
  12. Tan bueno que nos lo pusieron de enlace en el instituto !

    ResponderEliminar
    Respuestas
    1. Ala, ¿va en serio? Que fuerte xDD ¿Qué instituto, por cierto?

      Un saludo compañero, y gracias por comentar ;)

      Eliminar
  13. Buenas, tengo una duda: donde tu pones ekipotonety que tengo que poner el nombre del hostname¿?

    esque cuando ago host ....... me sale: host dns not found 3(nxdomain)
    eh comprovado 1000 veces los arxivos de configuracion i los tengo correctos! porfa necessito ayudaa rapidaa!

    Gracias

    ResponderEliminar
    Respuestas
    1. @Omar,

      En mi caso, ekipotonety es el nombre de host que yo le he dado a mi ordenador principal, que a su vez hace de servidor DNS. No es más que el nombre con el que identificas a cada equipo conectado a la red, y que no es necesario que coincida con el nombre real del equipo (aquel que aparece cuando escribimos el comando hostname).

      Por tanto, cuando tú preguntas al servidor DNS por la dirección de un equipo, lo haces con el comando host más el nombre completo del equipo, es decir, el nombre de host más el dominio que hayas establecido en el servidor DNS, en mi caso, casita.com.

      Así que en tu caso, tienes que comprobar que el nombre de host por el que preguntas esté registrado en el fichero principal de registros de dirección.

      Un saludo compañero.

      Eliminar
  14. Tony, felicitaciones... tu blog verdaderamente es algo genial!

    ResponderEliminar
  15. buen tutorial, confundido en configurar el resolv.conf con la ip de consulta pero resuelto... desde Caracas, Venezuela

    ResponderEliminar
  16. Bastante bueno este post, en las ayudas por lo general siempre es confuso lo de las zonas de seguridad y todo eso, pero aquí se entiende bien y concreto, recomiendenlo...

    ResponderEliminar
  17. Muchísimas gracias a todos de corazón :)

    ResponderEliminar
  18. Excelente tutorial yo tengo instalado en casa un Servidor DNS (bind9) en casa en una pc antigua (IBM netvista / Intel Pentium III 933 MHz, 128mb Ram y 15Gb disco duro) que esta con debian 7 sin entorno gráfico, para esto me he guiado de un tutorial encontrado en la red.

    http://www.forat.info/2011/10/03/como-montar-un-servidor-dns-servidor-local-vol-3/

    mi configuración es la siguiente en: /etc/network/interfaces

    auto lo
    iface lo inet loopback

    auto br0
    iface br0 inet static
    address 192.168.100.10 #IP estatico del servidor
    netmask 255.255.255.0
    gateway 192.168.100.1 #IP de mi router (NSLocoM5)
    network 192.168.100.0
    broadcast 192.168.100.255
    bridge_ports eth0 eth1
    bridge_maxwait 0

    en /etc/resolv.conf

    nameserver 127.0.0.1
    nameserver 192.168.100.1

    en /etc/bind/named.conf.options

    forwarders {
    127.0.0.1;
    192.168.100.1;
    };

    pruebas desde otra pc con debian 6 en mi red local en casa, en donde le puse la configuraciones de red como DNS 192.168.100.1

    $nslookup
    >terra.com.pe
    Server: 192.168.100.1
    Address: 192.168.100.1 #53

    No-authoritative answer
    Name: terra.com.pe
    Address: 208.70.182.122

    La razón de que me levanta el servidor DNS es para que ayude en algo mi velocidad acceso a la información en internet ya que mi conexion a internet es via WiFi a travez de un NSlocoM5

    me gustaría saber en que se diferencia con vuestro tutorial, en mi trabajo pienso implementar un servidor DNS, en donde hay 03 PCs escritorio (winxp), 01 Laptop (winxp) con conexion WiFi y Impresoras que actualmente comparto desde una PC con el resto de equipos, ademas en el mismo servidor voy levantar una LAMP

    saludos

    ResponderEliminar
  19. consulta TONY, donde esta el DNS Cache ?

    ResponderEliminar
  20. GRAN APORTE!!!!! FELICIDADES POR EL MATERIAL, ES MUY BUENO!!!
    Y ESCRIBO EN MAYÚSCULAS PORQUE AHORA MISMO ESTOY CHILLANDO!!! DE ALEGRÍA!!!

    ResponderEliminar
  21. y si lo quiero hacer pero con un dominio real? que mi servidor dns sea mi pc y esta la mande a mi servidor web

    ResponderEliminar
  22. Magnifica explicación y magnifico tutorial.
    Gracias

    ResponderEliminar
  23. Gracias y otra ves gracias......salu2s

    ResponderEliminar
  24. Hola, necesito ayuda urgente porque estoy a punto de comprar un servidor IBM x3550 - M2 link para información://www.markitx.com/market/IBM/Servers/Rack%20Servers/794674U
    Bien mi preocupación es que lo compre y no lo pueda usar como servidor multimedia dedicado para compartir películas con 200 clientes simultaneo usando XBMC combinado con protocolo FTP, este servidor tiene 2 procesador quad core y soporta 128GB de RAM, tiene dos tarjeta LAN gigabit, por esto creo que puede hacer el trabajo y también creo que se puede implementar este gran tutorial tan fantástico para mi propósito.

    ResponderEliminar
  25. hola a todos, muy bueno el artículo, pero aun tengo una duda y no logro encontrar la solución, tengo una intranet con un server dhcp y alrededor de 3600 terminales conectadas y me gustaría declarar todas esas terminales en mi dns y no se como, ya que la el rango de IP de mi intranet es mucho mayor que el que se usa en el ejemplo del artículo ¿como es que tengo que hacer para lograr mi propósito?

    ResponderEliminar
  26. hola gracias por tu gran aporte mi pregunta es es necesario configurar cada una de las ip que se van a conectar en el caso de que sean mas de 100 como se tendria que configurar gracias

    saludos desde colombia

    ResponderEliminar