El protocolo DNS forma parte esencial del funcionamiento de internet como lo conocemos ahora, ya que nos permite asociar nombres a servicios, dejando de lado tener que memorizar números separados por puntos los cuales llamamos direcciones IP. Es más sencillo recordar www.google.com, que recordar un numero como 142.251.0.104. Un servidor DNS nos sirve para realizar esta resolución de nombre de dominio a dirección IP, como podemos ver a continuación:
En este caso, estamos considerando solo las comunicaciones que puede ver el usuario que realiza la consulta hacia el servidor, el cual llamaremos servidor DNS de resolución. Pero este flujo no está completo, ya que existen a su vez consultas que realiza el servidor de resolución y que abordaremos en este artículo.
Empezaremos por explicar que es un nombre de dominio para luego entrar más a detalle en el flujo DNS.
Nombre de Dominio
A modo de ejemplo para este artículo, consideraremos el dominio www.infinityspa.cl.
Un dominio está compuesto por muchas partes, todas estas separadas por puntos. Se puede considerar que todos los dominios terminan en un punto [.], solo que este se obvia.
Es posible representar este dominio como un árbol, tal como se muestra a continuación:
Como podemos ver, contamos con los conceptos, Dominio raíz que vendría ser el origen de todo dominio, Dominio de primer nivel o nivel superior, Dominio de segundo nivel que es la palabra que decidimos al momento de comprar un dominio y Subdominio, el cual es configurable desde el servidor DNS del dominio, y que tiene como finalidad apuntar a recursos.
Estos recursos se pueden configurar dependiendo del registro que se defina. Por ahora, sólo veremos registros de dominio => IP, los cuales son: los registros A si es IPv4 y AAAA si es IPv6.
Flujo DNS
Como vimos anteriormente, un dominio se compone de varias partes, así mismo existen servidores DNS enfocados en la resolución de cada una de estas:
- Servidor raíz: Se encarga de resolver las direcciones IP de los servidores de nivel superior. La lista de servidores DNS raíz se encuentran en el siguiente enlace: https://www.iana.org/domains/root/servers.
- Servidor de nivel superior: Se encarga de resolver las direcciones IP de los servidores de autoridad.
- Servidor autoritativo: Es el servidor DNS del dominio de segundo nivel y se encarga de resolver las solicitudes del dominio para acceder a ciertos recursos.
Siguiendo el flujo, podemos decir que la resolución completa se compone de 4 pasos:
1. El cliente que desea resolver un dominio envía su solicitud a el servidor DNS de resolución.
2. El servidor de resolución se comunica con un servidor DNS raíz, realizando la consulta del dominio y este le devuelve la dirección IP del servidor DNS de nivel superior que corresponda al domino.
3. El servidor de resolución se comunica con el servidor DNS de nivel superior, realizando la consulta del dominio y este le devuelve la dirección IP del servidor DNS autoritativo que corresponde al dominio.
4. El servidor de resolución se comunica con el servidor DNS autoritativo, realizándole la consulta del dominio y este le devuelve la dirección IP del recurso al cual desea conectarse y luego de ello, el servidor de resolución responde con la dirección IP al cliente inicial que realizó la consulta DNS.
Nota: Estas resoluciones pueden dar mas de una dirección IP, en ese caso, la elección de cualquiera de las opciones no afecta el funcionamiento del servicio.
Prueba de Concepto (PoC)
Para demostrar lo anteriormente explicado, usaremos nslookup, una herramienta que se encuentra presente en todos los sistemas operativos Windows o GNU/Linux para realizar la resolución completa de forma manual.
Abrimos una terminal o cmd dependiendo del sistema operativo que usemos y escribimos nslookup:
Si resolvemos un dominio como es.wikipedia.org, podemos ver la siguiente respuesta:
> es.wikipedia.org Server: dns.google Address: 8.8.8.8 Non-authoritative answer: Name: dyna.wikimedia.org Addresses: 2620:0:861:ed1a::1 208.80.154.224 Aliases: es.wikipedia.org
Donde podemos observar, que el dominio es.wikipedia.org hace referencia a la dirección IP 208.80.154.224.
DNS raíz
Si queremos conocer el DNS raíz, debemos realizar manualmente el trabajo del servidor de resolución. Para conseguirlo, empezamos actualizando el servidor al cual nos vamos a conectar, con una de las IP de los servidores DNS raíz. Elegimos el servidor DNS l.root-servers.net, el cual su dirección IP es 199.7.83.42.
Con esta información, actualizamos el servidor al que nos vamos a conectar de la siguiente manera:
> server 199.7.83.42 Default Server: l.root-servers.net Address: 199.7.83.42
Nuevamente, realizaremos la resolución del dominio es.wikipedia.org, lo cual según el flujo explicado anteriormente nos debería devolver la dirección IP de los servidores DNS de alto nivel, mejor dicho los servidores DNS de .org:
> es.wikipedia.org Server: l.root-servers.net Address: 199.7.83.42 Name: es.wikipedia.org Served by: - a0.org.afilias-nst.info 199.19.56.1 2001:500:e::1 org - a2.org.afilias-nst.info 199.249.112.1 2001:500:40::1 org - b0.org.afilias-nst.org 199.19.54.1 2001:500:c::1 org - b2.org.afilias-nst.org 199.249.120.1 2001:500:48::1 org - c0.org.afilias-nst.info 199.19.53.1 2001:500:b::1 org - d0.org.afilias-nst.org 199.19.57.1 2001:500:f::1 org
DNS de nivel superior
Elegiremos alguno de estos servidores DNS org, como por ejemplo a0.org.afilias-nst.info con la IP 199.19.56.1, actualizamos el servidor DNS al cual nos vamos a conectar con la IP del servidor DNS org que elegimos:
> server 199.19.56.1 in-addr.arpa nameserver = a.in-addr-servers.arpa in-addr.arpa nameserver = b.in-addr-servers.arpa in-addr.arpa nameserver = c.in-addr-servers.arpa in-addr.arpa nameserver = d.in-addr-servers.arpa in-addr.arpa nameserver = e.in-addr-servers.arpa in-addr.arpa nameserver = f.in-addr-servers.arpa a.in-addr-servers.arpa internet address = 199.180.182.53 a.in-addr-servers.arpa AAAA IPv6 address = 2620:37:e000::53 b.in-addr-servers.arpa internet address = 199.253.183.183 b.in-addr-servers.arpa AAAA IPv6 address = 2001:500:87::87 c.in-addr-servers.arpa internet address = 196.216.169.10 c.in-addr-servers.arpa AAAA IPv6 address = 2001:43f8:110::10 d.in-addr-servers.arpa internet address = 200.10.60.53 d.in-addr-servers.arpa AAAA IPv6 address = 2001:13c7:7010::53 e.in-addr-servers.arpa internet address = 203.119.86.101 e.in-addr-servers.arpa AAAA IPv6 address = 2001:dd8:6::101 f.in-addr-servers.arpa internet address = 193.0.9.1 f.in-addr-servers.arpa AAAA IPv6 address = 2001:67c:e0::1 Default Server: [199.19.56.1] Address: 199.19.56.1
Volvemos a resolver el dominio es.wikipedia.org lo cual nos debería devolver según el flujo, el servidor DNS autoritativo del dominio wikipedia.org:
> es.wikipedia.org Server: [199.19.56.1] Address: 199.19.56.1 Name: es.wikipedia.org Served by: - ns2.wikimedia.org 91.198.174.239 wikipedia.org - ns0.wikimedia.org 208.80.154.238 wikipedia.org - ns1.wikimedia.org 208.80.153.231 wikipedia.org
DNS autoritativo
Nuevamente, volvemos a actualizar el servidor, podemos elegir cualquiera en este caso elegiremos ns0.wikimedia.org con dirección IP: 208.80.154.238:
> server 208.80.154.238 Default Server: [208.80.154.238] Address: 208.80.154.238
Finalmente, resolvemos por última vez el dominio es.wikipedia.org, el cual nos devolverá el siguiente resultado:
> es.wikipedia.org Server: [208.80.154.238] Address: 208.80.154.238 Name: es.wikipedia.org
Podemos ver que no nos resuelve la dirección IP, esto quiere decir que el dominio es.wikipedia.org no hace referencia a un registro común de A (dominio => IP), por lo que vamos a actualizar el registro de búsqueda de dnslookup usando el comando set como se muestra a continuación:
> set type=ANY
Realizamos la búsqueda de nuevo del dominio es.wikipedia.org:
> es.wikipedia.org Server: [208.80.154.238] Address: 208.80.154.238 es.wikipedia.org canonical name = dyna.wikimedia.org
Como podemos ver, es.wikipedia.org esta referenciado con un registro canonical name o también conocido como CNAME, que a diferencia del registro común A antes explicado, este apunta a un dominio (dominio => dominio) y no a una dirección IP como en el registro A.
Lo que haremos para terminar la resolución será resolver el dominio al que hace referencia es.wikipedia.org, el cual es dyna.wikimedia.org.
Primero tenemos que volver a cambiar la búsqueda del registro ANY a el registro A para luego realizar la consulta del dominio dyna.wikimedia.org:
> set type=A > dyna.wikimedia.org Server: [208.80.154.238] Address: 208.80.154.238 Name: dyna.wikimedia.org Address: 208.80.154.224
Como podemos ver, obtenemos la misma dirección IP 208.80.154.224 que cuando resolvimos directamente es.wikipedia.org usando un servidor de resolución como 8.8.8.8.
CONCLUSIÓN
Hemos entendido el funcionamiento detrás de la «simple» comunicación entre cliente y servidor DNS de resolución, llevando la teoría a la práctica para entender el flujo correcto de una solicitud a la hora de realizar una consulta a un dominio o subdominio.
Si bien podemos acceder a varios recursos sin necesidad de dominios (directamente usando una dirección IP), los dominios manejados por servidores DNS forman parte importante del Internet que conocemos actualmente.
Es por ello que si se realizan ataques de Denegación de Servicio a estos servidores, pueden inhabilitar varios servicios de Internet. Si los ataques se realizan a servidores DNS populares como 8.8.8.8, 8.8.4.4, 1.1.1.1, estos podrían afectar a cientos de millones de usuarios y de realizarse a los servidores DNS raíz, podrían generar fallas masivas en Internet.