Cómo funciona el DNS

Siguiendo con la serie de artículos sobre redes y TCP/IP hoy realizaremos una breve introducción al “Sistema de Nombres de Dominio” (DNS, por “Domain Name System“).

El DNS se utiliza principalmente para la resolución de nombres, esto es, decidir qué dirección IP pertenece a determinado nombre completo de host.

También puede descargar este tutorial en otros formatos (HTML sin decoraciones y PDF).

Usos del DNS

El DNS se utiliza para distintos propósitos. Los más comunes son:

  • Resolución de nombres: Dado el nombre completo de un host (por ejemplo blog.smaldone.com.ar), obtener su dirección IP (en este caso, 208.97.175.41).
  • Resolución inversa de direcciones: Es el mecanismo inverso al anterior. Consiste en, dada una dirección IP, obtener el nombre asociado a la misma.
  • Resolución de servidores de correo: Dado un nombre de dominio (por ejemplo gmail.com) obtener el servidor a través del cual debe realizarse la entrega del correo electrónico (en este caso, gmail-smtp-in.l.google.com).

Por tratarse de un sistema muy flexible, es utilizado también para muchas otras funciones, tales como la obtención de claves públicas de cifrado asimétrico y la validación de envío de e-mails (a través de mecanismos como SPF).

Terminología básica

Antes de proseguir, es necesario introducir algunos términos básicos para evitar confusiones y ambigüedades. Otros términos más complejos serán tratados más adelante.

  • Host Name: El nombre de un host es una sola “palabra” (formada por letras, números y guiones). Ejemplos de nombres de host son “www“, “blog” y “obelix“.
  • Fully Qualified Host Name (FQHN): Es el “nombre completo” de un host. Está formado por el hostname, seguido de un punto y su correspondiente nombre de dominio. Por ejemplo, “blog.smaldone.com.ar
  • Domain Name: El nombre de dominio es una sucesión de nombres concatenados por puntos. Algunos ejemplos son “smaldone.com.ar“, “com.ar” y “ar“.
  • Top Level Domains (TLD): Los dominios de nivel superior son aquellos que no pertenecen a otro dominio. Ejemplos de este tipo son “com“, “org“, “ar” y “es“.

Arquitectura del DNS

El sistema DNS funciona principalmente en base al protocolo UDP. Los requerimientos se realizan a través del puerto 53.

El sistema está estructurado en forma de “árbol“. Cada nodo del árbol está compuesto por un grupo de servidores que se encargan de resolver un conjunto de dominios (zona de autoridad). Un servidor puede delegar en otro (u otros) la autoridad sobre alguna de sus sub-zonas (esto es, algún subdominio de la zona sobre la que él tiene autoridad). Un subdominio puede verse como una especialización de un dominio de nivel anterior. Por ejemplo, “smaldone.com.ar” es un subdominio de “com.ar“, que a su vez lo es del TLDar“.

El siguiente diagrama ilustra esto a través de un ejemplo:

Zonas y delegación

Los servidores con autoridad sobre los TLD son los llamados “root servers” (o “servidores raíz“) del sistema. Estos son fijos, ya que rara vez cambian, siendo actualmente 13.

Tomemos como ejemplo el dominio “com.ar“. Este dominio pertenece al TLDar“.

Los servidores con autoridad sobre el dominio “ar” son:

ns-ar.ripe.net
merapi.switch.ch
uucp-gw-1.pa.dec.com
uucp-gw-2.pa.dec.com
ns.uu.net
ns1.retina.ar
athea.ar
ctina.ar

En tanto que los servidores con autoridad sobre “com.ar” son:

merapi.switch.ch
relay1.mecon.gov.ar
ns.uu.net
ns1.retina.ar
athea.ar
ctina.ar

Podemos ver que ns.uu.net, ns1.retina.ar, athea.ar y ctina.ar tienen autoridad tanto sobre “com.ar” como sobre “ar“.

