# Mecanismos de extension de DNS

Los mecanismos de extensión para DNS (EDNS) es una especificación para la ampliación del tamaño de varios parámetros del sistema de nombres de dominio (DNS), el que tenía restricciones de tamaño que la comunidad de ingeniería de Internet consideran demasiado limitada para aumentar la funcionalidad del protocolo. El primer conjunto de extensiones se publicó en 1999 por la Internet Engineering Task Force como RFC 2671, también conocido como EDNS0.

## Motivación

El sistema de nombres de dominio fue desarrollado por primera vez a principios de la década de 1980. Desde entonces se ha ido mejorado con nuevas características, manteniendo la compatibilidad con versiones anteriores del protocolo.
Las restricciones en el tamaño de los campos de varias variables, códigos de retorno y los tipos de etiquetas disponibles en el protocolo básico de DNS no eran suficientes para apoyar algunas de las características deseables. Aún más, los mensajes de DNS transportados por UDP se limitaban a 512 bytes, si no se consideraban los encabezados del Protocolo de Internet (IP) y de la capa de transporte. Recurrir a utilizar el Transmission Control Protocol (TCP) no era factible porque aumentaría en gran medida el tráfico de datos de control (overhead). Esto presentaba un gran obstáculo para la adición de nuevas características para DNS. En 1999, Paul Vixie propuso ampliar DNS para permitir nuevos parámetros y códigos de respuesta y permitir respuestas más largas en un marco que es compatible con las implementaciones anteriores.

## Mecanismo

Dado que no se podían añadir nuevos parámetros en la cabecera del DNS, la diferenciación del nuevo formato del protocolo se logró con la opción de registros de pseudo-recursos, los registros de recursos OPT. Estos son registros de control que no aparecen en los archivos de zona. Los elementos del sistema DNS insertan estos registros opcionales en las comunicaciones entre compañeros para avisar que están utilizando EDNS. Esto proporciona un mecanismo transparente y compatible con implementaciones antiguas, ya que los clientes más antiguos sin EDNS simplemente ignorarán el nuevo tipo de registro. Los participantes DNS sólo deben enviar las solicitudes extendidas (EDNS) a los servidores DNS si están preparados para manejar las respuestas EDNS; y los servidores DNS sólo deben utilizar EDNS en las respuestas a las solicitudes que contienen registros con OPT.
El pseudo-registro OPT proporciona espacio para hasta 16 opciones adicionales y extiende el espacio para los códigos de respuesta. El tamaño total del paquete UDP y el número de versión (en la actualidad 0) figuran en el registro OPT. Un campo de datos de longitud variable permite que se pueda incluir más información en las futuras versiones del protocolo. El protocolo original de DNS proporcionaba dos tipos de etiquetas, que se definen por los dos primeros bits de los paquetes DNS:
* 00 (etiqueta estándar)
* 11 (etiqueta comprimido)
EDNS introduce el tipo de etiqueta 01 como etiqueta ampliada. Los 6 bits menores del primer byte puede ser utilizados para definir hasta 63 etiquetas extendidos nuevos.

## Ejemplo

Un ejemplo de un pseudo-registro OPT, como muestra la herramienta de utilidad Domain Information Groper (DIG):
El resultado "EDNS: Versión: 0" indica la conformidad plena con EDNS0 El resultado "flags: do" indica "DNSSEC OK"

## Aplicaciones

EDNS es esencial para la implementación de Extensiones de seguridad DNS (DNSSEC).

## Problemas

En la práctica, pueden surgir dificultades cuando se utiliza EDNS que atraviesen cortafuegos, ya que algunos de éstos suponen una longitud máxima de mensaje de DNS de 512 bytes y bloquean paquetes DNS que sean más largos.
La introducción de EDNS hizo posible un nuevo tipo de ataque de denegación de servicio, llamado amplificación de DNS, ya que EDNS facilita paquetes de respuesta muy grandes en comparación con los paquetes de petición relativamente pequeñas.
El grupo de trabajo IETF de Extensiones DNS (dnsext) está trabajando en un refinamiento de EDNS0, llamado rfc2671bis.