DNS: Lo que hay detrás de la resolución de dominio

· · | Ciberseguridad en DNS: Lo que hay detrás de la resolución de dominio

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:

resolución DNS simple

En este caso, estamos considerando solo las comunicaciones que puede ver el usuario que realiza la consulta DNS hacia el servidor DNS, 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 DNS 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:

Arbol de Dominios

 

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 DNS 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 DNS de nivel superior: Se encarga de resolver las direcciones IP de los servidores de autoridad.
  • Servidor DNS Autoritativo: Es el servidor DNS del dominio de segundo nivel y se encarga de resolver las solicitudes del dominio para acceder a ciertos recursos.

Resolución DNS completa

Siguiendo el flujo, podemos decir que la resolución DNS 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 DNS 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 DNS 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 DNS 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 DNS 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 de DNS completa de forma manual.

Abrimos una terminal o cmd dependiendo del sistema operativo que usemos y escribimos nslookup:

run 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 DNS de resolución. Para conseguirlo, empezamos actualizando el servidor DNS 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 DNS 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 DNS, 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 DNS de resolución como 8.8.8.8.

CONCLUSIÓN

Hemos entendido el funcionamiento detrás de la “simple” comunicación entre cliente DNS 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 servidores DNS, estos 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.