El proceso de resolución de nombres

Cuando una aplicación (cliente) necesita resolver un FQHN envía un requerimiento al servidor de nombres configurado en el sistema (normalmente, el provisto por el ISP). A partir de entonces se desencadena el proceso de resolución del nombre:

  1. El servidor de nombres inicial consulta a uno de los servidores raíz (cuya dirección IP debe conocer previamente).
  2. Este devuelve el nombre del servidor a quien se le ha delegado la sub-zona.
  3. El servidor inicial interroga al nuevo servidor.
  4. El proceso se repite nuevamente a partir del punto 2 si es que se trata de una sub-zona delegada.
  5. Al obtener el nombre del servidor con autoridad sobre la zona en cuestión, el servidor inicial lo interroga.
  6. El servidor resuelve el nombre correspondiente, si este existe.
  7. El servidor inicial informa al cliente el nombre resuelto.

Ilustremos esto con un ejemplo concreto. Supongamos que el navegador necesita resolver el nombre “blog.smaldone.com.ar“.

  1. El sistema tiene configurado el servidor de nombres 200.49.156.3 (perteneciente al proveedor argentino Fibertel). Por lo tanto envía a éste el requerimiento de resolver “blog.smaldone.com.ar“.
  2. El servidor de 200.49.156.3 envía la consulta root server 198.41.0.4.
  3. 198.41.0.4 le informa que el servidor con autoridad sobre “ar” es athea.ar, cuya dirección IP es 200.16.98.2. (En realidad, informa la lista de todos los servidores con tal autoridad, pero para simplificar el ejemplo tomaremos solamente uno.)
  4. 200.49.156.3 envía nuevamente el requerimiento a athea.ar (el cual, recordemos, también tiene autoridad sobre “com.ar“).
  5. athea.ar responde que la autoridad sobre smaldone.com.ar la tiene ns1.mydomain.com cuya dirección IP es 64.94.117.213.
  6. 200.49.156.3 envía ahora la consulta a ns1.mydomain.com.
  7. ns1.mydomain.com informa que la dirección IP de “blog.smaldone.com.ar” es 208.97.175.41.
  8. Finalmente, 200.49.156.3 devuelve este resultado a la aplicación que originó la consulta.

Mecanismos de caché

Cada vez que un servidor de nombres envía una respuesta, lo hace adjuntando el tiempo de validez de la misma (TTL o “tiempo de vida“). Esto posibilita que el receptor, antes la necesidad de volver a resolver la misma consulta, pueda utilizar la información previamente obtenida en vez de realizar un nuevo requerimiento.

Esta es la razón por la cual los cambios realizados en el DNS no se propagan instantáneamente a través del sistema. Dependiendo de la naturaleza de los mismos (y de la configuración de cada servidor), la propagación puede tardar desde algunos minutos hasta varios días.

Correo electrónico y resolución de nombres

Normalmente los usuarios de correo electrónico redactan su mensajes usando un cliente de correo y enviándolo a través de un servidor SMTP provisto por su ISP o a través de un sistema de correo vía web (webmail). En cualquier caso, una vez que el mensaje es recibido por el servidor, debe ser entregado al destinatario. Aquí interviene el sistema DNS:

  1. El servidor del emisor solicita al DNS (de acuerdo al mecanismo analizado anteriormente), la entrada MX del dominio del receptor del mensaje. MX significa “mail exchanger“, esto es, el nombre del servidor (o los servidores) encargado de recibir los mensajes destinados a determinado dominio.
  2. El DNS devuelve el FQHN y la dirección IP del mail exchanger.
  3. El servidor del emisor se conecta al puerto 25, mediante TCP, del servidor del destinatario y entrega el mensaje según el protocolo SMTP.
  4. El proceso podrá continuar si el servidor receptor del mensaje no es el último de la cadena. Existen servidores que actúan como “puertas de enlace” o “gateways” de correo electrónico, y que se encargan de recibir los mensajes de determinados dominios para luego enviarlos a otros servidores.

