> For the complete documentation index, see [llms.txt](https://juan-martin-franco.gitbook.io/network-+/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://juan-martin-franco.gitbook.io/network-+/8.-servicios-de-red/8.3-dns.md).

# 8.3 - DNS

## DNS (Domain Name System)

El <mark style="color:blue;">**sistema de nombres de dominio**</mark>, conocido como <mark style="color:blue;">**DNS**</mark>, es un protocolo utilizado para traducir nombres de dominio en direcciones IP y viceversa.&#x20;

La forma en la que trabaja DNS es la siguiente: cuando un cliente desea dirigirse a una página web indicando el nombre de dominio, alcanza un servidor DNS y pregunta cuál es la dirección IP de dicho nombre de dominio, hasta que un servidor DNS devuelve como respuesta la dirección IP correspondiente. Luego, el cliente es redirigido hacia el servidor web utilizando el router.

En la mayoría de nuestros hogares, no tenemos nuestros propios servidores DNS, sino que utilizamos los servidores DNS de nuestros proveedores de servicio de internet (ISP).

### FQDN (Fully Qualified Domain Name)

El <mark style="color:blue;">**nombre de dominio completamente calificado**</mark>, conocido como <mark style="color:blue;">**FQDN**</mark>, es una parte del Localizador de Recursos Uniforme (URL). Como su nombre lo indica, es el nombre completo de una entidad en el marco de Internet, que incluye un host y un ordenador.

Resumiendo, FQDN es un **nombre de dominio completo que incluye el nombre de la computadora y el nombre de dominio asociado** a ese equipo.

Es decir, especifica todos los niveles de dominio escritos en el formato <mark style="color:purple;">**hostname**</mark>.<mark style="color:red;">**dominio**</mark>.<mark style="color:green;">**tld**</mark>.&#x20;

Siendo:

* <mark style="color:purple;">**hostname**</mark>: Etiqueta asignada a un servicio de servidor disponible en una red. El servidor DNS utiliza un hostname para hacer que una dirección IP sea fácil de recordar. \
  Ejemplos de un hostname son «**www**» en [www.google.com](http://www.google.com) y «**es**» en es.wikipedia.org.<br>
* <mark style="color:red;">**dominio**</mark>: Está formado por un dominio de segundo nivel y un dominio de nivel superior (TLD). Por ejemplo, en **www**.**google.com**, «**google**» es el dominio de segundo nivel.<br>
* <mark style="color:green;">**tld**</mark>: El top level domain, conocido como tld, es el dominio de nivel superior. El más habitual es .com.

<mark style="background-color:green;">**Ejemplos de FQDN**</mark>

[www.google.com](http://www.google.com), siendo www el hostname, google el dominio y .com el tld.

es.wikipedia.org, siendo es el hostname, wikipedia el dominio y .org el tld.

### Funcionamiento jerárquico de DNS

El sistema de nombres de dominio funciona de forma jerárquica, y funciona con 5 niveles diferentes:

* <mark style="color:blue;">**Root**</mark>: Nivel más alto de la jerarquía DNS. Se encarga de responder peticiones en la zona root. Estos servidores contienen la lista global de todos los dominios de nivel superior, como .com, .net, etc.<br>
* <mark style="color:blue;">**Top-Level Domain**</mark>:  El segundo nivel más alto de la jerarquía DNS corresponde a los top-level domains, conocidos como TLD. \
  \
  Estos dominios se dividen en 2 categorías:\
  \
  **Jerarquías organizacionales** --> .com (Empresas), .net (Servicios de Red), .org (Organizaciones), etc.\
  \
  **Jerarquías geográficas** --> .uk (United Kingdom), .fr (France), .ar (Argentina)<br>
* <mark style="color:blue;">**Second-Level Domain**</mark>: El tercer nivel más alto de la jerarquía DNS corresponde a los second-level domains. Estos dominios se sitúan directamente debajo de los TLDs. \
  Por ejemplo, en [www.google.com](http://www.google.com), el second-level domain es google, situado justo debajo del TLD .com.<br>
* <mark style="color:blue;">**Subdomain**</mark>: El cuarto nivel más alto de la jerarquía DNS corresponde al subdomain.\
  Si por ejemplo, deseamos crear un nuevo servidor bajo nuestro second-level domain por ejemplo para soporte, podemos crear el servidor suppport.jmfsoft.com, siendo [www.jmfsoft.com](http://www.jmfsoft.com) el servidor web principal.<br>
* <mark style="color:blue;">**Host**</mark>: El quinto y último nivel de la jerarquía DNS corresponde al host. \
  Este es el nivel más bajo y más detallado dentro de la jerarquía DNS, y hace referencia a una máquina o servidor específico en la red. &#x20;

### URL (Uniform Resource Locator)

El <mark style="color:blue;">**localizador de recursos uniforme**</mark>, conocido como <mark style="color:blue;">**URL**</mark>, es una **secuencia de caracteres** que incluye un **nombre de dominio** y que permite **denominar recursos en internet** como **páginas web** o **archivos** para que puedan ser **localizados** fácilmente mediante **Domain Name System** (**DNS**), que traduce las URLs en **direcciones IP**.

Cada URL asigna una dirección exclusiva que apunta a la dirección de los recursos disponibles en internet, lo que permite crear enlaces o links a cada página web para que pueda ser visualizada a través de un navegador.

En el ejemplo anterior, [www.google.com](http://www.google.com) es un FQDN.

La **estructura de una URL** está dividida en 3 partes, como por ejemplo **<https://www.google.com/ejemplo1>**, cada una con diferentes funciones:

* El <mark style="color:purple;">**protocolo de red**</mark> identifica el formato y las características con que se transmite la información, como por ejemplo http, https, ftp, file o mailto. En este caso es https, la versión segura de http.<br>
* El <mark style="color:purple;">**nombre de dominio**</mark> permiten localizar la dirección del servidor en el que se encuentra el contenido de la web. En este caso [www.google.com](http://www.google.com).<br>
* La <mark style="color:purple;">**ruta de la URL**</mark> especifica el contenido apuntado dentro del servidor, incluyendo el nombre del archivo si es el caso. En este caso es ejemplo1, aunque bien podría ser / (lo que conocemos como "la raíz").

### Transferencia de Zona

Una transferencia de zona DNS es el proceso de enviar los registros DNS desde el servidor de nombres primario a un servidor de nombres secundario.&#x20;

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FjIJgu6rBZmdWnNGfx0sg%2Fimage.png?alt=media&amp;token=1c76319f-5766-479a-afbe-ce22906702a7" alt=""><figcaption></figcaption></figure>

Cuando esto ocurre, el primer registro que es transferido es el registro SOA, el registro Start of Authority, el cual es utilizado por el servidor secundario para ver si los otros registros necesitan ser actualizados, ya que el registro SOA contiene un número de serie que actúa como un número de versionado.

Cuando ocurre una transferencia de zona DNS, se utiliza el protocolo TCP en la capa de transporte para transferir datos, el cual nos asegura que los datos se enviarán de manera correcta desde el servidor primario hacia el servidor secundario y verifica que se hayan recibido correctamente.

### DNS Lookups (Reverse & Forward)

Cuando realizamos búsquedas DNS, tenemos dos formas de hacerlo:

* <mark style="color:blue;">**Búsqueda DNS Hacia adelante (Forward DNS Lookup)**</mark>: En este tipo de búsqueda, se utiliza DNS para encontrar una dirección IP para un nombre de dominio dado.\
  Básicamente, es: Nombre de dominio --> Dirección IP.<br>
* <mark style="color:blue;">**Búsqueda DNS Inversa (Reverse DNS Lookup)**</mark>: En este tipo de búsqueda, se determina el nombre de dominio dada una dirección IP.\
  Básicamente, es: Dirección IP --> Nombre de dominio.

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FTdgn9MxMEhSELDV4ryuM%2Fimage.png?alt=media&amp;token=4f21064a-2cf9-41a4-af10-b8a160ee29fe" alt=""><figcaption></figcaption></figure>

### Formato de Registros DNS

El Sistema de nombres de dominio especifica una base de datos de elementos de información para recursos de red. Los tipos de elementos de información se clasifican y organizan con una lista de tipos de registros de DNS: los <mark style="color:blue;">**registros de recursos (RR)**</mark>. Cada registro tiene un tipo (nombre y número), un tiempo de expiración (tiempo de vida), una clase, y datos específicos del tipo.

Cuando se envían a través de una red de Protocolo de Internet, todos los registros usan el formato común especificado en RFC 1035:

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FGjkCOSNQhxNDch40Mg1d%2Fimage.png?alt=media&amp;token=cf5cc800-2982-4072-aa59-636b609f5e5b" alt=""><figcaption></figcaption></figure>

Dada esta tabla:

* *<mark style="color:green;">**NAME**</mark>* es el nombre de dominio completo del nodo en el árbol. Durante la conexión, el nombre puede acortarse utilizando la compresión de etiquetas donde los extremos de los nombres de dominio mencionados anteriormente en el paquete pueden sustituirse por el final del nombre de dominio actual. Un @ independiente se usa para denotar el origen actual.<br>
* *<mark style="color:green;">**TYPE**</mark>* es el tipo de registro. Indica el formato de los datos y da una idea del uso previsto. Por ejemplo, el registro *A* se usa para traducir de un nombre de dominio a una dirección IPv4, el registro *NS* enumera qué servidores de nombres pueden responder búsquedas en una zona DNS, y el registro *MX* especifica el servidor de correo utilizado para manejar el correo de un dominio especificado en una dirección de correo electrónico capas del dns cuales son.<br>
* *<mark style="color:green;">**RDATA**</mark>* son datos de tipo específico de relevancia, como la dirección IP para registros de dirección, o la prioridad y el nombre de host para registros MX. Los tipos de registros conocidos pueden usar la compresión de etiquetas en el campo RDATA, salvo los tipos de registros "unknown" (RFC 3597).<br>
* <mark style="color:green;">**CLASS**</mark> es la clase del registro establecido en IN (Internet) para registros DNS comunes que involucran nombres de host, servidores o direcciones IP. Además, existen las clases Chaos (CH) y Hesiod (HS). Cada clase es un espacio de nombres independiente con delegaciones potencialmente diferentes de zonas DNS.

### Tipos de registros DNS

Dentro de los servidores DNS, creamos diferentes registros que almacenan distintos tipos de información, basados en nuestro caso de uso.

Los tipos más comunes de registros DNS son:

<table><thead><tr><th align="center">Tipo</th><th width="249.33333333333331" align="center">Descripción</th><th align="center">Función</th></tr></thead><tbody><tr><td align="center">A</td><td align="center">Dirección</td><td align="center">Enlaza un nombre de host a una dirección IPv4</td></tr><tr><td align="center">AAAA</td><td align="center">Dirección</td><td align="center">Enlaza un nombre de host a una dirección IPv6</td></tr><tr><td align="center">CNAME</td><td align="center">Canonical Name</td><td align="center">Apunta un dominio a otro dominio o subdominio</td></tr><tr><td align="center">MX</td><td align="center">Mail Exchange</td><td align="center">Dirige emails a un servidor de correo</td></tr><tr><td align="center">SOA</td><td align="center">Start of Authority</td><td align="center">Almacena información importante acerca de un dominio o zona</td></tr><tr><td align="center">PTR</td><td align="center">Pointer</td><td align="center">Correlaciona una dirección IP con un nombre de dominio</td></tr><tr><td align="center">TXT</td><td align="center">Text</td><td align="center">Agrega texto en el DNS</td></tr><tr><td align="center">SRV</td><td align="center">Service</td><td align="center">Especifica un host y un puerto para un servicio específico</td></tr><tr><td align="center">NS</td><td align="center">Nameserver</td><td align="center">Indica que servidor de nombres DNS tiene la autoridad</td></tr></tbody></table>

Los **registros de tipo A** son utilizados para enlazar un nombre de host a una dirección IPv4.\
Un registro con el símbolo @ puede ser utilizado para indicar la raíz.\
Por ejemplo: [www.google.com](http://www.google.com) --> 142.250.97.103 (Valor del registro A).&#x20;

Los **registros de tipo AAAA** son utilizados para enlazar un nombre de host a una dirección IPv6.\
Por ejemplo: [www.google.com](http://www.google.com) --> 2607:f8b0:400c:c38::67 (Valor del registro AAAA)

Los **registros de tipo CNAME** son utilizados para apuntar un dominio a otro dominio o subdominio.\
La búsqueda de DNS continuará reintentando la búsqueda con el nuevo nombre.\
Otro caso de uso útil para los registros de tipo CNAME es cuando utilizamos SaaS (Software as a Service), los cuales nos proveen un subdominio de su servidor. \
Los registros CNAME no pueden ser utilizados para apuntar a una dirección IP, sino que solo pueden apuntar a subdominios u otros dominios.\
Por ejemplo: [www.youtube.com](http://www.youtube.com) --> youtube-ui.l.google.com

Los **registros de tipo MX** son utilizados para dirigir emails a un servidor de correo electrónico.\
Estos registros son utilizados para indicar como los mensajes de email deben ser ruteados cuando utilizan el protocolo SMTP sobre el puerto 25.\
Cuando se crean estos dominios, también se puede especificar la prioridad para cada uno de estos registros. Esto indica la preferencia sobre cual servidor de correo se intentará utilizar primero. \
A menor número, mayor prioridad. Si se desea balancear la carga, se indican todos de igual preferencia.\
Por ejemplo: mail.unlu.edu.ar (Preferencia = 10) y mail3.unlu.edu.ar (Preferencia = 15).

Los **registros de tipo SOA** son utilizados para almacenar información importante sobre un dominio o una zona. Esta información puede incluir cosas como cuando fue la última actualización del dominio, la dirección de correo del administrador del dominio, cuanto tiempo debe esperar el servidor para enviar una actualización de todos sus registros DNS a las otras zonas.\
Estos registros SOA son críticamente importantes cuando un servidor DNS quiere realizar una transferencia de zona.

Los **registros de tipo PTR** son utilizados para correlacionar una dirección IP con un nombre de dominio.\
Básicamente, este registro es el opuesto al registro de tipo A, el cual correlaciona un nombre de dominio con una dirección IP.\
Estos registros se utilizan para conducir lo que conocemos como Búsqueda DNS inversa (Reverse DNS lookup). \
Si almacenamos una dirección IP en un registro PTR, va a ser invertido y se agregará .in-addr.arpa al final. Si nuestra IP es 66.55.44.33, y la almacenamos en un registro PTR, se almacenará como 33.44.55.66.in-addr.arpa.

Los **registros de tipo TXT** son utilizados para agregar text dentro de DNS.\
Estos registros son utilizados por los administradores de dominio y originalmente fueron diseñados para agregar notas legibles para los humanos dentro de los registros DNS. En la actualidad también contienen código legible para la máquina.

Los **registros de tipo SRV** son utilizados para especificar un host y un puerto para un servicio específico, como por ejemplo Voz sobre IP (VoIP), mensajería instantánea, u otros servicios similares. \
Por ejemplo: Si queremos correr un servidor de chat XMPP y enlazarlo al puerto 5223, podemos realizarlo utilizando un registro de tipo SRV.

Los **registros de tipo NS** indican que servidor de nombres DNS tiene la autoridad. \
Es decir, estos registros son utilizados para indicar que servidor de nombres DNS en el mundo será la autoridad para dicho dominio. Esto es importante porque DNS utiliza un modelo jerárquico, y todos los servidores necesitan saber quien es el dueño de dicho registro y está autorizado para realizarle cambios.

### Nameserver

El <mark style="color:blue;">**nameserver**</mark>, o <mark style="color:blue;">**servidor de nombres**</mark>, es un **tipo de servidor DNS que almacena todos los registros DNS para un dominio dado, incluyendo todos los tipos de registros nombrados previamente (registros tipo A, AAAA, CNAME, etc.)**.

A menudo hay más de un nameserver para un dominio, por lo que se puede tener un nameserver primario y un nameserver de backup.

### DNS Interno

Los servidores DNS internos le permiten a las instancias en la nube que estén en la misma red acceder a cada una de ellas utilizando nombres DNS internos, en lugar de tener que utilizar sus direcciones IP.

El servidor DNS interno principal suele configurarse para resolver los nombres de los sistemas internos de tal manera que estos puedan comunicarse en conjunto.

Para hacer esto, se crean registros de tipo A internos, además de registros de tipo PTR en la zona inversa.

La mayoría de proveedores de la nube automáticamente crean, actualizan y remueven dichos registros DNS internos por nosotros a medida que creamos y removemos diferentes máquinas virtuales y otras instancias en nuestra nube privada.

### DNS Externo

El DNS externo hace referencia a los registros creados alrededor de los nombres de dominio desde una autoridad central y que son utilizados en el internet público.

El servidor DNS externo debe permitir la resolución de nombres para el cortafuegos principal y los sistemas de la parte externa de la DMZ, y no para la red interna. En consecuencia, estos sistemas solo serán visibles desde Internet.

### Time to Live (TTL)

Para cada registro DNS, ya sea interno o externo, tenemos un <mark style="color:blue;">**TTL (Time to Live)**</mark> asociado.

El TTL es una configuración que le indica al Resolver DNS cuanto tiempo tiene que almacenar en caché una consulta antes de solicitar una nueva.

Por ejemplo, si un registro tiene el TTL configurado en 86.400 (valor por defecto usualmente), esto significa que nuestra computadora resolverá dicho registro DNS y lo recordará por 24 horas antes de tener que dirigirse hacia el servidor DNS y preguntar por dicha información de nuevo.

### Resolver DNS

El <mark style="color:blue;">**Resolver DNS**</mark>, también conocido como <mark style="color:blue;">**caché DNS**</mark>, está localizado en nuestros hosts individuales, como por ejemplo, nuestras laptops.

Por ejemplo, si estamos utilizando una laptop con Windows 10, nuestra laptop realiza una copia local de cada entrada DNS que resuelva para conectarse a las páginas web.

Esta base de datos temporal recuerda las respuestas que recibe desde los servidores DNS.&#x20;

Si realizamos la misma búsqueda 3 veces en el mismo día, solo se realizará una vez, y luego se obtendrá de manera más rápida ya que el Resolver DNS tiene una copia local (siempre y cuando no se haya vencido el TTL, que la almacena por 24 horas).

### Búsqueda Recursiva (Recursive Lookup)

Cuando nuestra computadora quiere encontrar una página web dada, por ejemplo [www.google.com.ar](http://www.google.com.ar), primero pregunta a su servidor DNS donde está localizada.

Para resolver esto, DNS utiliza una estrategia recursiva para realizar la búsqueda.&#x20;

<mark style="background-color:green;">**Funcionamiento de la búsqueda recursiva**</mark>

En este caso, le preguntamos al servidor DNS de nuestro ISP, quien es [www.google.com.ar](http://www.google.com.ar).

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FXA5NOptNnHalvrWsij0a%2Fasd.jpg?alt=media&amp;token=81a9a79f-ee3b-440c-9ce2-8fbcab0c9bc3" alt=""><figcaption></figcaption></figure>

El servidor DNS de nuestro ISP puede o no conocer la dirección IP de la página web que estamos buscando.

En caso de conocer dicha dirección IP, nos resuelve la búsqueda. \
En caso contrario, sube un nivel y le pregunta al siguiente servidor DNS.

En caso de que el siguiente servidor tampoco conozca la respuesta, subirá otro nivel, y así sucesivamente hasta encontrar la dirección IP deseada (es decir, la dirección IP de [www.google.com.ar](http://www.google.com.ar)).

Durante esta búsqueda recursiva, se alcanzará el root domain o .ar para [www.google.com.ar](http://www.google.com.ar), y luego se preguntará al servidor .ar quien es la autoridad para .com.ar, y luego se preguntará nuevamente para google.com.ar.

En resumen, con una búsqueda recursiva nuestro resolver DNS dirá "no se cuál es la dirección IP de este dominio", luego le pregunta a su servidor DNS, el cuál buscará la respuesta por nuestro resolver hasta que la encuentre, se la devuelva a nuestro resolver DNS y por último este nos la devuelva a nosotros.

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2F2hhYw2ebh5NvdGZs5bhz%2Fimage.png?alt=media&amp;token=69cf1f9c-722f-4e0d-ad93-95633e688823" alt=""><figcaption></figcaption></figure>

### Búsqueda Iterativa (Iterative Lookup)

La búsqueda iterativa, es similar a la búsqueda recursiva, exceptuando que el servidor DNS no continua la búsqueda de la información por nosotros y nos envía el resultado.&#x20;

En lugar de esto, en una búsqueda iterativa, nuestro resolver DNS pregunta a un servidor DNS cual es la dirección IP para un determinado dominio (por ejemplo, google.com.ar).

En caso de que el servidor DNS no conozca dicha dirección IP, le indicará a nuestro resolver DNS que le pregunte al siguiente servidor DNS y dicho servidor nos proveerá su dirección IP.

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2Fzz9i7KRZJUYhB8S77T5N%2Fimage.png?alt=media&amp;token=2e828a47-146d-415d-a41b-baa5ed5a0278" alt=""><figcaption></figcaption></figure>

Con la búsqueda recursiva, el resolver le pregunta a un servidor DNS y dicho servidor continúa buscando la respuesta hasta encontrarla y luego devolvérsela al resolver.

Con la búsqueda iterativa, nuestro resolver DNS estará realizando peticiones continuamente en todo momento hasta que encuentra un servidor DNS con la IP para dicho dominio.

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FxURuNUUfZz5FnjQeLquv%2Fimage.png?alt=media&amp;token=4312f033-4bde-4400-abe6-04de80199eef" alt=""><figcaption></figcaption></figure>
