lunes, 17 de agosto de 2015

Configuración servidor DNS con BIND

Recordemos que los nombres de dominio nos ayudan a acceder a distintos sitios en internet de forma trasparente ingresando en la barra de navegación por ejemplo www.google.com en vez de su dirección ip 74.125.21.104. En el anterior post (Servidor en DynDNS) vimos como configurar un servicio de HOST DNS para apuntar un subdominio alojado en internet a nuestro servidor local y publicarlo en internet. Sin embargo, si lo que queremos en apuntar un dominio real en internet, como por ejemplo midominio.com y miempresa.com, debemos pensar en una solución acorde como por ejemplo rentar un servicio de hosting profesional, o mucho más complejo, montar un servidor DNS propio que punte dicho dominio a nuestro servidor. Este post cubre la segunda y más compleja alternativa.

Configuración previa


Para este propósito es necesario tener configurado ya un servicio de HOST DNS. Se sugiere en lo posible el servicio con Dyn.com, si embargo, existen muy buenas alternativas como Noip.com. En el siguiente enlace te enseñamos a configurar dicho servicio con Dyn. Es de notar, que se deben crear dos subdominios, ambos dirigidos hacia el mismo servidor. Finalmente, es necesario que ya se tenga alquilado un servidor en internet con algún registrador autorizado, para este ejemplo, supondremos que se ha comprado el dominio domain.com. También supondremos que los HOST DNS creados son dns1.dyndns.org y dns2.dyndns.org.

Servidor en DynDNS

Configuración del servidor DNS


Para configurar nuestro propio servidor DNS, utilizaremos BIND DNS el cual es el software más utilizado en internet para estos propósitos. Lo primero que debemos hacer es descargarnos la última versión del BIND DNS la cual se encuentra en la siguiente dirección https://www.isc.org/downloads. Debemos dar click la opción BIND, y seleccionar la versión estable del momento.



Enseguida aparecerá una ventana modal indicándonos la arquitectura deseada, dependiendo del servidor donde se quiera montar el servidor DNS, podemos seleccionar a 32 bits o 64 bits.



Al descargar el archivo, lo descomprimimos en cualquier carpeta y ejecutamos el instalador como Administrador. En la versión actual del BIND, la v9.10.2, el instalador es el archivo BINDInstall.exe.



Antes de instalar el programa, creamos un directorio en el disco local C llamado bind. Con esto, en el instalador podemos colocar como directorio de instalación C:\bind. La cuenta con la cual instalaremos el BIND debe ser Administrador o del Grupo Administradores, colocamos la clave, quitamos la opción Automatic Startup, dejamos lo demás como está por defecto e instalamos.



Lo ideal es que se cree una cuenta diferente a la de Administrador para correr el servicio del DNS. Sin embargo, esto requiere de configuraciones adicionales y que el sistema operativo tenga la Group Policy (instalación aquí), la cual, no viene por defecto en las versiones Home. Esto, con el fin de asignar a la nueva cuenta el permiso "logon as a service".

Si al instalar sale una ventana de dialogo preguntando si se desea seleccionar otra cuenta le damos click en No. Probablemente si no tienes el Visual Studio C++ Redistributable instalado tengas que instalarlo en la mitad del proceso, si ya lo tienes instalado debes cancelar esa segunda instalación. Finalmente, al aparecer el mensaje de confirmación de instalación damos click en Aceptar y cerramos la ventana del instalador.

Podemos verificar que se ha instalado correctamente si navegamos hasta la carpeta C:\bind y no está vacía. Veremos entonces dos carpetas nuevas, C:\bind\bin y C:\bind\etc. Para nuestro próximo paso debemos agregar la primera carpeta a la variable Path del sistema para poder ejecutar los comandos del BIND DNS desde la consola de windows. Después de esto, ejecutamos entonces el siguiente comando desde la consola como administrador.

rndc-confgen -a

Este comando crea una llave específica para el servidor y la escribe en el archivo C:\bind\etc\rndc.key. Después de esto, creamos los siguientes archivos en el mismo directorio.