Tipos de registro en un servidor de nombres

Un servidor de nombres puede almacenar distinta información. Para ello, en cada zona de autoridad dispondrá de entradas de distinto tipo. Entre los más importantes se encuentran:

  • A (Address): Este registro se utiliza para traducir nombres de hosts del dominio en cuestión a direcciones IP.
  • CNAME (Canonical Name): El nombre canónico es un alias para un host determinado. (No define una dirección IP, sino un nuevo nombre.)
  • NS (Name Server): Especifica el servidor (o servidores) de nombres para un dominio.
  • MX (Mail Exchange): Define el servidor encargado de recibir el correo electrónico para el dominio.
  • PTR (Pointer): Especifica un “registro inverso“, a la inversa del registro A, permitiendo la traducción de direcciones IP a nombres.
  • TXT (Text): Permite asociar información adicional a un dominio. Esto se utiliza para otros fines, como el almacenamiento de claves de cifrado, “DomainKeys” o “Sender Policy Framework“.

Bind, “el” servidor de nombres

Prácticamente el único software utilizado en los servidores de nombres de Internet es bind (“Berkeley Internet Name Domain“), creado originalmente en la Universidad de California, y actualmente propiedad del Internet Systems Consortium.

Este programa, distribuido bajo una licencia libre, es utilizado en prácticamente todos los sistemas Unix del mundo. Esto ha sido considerado un problema de seguridad, al punto que se ha propuesto la migración de algunos root servers a otro sistema, ya que la aparición de algún problema de seguridad en bind podría implicar la caída de todo el DNS de Internet.

Uso del DNS en una red local

Ya en redes de tamaño medio (quizás más de 5 equipos) es conveniente la utilización de DNS. Esto nada tiene que ver con el DNS de Internet (aunque el servidor local puede estar vinculado a este sistema).

Básicamente, es conveniente montar un servidor local de DNS por los siguientes motivos:

  • Agilizar el acceso a Internet: Al tener un servidor de nombres en nuestra propia red local (que acceda al DNS de nuestro proveedor o directamente a los root servers) se agiliza el mecanismo de resolución de nombres, manteniendo en caché los nombres recientemente usados en la red y disminuyendo el tráfico hacia/desde Internet.
  • Simplificar la administración de la red local: Al contar con un DNS propio (ya sea uno o varios servidores de nombres) es posible definir zonas locales (no válidas ni accesibles desde Internet) para asignar nombres a cada uno de los hosts de la LAN. De esta forma es posible, por ejemplo, referirnos a la impresora de red como “hplaser.mired.local” en vez de “192.168.0.2” y a nuestro servidor de correo interno como “smtp.mired.local” en vez de “192.168.0.3“. (Pensemos, por ejemplo, que ocurriría con las configuraciones de las aplicaciones si un día decidimos cambiar el esquema de direcciones IP de nuestra red.)

Problemas del DNS

El principal problema que presenta el DNS es que, al estar basado en UDP (protocolo de transporte que no garantiza la recepción de la información enviada), tanto las consultas como las respuestas pueden “perderse” (por ejemplo, a causa de congestionamiento en algún enlace de la red). Es común apreciar cómo, en el caso de servidores y redes no muy bien configuradas, la resolución de nombres se resiente sensiblemente ante cualquier anomalía (saturación de tráfico o del servidor de nombres local).

Otro inconveniente, que ya hemos hecho notar, es la lentitud de la propagación de las modificaciones en el sistema, producto de la propia arquitectura del mismo.

Pero quizás el mayor problema no sea inherente al sistema mismo, sino a la pésima configuración de los servidores de muchos ISP. Fibertel, el proveedor que utilizo, es un notable ejemplo de esta falencia. Una buena solución a esta situación es ejecutar un servidor de nombres en alguna PC de la red local, de forma tal que se comunique directamente con los root servers (evitando de esta forma pasar a través de los servidores de nombres de nuestro proveedor).

Herramientas para aprender más

En sistemas Unix el comando dig (ver “man dig“) permite realizar requerimientos “a mano” para poder investigar un poco más sobre el funcionamiento del DNS y, cómo no, también para detectar y solucionar problemas en la red.

Los usuarios de sistemas Windows disponen del comando nslookup (aunque no tan potente como dig), para el mismo propósito.

Lectura adicional

  • La página de Wikipedia sobre DNS contiene bastante información y buenos enlaces sobre este tema.
  • El “DNS Cómo” explica la configuración de bind en GNU/Linux.
  • El RFC 1591 explica detalladamente la estructura del DNS.
  • Los RFC 1034 y 1035 (ambos en inglés), describen completamente el DNS.
Dejar un comentario

122 comentario(s).

  1. Blog de Javier Smaldone » Tutorial sobre TCP/IP - pingback on 5 de diciembre de 2006 @15:43
  2. meneame.net - trackback on 5 de diciembre de 2006 @15:51
  3. Muy bueno el artículo.
    ¿por que no tuve en la universidad un profesor que me explicara las cosas asi de sencillo?
    Saludos, Diego.

  4. Jajajaja, Diego. Primero, gracias por el cumplido.

    Y la verdad, no es que yo sea un genio de la pedagogía (ni tampoco que estos temas sean tan complejos ni difíciles de explicar), pero es cierto; hay cada bestia dando vueltas “enseñando” por ahí y cobrando un sueldo sin tener la más remota sospecha de estas cuestiones. (Yo mismo conozco un caso en la universidad de mi ciudad…)

    En fin, me alegro de que te haya resultado útil.

  5. Buenisimo Javi, lo entendi completito!!!!

    Ahora, todo muy lindo que tal si la próxima entrega (o continuación de este post) porque no nos indicas como configuro mi red local para que se conecte a los root servers ya que bien sabes que es un clásico problema de los isp argentos.

  6. Supongo que les vendrá bien a los no iniciados. A los admins nos puede parecer un articulo mas bien flojito, pero la idea es buena.

  7. Efectivamente, anom2, es un artículo destinado a los “no iniciados” en el tema. No fue mi intención elaborar un documento que abarque el asunto en su totalidad (para eso lo he documentado con numerosos enlaces de referencia).

    Lo que realmente me gustaría, es que me indiques en qué puntos te ha parecido “flojito”, para poder mejorarlo.

    Desde ya, muchas gracias.

  8. exelente tutorial , me ha gustado :D , sigue con el blog vas muy bien

  9. Para que todo esto tenga mejor provecho, mi recomendación es que lo adaptes y transfieras al artículo de la Wikipedia

  10. Los únicos errores que he detectado, y pequeñitos son:

    “seguridad den bind podría”
    elimina la “d” y quedará perfeSto!

    es utilizado en practicamente todos los sistemas
    “prácticamente”

    “es conveniente la utlización de DNS”
    utilización

    “Existen servidores que actuan como”
    actúan

    Eso, saludos!! y sigue con tu estupendo blog.

  11. Enhorabuena por el artículo. Deberías adjuntarlo a Wikipedia.

  12. Enhorabuena por el artículo, me ha gustado mucho. Sigue con tu tutorial TCP/IP, incluso a los que somos “algo iniciados” siempre está bien leer cosas tan bien explicadas (sirven mucho también de cara a explicarlas en clase de forma que los alumnos lo entiendan :-) ).

    Lo dicho, muchas gracias por tomarte la molestia de explicarlo tan bien ;-)

  13. Por cierto, algunos comentarios que pudieran mejorar un poco el tutorial:

    * A veces se habla de FQDN en lugar de FQHN (domain en lugar de host), estaría bien comentarlo.

    * En DNS con servidores de correo, no estaría de más comentar que el estándar SMTP no exige un registro MX, sino uno de tipo A. Primero se consulta el MX y si no existe, se consulta el A.

    * DNS está basado en UDP… y en TCP. Si la respuesta sobrepasa los 512 bytes de tamaño, se hace por TCP.

    * También es un detalle sin mucha importancia, pero podrías comentar que a la hora de formar un FQDN el tamaño total no debe exceder los 253 caracteres y que entre los puntos de un nombre, solo puede haber 63 caracters, por eso no nos podemos eternizar con sub-sub-subdominios ad infinitum ;-)

    No son correcciones ni mucho menos, solamente complementos por si los ves de utilidad ;-)

  14. Fresqui.com - trackback on 6 de diciembre de 2006 @10:10
  15. También un comando en sistemas unis es host, con el que se puede consultar toda la información dns de un dominio.

  16. Además de los tipos que indicas, usando dig he visto alguna vez registros del tipo AAAA, que se correspondían con direcciones IPv6.

  17. excelente!, se agradece:)

    falto algo si, Cuando el mecanismo cache decide que es tiempo de actualizar los DNS y no usar los de cache?.

  18. Muy buen tutorial, muy buen blog. Felicitaciones de un iniciado que no tenía idea de como funciona un DNS. Muchas gracias.

  19. Jaareh Blog » Blog Archive » Cómo funciona el DNS - pingback on 6 de diciembre de 2006 @14:40
  20. Primero.Muy buen blog y sencillo de entender.
    Segundo.Tienes por ahi informacion de comom instalar y configurar correctamente un pequeño servidor DNS en Windows. Tengo una pequeña red que creo se beneficiaria.

    Gracias.

  21. Me parece muy bueno tu artículo, podría poner un enlace y/o copia al mismo desde mi sitio web?
    Gracias!

  22. Exelente y da la casualidad que ayer andaba buscando como instalar un cache DNS. Aqui la liga

    http://ubuntu.wordpress.com/2006/08/02/local-dns-cache-for-faster-browsing/

    Esto junto con squid nos da Casi todo el control sobre una red.

    Saludos.

  23. Buen articulo, ya me voy leyendo varios articulos que posteas en tu blog, y la verdad me son muy buenos.

    felicitaciones!

  24. Carlos, si quieres montarte un DNS lo mejor que puedes utilizar es un linux, la configuración es bastante sencilla y como ha mostrado euler, hay documentacion existente y muy bien hecha. De todas formas, creo que hay una version para windows de BIND, aunque mi recomendacion es que montes un pequeño PC con linux/unix y asi te adentres en el mundo del open source.

    Javier, por otro lado, el articulo me ha parecido correcto, felicidades de un SysAdmin :)

  25. Hola, está bastante bien explicado y muy conciso. Perfecto, aunque hay una errata : BIND són las iniciales de Berkeley Internet Name Daemon, o sea, la “D” final viene de Daemon.

  26. Javier, el termino correcto para obtener el nombre dado el IP es “Resolución reversa” que se logra haciendo una standar query preguntando por el registro PTR delegado de in-addr.arpa.

    Inverse query (como standar query) es otro tipo de consulta (opcional, ya obsoleto, en la RFC) que se puede realizar al DNS pero que casi no se implementó. Lo que se hizo fue resolver el problema haciendo standars querys. El mecanismo para resolver estas consultas se denominó “Reverse Mapping”

    Muy bueno.

  27. El servicio de DNS de auna, por lo menos en Almería, es muy malo. El tiempo de respuesta es muy alto y falla muy a menudo. Al final he tenido que utilizar el servicio de: http://www.opendns.com/ Va muy bien, os lo recomiendo.

  28. Cómo funciona el DNS at El blog del chato - pingback on 8 de diciembre de 2006 @22:03
  29. Muy buena entrada. Enhorabuena. Ahora mismo está séptima en la portada de delicious. :)

Deja un comentario

Trackbacks y pingbacks: