1. Introducción
2. Como trabaja DNS en teoría
2.1. Componentes
2.2. Entendiendo las partes de un nombre de dominio
2.3. Tipos de servidores DNS
2.4. Tipos de resolución de nombres de dominio
3. Tipos de registros DNS
4. ¿DNS cache y DNS en kernel?
El
Domain Name System (DNS) es una base de datos distribuida y jerárquica
que almacena información asociada a nombres de dominio en redes como
Internet. Aunque como base de datos el DNS es capaz de asociar
distintos tipos de información a cada nombre, los usos más comunes son
la asignación de nombres de dominio a direcciones IP y la localización
de los servidores de correo electrónico de cada dominio.
Ejemplo de traducción de un nombre de dominio a IP, en este caso tiene múltiples IPs:
naguissa@K7LINUX ~ $ hostx www.google.es
www.google.es CNAME www.google.com
www.google.com CNAME www.l.google.com
www.l.google.com A 64.233.183.99
www.l.google.com A 64.233.183.104
www.l.google.com A 64.233.183.147
www.l.google.com A 64.233.183.103
La
asignación de nombres a direcciones IP es ciertamente la función más
conocida de los protocolos DNS. Además de ser más fácil de recordar, un
nombre es más fiable. La dirección numérica podría cambiar por muchas
razones, sin que tenga que cambiar el nombre.
Inicialmente, el DNS nació
de la necesidad de recordar fácilmente los nombres de todos los
servidores conectados a Internet. En un inicio, SRI (ahora SRI
International) alojaba un archivo llamado HOSTS.TXT que contenía todos
los nombres de dominio conocidos (técnicamente, este archivo aún
existe, la mayoría de los sistemas operativos actuales todavía pueden
ser configurados para revisar su archivo hosts). Aquí tiene un ejemplo
de Linux:
naguissa@K7LINUX ~ $ cat /etc/hosts
# /etc/hosts: This file describes a number of hostname-to-address
# mappings for the TCP/IP subsystem. It is mostly
# used at boot time, when no name servers are running.
# On small systems, this file can be used instead of a
# "named" name server. Just add the names, addresses
# and any aliases to this file...
# $Header: /home/cvsroot/gentoo-src/rc-scripts/etc/hosts,v 1.8 2003/08/04 20:12:25 azarah Exp $
#
127.0.0.1 localhost K7LINUX
naguissa@K7LINUX ~ $
El
crecimiento explosivo de la red causó que el sistema de nombres
centralizado en el archivo HOSTS.TXT no resultara práctico y en 1983,
Paul Mockapetris publicó los RFCs 882 y 883 definiendo lo que hoy en
día ha evolucionado al DNS moderno. (Estos RFCs han quedado obsoletos
por la publicación en 1987 de los RFCs 1034 y 1035).
Para la operación práctica del sistema DNS se utilizan tres componentes principales:
Los Servidores DNS (name servers), que contestan las peticiones. Los servidores recursivos tienen la capacidad de reenviar la petición a otro servidor si no disponen de la dirección solicitada (como la práctica java rmi, la parte opcional).
Los Clientes DNS (resolvers), un programa cliente
DNS que se ejecuta en la computadora del usuario y que genera
peticiones DNS de resolución de nombres a un servidor DNS (Por ejemplo:
¿Qué dirección IP corresponde a www.google.es?).
Y las Zonas de autoridad, porciones del espacio de
nombres de dominio que almacenan los datos. Cada zona de autoridad
abarca al menos un dominio y posiblemente sus subdominios, si estos
últimos no son delegados a otras zonas de autoridad.
Los clientes DNS también pueden tener una cache para no buscar los datos cada vez que se piden. Sacado de RFC 1035:
Local Host | Foreign
|
+---------+ +----------+ | +--------+
| | user queries | |queries | | |
| User |-------------->| |---------|->|Foreign |
| Program | | Resolver | | | Name |
| |<--------------| |<--------|--| Server |
| | user responses| |responses| | |
+---------+ +----------+ | +--------+
| A |
cache additions | | references |
V | |
+----------+ |
| cache | |
+----------+ |
Un nombre de dominio usualmente consiste en dos o más partes (técnicamente etiquetas), separadas por puntos cuando se las escribe en forma de texto. Por ejemplo, www.google.com o mail.google.com.
A la etiqueta ubicada más a la derecha se le llama dominio de nivel superior (en inglés Top Level Domain). Como com en www.google.com.
Cada etiqueta a la izquierda especifica una
subdivisión o subdominio. En teoría, esta subdivisión puede tener hasta
127 niveles, y cada etiqueta contener hasta de 63 caracteres, pero
restringido a que la longitud total del nombre del dominio no exceda
los 255 caracteres, aunque en la práctica los dominios son casi siempre
mucho más cortos.
Finalmente, la parte más a la izquierda del dominio
suele expresar el nombre de la máquina (en inglés hostname). El resto
del nombre de dominio simplemente especifica la manera de crear una
ruta lógica a la información requerida. Por ejemplo, el dominio mail.google.com tendría el nombre de la máquina mail.
El DNS consiste en un conjunto jerárquico de servidores DNS. Cada
dominio o subdominio tiene una o más zonas de autoridad que publican la
información acerca del dominio y los nombres de servicios de cualquier
dominio incluido. La jerarquía de las zonas de autoridad coincide con
la jerarquía de los dominios. Al inicio de esa jerarquía se encuentra
los servidores raíz: los servidores que responden cuando se busca
resolver un dominio de primer nivel.
Bind:
BIND
(Berkeley Internet Name Domain) es una implemenmtación de los protocols
DNS hecha por la universidad de Berkeley que provve de una
implementación abierta y redistribuible, incluyendo:
Un servidor de nombres de dominio (named).
Una librería de resolución de nombres de dominio.
Herramientas para verificar la correcta operación del servidor DNS.
El servidor DNS BIND es el usado en la mayoría de los servidores de Internet, proveyendo de una arquitectura robusta y estable.
La librería de resolución de DNS incluída provee de las APIs
estándard para la traducción entre nombres y IPs y puede ser llamada
desde cualquier aplicación que necesite este servicio.
Enlace a la história de BIND (en inglés): http://www.isc.org/index.pl?/sw/bind/bind-history.php
PowerDNS:
PowerDNS es otra implementación gratuita de DNS. Intenta ser mas sencilla que BIND.
http://downloads.powerdns.com/documentation/html/powerdns.html
MaraDNS:
Servidor DNS orientado a la seguridad que intenta ser, a la vez, sencillo de usar y configurar.
http://www.maradns.org/notes.html
djbdns:
Servidor
y librerías DNS, tanto sencillas como con cache, creado con la
seguridad como meta y para arreglar problemas y técnicas oscuras de
BIND, según el autor.
http://cr.yp.to/djbdns.html
pdnsd:
pdnsd
es un proxy de DNS compatible con IPv6 que escribe su cache de DNS al
salir. Sirver para acelerar las conexiones haciendo cache local de las
direcciones resueltas con anterioridad.
http://manpages.debian.net/cgi-bin/display_man.cgi?id=f0cdaa725cc21e3738c9b442cda258d8&format=raw
myDns:
Servidor
DNS gratuito para UNIX. Está implementado para trabajar sobre una base
de datos MySQL o PostgreSQL, obteniendo la información de ella. No
incluye soporte para recursividad ni una librería para la resolución,
con lo que se usa mediante la librería estándard de dns y apuntando la
dirección del servidor de DNS del ordenador a la IP del servidor MyDns.
Sus objetivos son estabilidad, seguridad, interoperabilidad y velocidad.
http://mydns.bboy.net/
Existen dos tipos de consultas que un cliente (resolver) puede hacer a un servidor DNS:
Iterativa
Recursiva
En las consultas recursivas el servidor repite el mismo proceso básico (consultar a un servidor remoto y seguir cualquier referencia) hasta que obtiene la respuesta a la pregunta.
Las consultas iterativas, o resolución iterativa, consisten en la mejor respuesta que el servidor de nombres pueda dar. El servidor de nombres consulta sus datos locales (incluyendo su caché) buscando los datos solicitados.
Cuando existe más de un servidor autoritario para una zona, BIND utiliza el menor valor en la métrica RTT (round-trip time) para seleccionar el servidor. El RTT es una medida para determinar cuánto tarda un servidor en responder una consulta.
El proceso de resolución normal se da de la siguiente manera:
El servidor A recibe una consulta recursiva desde el resolver.
El servidor A envía una consulta iterativa a B.
El servidor B refiere a A otro servidor de nombres, incluyendo a C.
El servidor A envía una consulta iterativa a C.
El servidor C refiere a A otro servidor de nombres, incluyendo a D.
El servidor A envía una consulta iterativa a D.
El servidor D responde.
El servidor A regresa la respuesta al resolver.
El resolver entrega la respuesta al programa que solicitó la información.
A = Address �€“ (Dirección) Este registro se usa para traducir nombres de hosts a direcciones IP.
CNAME = Canonical Name �€“ (Nombre Canónico) Se usa para crear nombres de hosts adicionales, o alias, para los hosts de un dominio.
NS = Name Server �€“ (Servidor de Nombres) Define la asociación que existe entre un nombre de dominio y los servidores de nombres que almacenan la información de dicho dominio. Cada dominio se puede asociar a una cantidad cualquiera de servidores de nombres.
MX = Mail Exchange �€“ (Intercambiador de Correo) Define el lugar donde se aloja el correo que recibe el dominio.
PTR = Pointer �€“ (Indicador) Tambien conocido como 'registro inverso', funciona a la inversa del registro A, traduciendo IPs en nombres de dominio.
naguissa@K7LINUX ~ $ hostx www.google.es
www.google.es CNAME www.google.com
www.google.com CNAME www.l.google.com
www.l.google.com A 64.233.183.99
www.l.google.com A 64.233.183.104
www.l.google.com A 64.233.183.147
www.l.google.com A 64.233.183.103
En esta consulta vemos 2 alias (CNAME) y 4 direcciones IP para el mismo dominio. Así, la resolución se hará:
www.google.es -> www.google.com -> www.l.google.com -> cualquiera de las IPs listadas.
Ya hemos visto con anterioridad que los servidores DNS suelen tener cache DNS para acelerar las conexiones, aunque también se pueden desactivar si se desea. Sobre los clientes, la mayoría tienen cache DNS interna al proceso, e incluos se podría hacer una cache para el cliente:
Instalamos un proxy DNS con cache.
Configuramos el proxy para que busque el los DNS de nuestra conexión y que grabe la cache en /etc/hosts con formato válido.
Configuramos /etc/resolv.conf para que busque en 127.0.0.1 (localhost).
Como la implementación mira /etc/hosts antes de llamar al DNS, las
entradas que aún estén en la cache DNS serán resueltas sin llamar al
DNS, mientras que si no está se llamará al servidor local, que
consultará a los remotos y guardará el resultado en la cache
(/etc/hosts) para futuros usos.
Sobre funciones DNS en kernel, no existe nada en el kernel relacionado con DNS:
naguissa@K7LINUX ~ $ find /usr/src/linux/net/ | grep dns
naguissa@K7LINUX ~ $
Si no pertenece al kernel, ¿a qué pertenece? Bien, en la teoría de la asignatura se ha visto que DNS no es una primitiva básica, sino una función añadida, por lo que es una librería, no un apartado del kernel:
naguissa@K7LINUX ~ $ find /lib/ | grep dns
/lib/libnss_dns.so.2
/lib/libnss_dns-2.3.6.so
naguissa@K7LINUX ~ $
Para mas detalles, esta librería pertenece a glibc en Linux (libc en *BSD), la librería estándard de C y usa la implementación est� ndard, BIND.
Fuentes:
http://rpmfind.net/linux/rpm2html/search.php?query=libnss_dns.so.1(GLIBC_2.0)
http://es.wikipedia.org/wiki/DNS
http://www.ietf.org/rfc/rfc1035.txt
http://www.isc.org/index.pl?/sw/bind/
http://downloads.powerdns.com/documentation/html/powerdns.html
http://www.maradns.org/notes.html
http://cr.yp.to/djbdns.html
http://manpages.debian.net/cgi-bin/display_man.cgi?id=f0cdaa725cc21e3738c9b442cda258d8&format=raw
http://mydns.bboy.net/
http://www.juniper.net/security/auto/vulnerabilities/vuln91.html
Pruebas experimentales en Gentoo Linux. (sys-libs/glibc-2.3.6-r3 y kernel gentoo-sources-2.6.16-r7 ), para búsqueda de librerías y pruebas de resolución.