Archivo rdnc.conf, sobre el cual definiremos la dirección del servidor DNS y la llave generada. El servidor sobre el cual queremos que llegue el DNS debe tener una dirección IP estática dentro de la red local, en este caso, suponemos que es la 192.168.1.100. Además de esto, dbemos reemplazar el parámetro secret por la llave que se generó en el archivo rndc.key,


rndc.conf
key "rndc-key" {
 algorithm hmac-md5;
  secret "K+d/EiibN8h3l8BdiDLAGflzIIlAOUmpSP8L25pPl7o=";
};

options {
 default-key "rndc-key";
 default-server 192.168.1.100;
 default-port 953;
};


Archivo named.conf, sobre el cual definiremos las zonas que crearemos en nuestro servidor. En este archivo, definimos la zona que crearemos en internet, en este caso, domain.com, y el archivo del cual se obtiene la configuración de esta zona.


named.conf
options {
 directory "C:/bind/etc";
 allow-transfer {none;};
 listen-on {any;};
};

zone "domain.com" {
    type master;
    file "C:/bind/dns/db.domain.com";
};

key "rndc-key" {
 algorithm hmac-md5;
 secret "K+d/EiibN8h3l8BdiDLAGflzIIlAOUmpSP8L25pPl7o=";
};

controls {
 inet 192.168.1.100 port 953
 allow { 192.168.1.100; } keys { "rndc-key"; };
};


Finalmente, creamos la carpeta C:\bind\dns y el archivo db.domain.com, sobre el cual estará especificada la configuración del dominio. En este archivo, deberemos reemplazar los dns por los que hayamos creado previamente en nuestra cuenta Dyn o Noip. Además, debemos colocar la dirección IP actual del primer DNS, en este caso 186.118.49.227.


db.domain.com
$TTL 15S

@       IN      SOA     dns1.dyndns.org. your.email.com. (
                        2007061907      ; serial
                        3H              ; refresh
                        30M             ; retry
                        4W              ; expire
                        15S )           ; min TTL

                NS      dns1.dyndns.org. ; name server
                NS      dns2.dyndns.org. ; name server

@                    A          186.118.49.227
dns1.dyndns.org.     A          186.118.49.227
dns2.dyndns.org.     A          186.118.49.227
www                  A          186.118.49.227

homepage        CNAME            www



Hasta ahora, los registradores de dominio y servidores DNS en internet no saben que hemos creado un nuevo servidor en internet. Debemos entonces entrar a la página del registrador al cual le hemos alquilado el dominio, en dicha página debe existir alguna zona en donde podamos editar las DNS del dominio, por lo general, vienen configurados dos dns por defecto, entonces los cambiamos por los que tengamos configurados en nuestra cuenta de HOST DNS.

Ahora, debemos configurar el router para que el BIND DNS pueda pasar a través de él y recibir peticiones de internet. Debemos abrir los puertos 53 - 59 y 81 - 953 sobre la ip del servidor, para esto puedes seguir el siguiente tutorial en el cual se explica cómo abrir puertos en el router.

Configurar router para publicar web



Adicionalmente agregamos las respectivas reglas de entrada al firewall.


Finalmente, abrimos una consola cmd y ejecutamos el siguiente comando.

named -f
named-checkconf c:\bind\etc\name.conf

La ejecución de estos comandos no debe arrojar output.

named-checkzone domain.com c:\bind\dns\db.domain.com

La ejecución de este comando debe arrojar OK.

Abrimos la ventana de serivicios y verificamos que el servicio ISC BIND esté iniciado. Si no, lo iniciamos.

Si el sistema encuentra algún error derivado del inicio del servicio, lo ideal es revisar el log del sistema operartivo en la ventan Event Log. A continuación un ejemplo.



Si todo ha salido bien, en este momento cualquier persona en el mundo podría acceder a nuestro servidor local con el nombre de dominio domain.com o www.domain.com. Si embargo, a nuestro servidor aún le falta una última configuración, un daemon. Dado que la mayoría de equipos en internet cambian constantemente de IP, necesitamos un proceso que cambie constantemente la dirección del archivo de configuración db.domain.com a la que tiene actualmente el primer DNS que tengamos configurado. Esto se logra creando un script en PHP en el mismo directorio que dicho archivo con el siguiente contenido.

update_ip.php
 
/*
 * # php update_ip.php zone_file dns zone
 */

