Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

sábado, 16 de mayo de 2015

Cómo crear un servidor DNS con bind9

El servicio DNS(Domain Name System) es usado por todos los internautas a diario. Su utilidad es simple, pero indispensable en la sociedad actual: Traducir las direcciones ip a nombres de dominio y viceversa. Recordar una dirección ip y asociarla a un sitio en concreto resulta difícil, con lo que el DNS elimina esa dificultad que conlleva, además de que la ip del sitio puede cambiar en cualquier momento (debido a las circunstancias que sean) y no sabríamos cómo llegar sin la ayuda de este servicio. Obviamente éste no es mágico; posee una base de datos que intenta relacionar la dirección ip al nombre (o viceversa) y en caso de no encontrar dicho dato, se comunica con otro DNS asociado que tiene registrado en la base de datos que puede llegar a tener dicho sitio y así sucesivamente hasta que lograr crear la relación. Existen numerosas herramientas que facilitan la creación de éstos servidores, pero hay una especialmente conocida: bind9.


En este caso voy a realizar un pequeño DNS casero, pero perfectamente funcional con bind9. Para ello simplemente haría falta un sistema basado en Debian; en mi caso en particular he realizado las pruebas con Debian8, resultando exitosas, pero al menos en Ubuntu y en Elementary OS debería de funcionar también.

Primero es importante asegurarse de que el servidor en cuestión está configurado con una ip estática; Esto es debido a que en caso de que la ip otorgada por el servidor DHCP cambie, el DNS podría dejar de funcionar correctamente. La consulta es tan sencilla cómo realizar un cat /etc/network/interfaces. os podeis encontrar con dos opciones:

1.Esté configurado el sistema con ip dinámica; lo cual mostraría algo cómo esto:


2.Esté configurado con ip estática, que variaría dependiendo del entorno. Aún así, este sería un ejemplo de configuración de ip estática.


Ahora que tenemos el entorno adecuadamente preparado, falta instalar la herramienta, ya que ésta no está incluida por defecto en el sistema operativo. Por suerte se trata de un software que va incluido en los repositorios, con lo que tan sólo habría que escribir apt-get install bind9.

Tras instalar el software, habría que pasar a su configuración, pues por defecto bind9 no hace nada. Para ello es necesario crear y configurar una serie de ficheros, los cuales están almacenados en /etc/bind/. La configuración estaría basada en dos pasos: La resolución de dominio directa y la resolución de directo inversa.


Resolución directa


La resolución directa se basaría en que a la hora de apuntar al nombre de dominio del servidor, se sea capaz de reconocer su dirección ip equivalente; es decir que si por ejemplo se le hiciese ping al nombre de dominio, se supiese a que dirección ip corresponde. Para ello habría que configurar 2 ficheros, que se encuentran almacenados en el directorio /etc/bind/.


Comenzamos con el fichero más importante de bind: el fichero named.conf.local. Este almacena los datos generales del servidor DNS y por defecto sólo posee unas pocas líneas de comentarios. En dicho fichero habría que añadir lo siguiente:

  1. zone "nombre_dominio" {
  2.         type master;
  3.         file "/etc/bind/db.nombre_dominio_sin_.net";
  4. };

Esta sería la estructura general que habría que añadir y el nombre sería aquel que uno desee. Por ejemplo, en mi caso particular he optado por el dominio pruebaivan.net con lo que si nos basamos en la estructura mencionada arriba quedaría así:


Esto sería lo sencillo. Ahora habría que configurar el fichero db.nombre_domino (en mi caso db.pruebaivan), el cual. cómo habréis podido observar, no existe en la carpeta bind. Aún así eso no significa que haya que crearlo desde cero. Se puede usar el fichero db.local cómo plantilla, con lo bastaría con copiar dicho fichero y renombrar la copia con el nombre de dominio mediante el comando: cp db.local db.pruebaivan. Si entramos en el fichero que acabamos de generar veremos que posee muy poca información y que la poca que hay hace referencia a la dirección 127.0.0.1. Habría que modificar su contenido para que quede con la siguiente estructura a esto:

IMPORTANTE: Revisar muy atentamente la puntuación. Cómo podéis ver al final del nombre de dominio siempre va un . sin el cual no os va a funcionar correctamente.

  1. $TTL    604800
  2. @       IN      SOA     nombre_dominio. root.nombre_dominio(
  3.                                 2       ; Serial
  4.                            404800       ; Refresh
  5.                             86400       ; Retry
  6.                           2419200       ; Expire
  7.                            604800 )     ; Negative Cache TTL
  8. @       IN      NS      nombredominio.
  9. @       IN      A       ip_servidor
  10. @       IN      MX 0    nombre_dominio.
  11. www     IN      A       ip_servidor
  12. uah     IN      CNAME   nombre_dominio.

Las 7 primeras líneas no haría falta ponerlas, ya que vienen incluidas por defecto, pero las he puesto para tener toda la información lo más detallada posible. Dichas primeras líneas consisten en los parámetros por defecto a la hora de resolver el nombre del dominio, parámetros que en un principio no son necesarios modificar ya que de por sí están bien. Con la siguiente estructura habría que modificar las líneas para adaptarlas a nuestro caso en particular. En mi caso particular la ip del servidor es 192.168.1.10 y el nombre de dominio pruebaivan.net; con lo que quedaría así:



Con esto configurado ya estaría bind preparado para realizar la resolución, solo habría que reiniciar el servicio mediante /etc/init.d/bind9 restart; pero ahora mismo la dirección DNS de nuestro servidor no está apuntándose a sí mismo con lo que habría que modificar el fichero /etc/resolv.conf, borrar todo su contenido y escribir lo siguiente:

nameserver 127.0.0.1 (En Debian)
dns-nameserver 127.0.0.1 (En Ubuntu)


Probando la resolución directa

Ahora quedaría realizar la prueba. Existen dos formas de probar. La primera es desde el propio servidor dns mediante el comando: host nombre_dominio. En caso de tener todo correctamente configurado, debería de mostraros su dirección ip equivalente, tal que así:


Otra alternativa es probar mediante el comando ping. Dicha prueba se puede hacer desde el propio servidor, o desde un equipo dentro de la misma red y que esté apuntando al recién creado DNS. Haré la prueba desde un equipo con Windows, ya que antes he mostrado cómo cambiar el DNS en Linux.

Para realizar el cambio en Windows (en este caso en Windows 7) tendríamos que dirigirnos al Panel de control y en la sección de Redes e Internet, clickar en Ver el estado y las tareas de red. Dentro de dicha sección, habría que entrar en Conexión de are local.


Una vez dentro, habría que clickar en el botón Propiedades y acceder a la sección Protocolo de Internet versión 4 (TCP/IPv4). En la zona inferior, observareis dos opciones: Una de ellas es Usar las siguientes direcciones de servidor DNS; seleccionaríamos dicha opción y en la casilla al lado de Servidor DNS preferido, pondríamos la dirección ip del servidor DNS, en mi caso 192.168.1.10.

Ahora sólo habría que pulsar la tecla windows + r y escribir cmd, para mostrarnos la consola. En este caso Windows y Linux comparten la misma sintaxis: ping nombre_dominio.


En caso de recibir respuesta, significaría que el servidor está correctamente configurado; en caso contrario habría que revisar de nuevo la configuración y repetir las pruebas hasta obtener el resultado adecuado.


Resolución inversa


Ahora sería el turno de configurar el DNS para la resolución inversa; es decir hacer que se asocie la ip del servidor DNS al nombre de dominio.  Para ello habría que dirigirse a la misma carpeta que antes, es decir, /etc/bind, y entrar de nuevo en el fichero de configuración general: named.conf.local. Manteniendo lo que ya habíamos escrito antes, añadimos el siguiente contenido:


  1. zone "prímeros octetos de la ip del servidor al revés (pueden ser 3 o 2 dependiendo de la máscara de red).in-addr.arpa" {
  2.         type master;
  3.         file "/etc/bind/db.primer_octeto";
  4. };

Alguno puede estar confuso ante lo escrito en la prímera y tercera línea. Para poneros en situación pondré cómo ejemplo mi ip: 192.168.1.10, con máscara 255.255.255.0; Aquí se necesitan unas nociones básicas de redes ipv4, pero por ejemplo, la mayoría de los hogares poseen el direccionamiento ip 192.168.1.X, teniendo cómo puerta de enlace la ip 192.168.1.1. Eso quiere decir que un equipo siempre va a tener una ip entre 192.168.1.2 y 192.168.1.254 (la 255 no se usa porque se trata de la dirección de broadcast). Con lo que cualquier ip dentro de la red SIEMPRE va a empezar con la dirección 192.168.1. y eso escrito al revés sería 1.168.192; así que en la primera línea sería:  zone "1.168.192.in-addr.arpa". Con respecto a la tecera línea; una ipv4 está compuesta por 4 octetos separados por . con lo que cómo en este caso tenemos una ip 192.168.1.X, el primer octeto sería 192. Basándonos en estos conceptos. este sería mi fichero de configuración final, completo:


Ahora haría falta configurar el fichero que hemos puesto en file, en este caso en particular db.192, que cómo habréis podido observar, no existe. Al igual que con la resolución directa, existe un fichero de configuración parecido que podemos usar cómo plantilla. Se trata del fichero db.127; con lo que al igual que antes habría que hacer cp db.127 db.192. Dicho fichero tiene una estructura bastante simple:

  1. $TTL    604800
  2. @       IN      SOA     nombre_dominio. root.nombre_dominio(
  3.                                 2       ; Serial
  4.                            404800       ; Refresh
  5.                             86400       ; Retry
  6.                           2419200       ; Expire
  7.                            604800 )     ; Negative Cache TTL
  8. @       IN      NS      nombredominio.
  9. 1       IN      PTR     nombredominio.
  10. 2       IN      PTR     nombredominio.
  11. ...

Los ... representa que se pueden añadir tantas líneas cómo direcciones ip que queremos añadir. Esos números que aparecen en la primera columna representan al último octeto de la ip, es decir: 192.168.1.1, 192.168.1.2, etc... Esas ips serán las que podrán asociar la ip del servidor a su nombre de dominio; En caso de que una ip, no se encuentre en la lista, no será capaz de realizar dicha asociación. En este caso yo por ejemplo he puesto de 1 al 10, pero puede ser perfectamente de 1 a 254, aunque si que es recomendable poner siempre en la lista la el último octeto perteneciente al servidor DNS (en mi caso el 10) para evitar cualquier posible complicación. Este sería mi fichero de configuración:


Con estos cambios hechos sólo habría que reiniciar de nuevo bind mediante /etc/init.d/bind9 restart

Probando la resolución inversa

Aquí también se puede probar de dos formas. La primera es desde el propio servidor dns. Sólo habría que escribir el comando host ip_servidor. Si se tiene todo correctamente configurado, y nos hemos asegurado de introducir la ip del servidor DNS en la lista de direcciones del fichero db.192, tendríamos que recibir el siguiente mensaje de respuesta:


La otra forma de probarlo sería desde otro equipo. Siguiendo la misma dinámica, voy a hacerlo desde un equipo con Windows 7. Habría que volver a configurar dicho equipo de nuevo tal y cómo he explicado en Probando la resolución directa, y entrar en la consola. En este caso no vamos a usar el comando ping, pues si hacemos ping a la dirección ip del servidor DNS nos va a devolver la respuesta sin más. En este caso vamos a usar el comando nslookup ip_servidor. Obviamente, el equipo que vamos a usar para la prueba, tiene que tener una ip que esté contemplada en el listado de db.192, pues sino no la prueba no funcionará. Si poseemos todo bien configurado y con una ip que se encuentre dentro de dicha lista, deberíamos recibir la siguiente respuesta:


Con esto ya tendríamos un pequeño pero funcional servidor DNS casero. Espero que os haya sido útil.

Saludos.

1 comentario :