// Set localtime zone
date_default_timezone_set("America/Bogota");

$online = true;

while (true)
{
   $dnsIp = gethostbyname($argv[2]);

   $zone = $argv[1];
   $zoneContent = file_get_contents($zone);
   preg_match('/\[?[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\]?/', $zoneContent, $z);
   $currentIp = $z[0];

   if ($dnsIp == $argv[2])
   {
      if ($online === true)
      {
          echo "Unable to connect to DNS at ". date('Y-m-d H:i:s') . "\n";
          $online = false;
      }

      $hd = fopen("logs.txt", "a+");
      fwrite($hd, "Unable to connect to DNS at ". date('Y-m-d H:i:s') . "\r\n");
      fclose($hd);
   }
   else {

      if ($online === false)
      {
         echo "Connected to ". $dnsIp ." at ". date('Y-m-d H:i:s') ."\n";
         $online = true;

         $hd = fopen("logs.txt", "a+");
         fwrite($hd, "Connected to ". $dnsIp ." at ". date('Y-m-d H:i:s') ."\r\n");
         fclose($hd);
   }

   if ($currentIp != $dnsIp)
   {
        $zoneUpdated = str_replace($currentIp, $dnsIp, $zoneContent);
        file_put_contents($zone, $zoneUpdated);
        echo "DNS updated to: " . $dnsIp ." at ". date('Y-m-d H:i:s') ."\n";
        echo exec("rndc reload " . $argv[3]);
        echo "\n";

        $hd = fopen("logs.txt", "a+");
        fwrite($hd, "DNS updated to: " . $dnsIp ." at ". date('Y-m-d H:i:s') ."\r\n");
        fclose($hd);
     }
   }

   sleep(1);
}

Abrimos una nueva terminal, navegamos hasta el directorio C:\bind\dns y ejecutamos el siguiente comando.

php %CD%/update_ip.php %CD%/db.domain.com dns1.dyndns.org domain.com

Sobra anotar, que debemos reemplazar los parámetros del archivo por los que tengamos en nuestro caso específico.

Notas Finales


La solución que se ha expuesto en este post no es una solución que deba implementar en un servidor en producción, solamente debe hacerse para efectos pedagógicos y en el área académica. No se admitirán reclamaciones de ningún tipo relacionadas con daños o perjuicios causados por seguir cada uno de los pasos descritos en este post.

Aplicar esta solución en servidores de producción producirá los siguientes problemas:

- Los robos de Google notarán probablemente tres copias igual de la misma web dado que la página podrá ser accedida desde tres direcciones distintas a saber, dns1.dyndns.org, dns2.dyndns.org y domain.com. Todo esto, provocará que Google no indexe nuestra web o la indexe de manera incorrecta.
- La propagación de los DNS en internet nunca se concretará. A pesar de que se puede acceder desde cualquier parte del mundo, si revisamos la propagación de los DNS de nuestra página con herramientas online, propablemente nunca veremos un chequeo satisfactorio.

DNS Checkers

- https://dnschecker.org/
- https://www.whatsmydns.net/
- http://dnscheck.pingdom.com/


Referencias

- Domain Name System. (2015, 27 de junio). Wikipedia, La enciclopedia libre. Fecha de consulta: 02:41, agosto 18, 2015 desde
https://es.wikipedia.org/w/index.php?title=Domain_Name_System&oldid=83445155
- BIND. (2015, July 31). In Wikipedia, The Free Encyclopedia. Retrieved 02:41, August 18, 2015, from https://en.wikipedia.org/w/index.php?title=BIND&oldid=673899632
- Documentation | Internet System Consortium. (2012). In Internet System Consortium. Retrieved 21:56, August 17, 2015, from https://www.isc.org/downloads/bind/doc/
- How to Set Up a Local Domain width Bind in Windows: 12 Steps. (2015). In wikiHow - How to do anything. Retrieved 21:56, August 17, 2015, from
http://www.wikihow.com/Set-Up-a-Local-Domain-with-Bind-in-Windows
- Managing a Domain using Dynamic DNS. (2015). In Ian Atkinson's Homepage. Retrieved 21:56, August 17, 2015, from http://www.ianatkinson.net/computing/ddns.htm

1 comentario: