Material Lectura - Módulo 2
Material Lectura - Módulo 2
Material Lectura - Módulo 2
Como vimos, los servidores DNS autoritativos son los que contienen un subárbol del
DNS, que son delegados desde un padre y a su vez pueden subdelegar otras ramas
a otros autoritativos. Si no delegan nada, se trata de hojas terminales del árbol.
Como vimos anteriormente, todos los NS son iguales del punto de vista de un resolver.
No hay diferencia en el orden de respuesta ni tampoco sobre cuál es primario ni
secundario. Todos deben responder igual.
Ahora, para definir la arquitectura del servicio, por supuesto que lo primero es definir
dónde se mantendrá la zona, y cuál será el primario. Este primario es donde se
cargará en primer lugar la zona desde el archivo de zona en disco, y será quien
distribuya esta zona al resto de secundarios, mediante el protocolo AXFR o IXFR del
mismo DNS.
El primario es quien carga la zona desde disco. Pero ¿cómo obtienen los secundarios
la copia? En el protocolo original, los secundarios debían consultar periódicamente al
primario por el serial del SOA, para así saber cuándo debían actualizarse. La
periodicidad también venía definida en el mismo SOA, en el campo "refresh". Este
define el número de segundos en que un secundario debe "refrescar" la zona. Pasado
ese tiempo, un secundario debe consultarle el SOA al primario, comparar el número
serial, y si es mayor que el que tiene, iniciar una transferencia de zona mediante el
mensaje AXFR o IXFR (AXFR es transferir la zona completa, IXFR transfiere sólo las
diferencias. Es una optimización útil para zonas muy grandes).
Sin embargo, en el DNS moderno existe otro mecanismo mejor. Cuando hay un
cambio de zona en el primario, tener que esperar el tiempo de "refresh" para que el
secundario consultara era demasiado lento. Se inventó entonces los mensajes
"notify", que el primario puede enviar a los secundarios diciéndoles "¡hey, hubo un
cambio de zona, sería bueno que hicieras una transferencia!". Un secundario al recibir
Durante muchos años este mercado estuvo dominado por Bind de ISC, una de las
primeras implementaciones del DNS y por mucho tiempo la implementación "de
referencia", llegando a ocupar el 70% del mercado. En realidad, Bind es una suite de
programas, y el responsable del DNS es "named" (name daemon).
Ventajas del uso de Bind: es el estándar "de facto", soporta todas las
funcionalidades de DNS, tiene bastante documentación y gente que lo conoce.
PowerDNS es un software de autoritativo que ha ganado bastante mercado en el
segmento empresarial, sobre todo en Europa. La empresa es parte del conglomerado
europeo Open-Xchange, basado en los Países Bajos.
Está escrito en C++, y está disponible para ambientes Linux y Unix, como BSD.
Una de las grandes características de PowerDNS era su soporte nativo para mantener
la información de las zonas en bases de datos, lo que lo diferenciaba del esquema
habitual de archivos de texto. También permite hacer scripts para manipular las
respuestas, en lenguajes como Lua, Java, Python, etc.
Existe una versión pagada con soporte, consultoría y entrenamiento, y también tienen
hosting de DNS.
Al igual que Bind tienen un soporte completo de características básicas del DNS.
Escrito en lenguaje C, se caracteriza por ser muy liviano y rápido, con una
implementación moderna. Tiene la opción de suscripción a soporte y consultorías.
Por supuesto cualquier lista es incompleta. Me quise enfocar en los más conocidos.
Todos ellos son una apuesta segura, son conocidos y estables, y sus desarrolladores
participan habitualmente de IETF y distintos foros de operadores DNS. Lo importante
es que esta diversidad genética de software DNS le hace bien al ecosistema, y los
beneficiados somos todos en la comunidad con mayores opciones al momento de
elegir.
Ahí tenemos por supuesto a Microsoft DNS, que está integrado al servicio Active
Directory de Windows, lo que lo hace muy cómodo para empresas que utilizan esa
plataforma.
En el resto de los módulos utilizaremos a Bind como ejemplo, para ser un poco más
neutral si es posible. Todas las características que se indican son soportadas por los
4 grandes del código abierto mencionado antes, y es posible revisar en su
documentación la forma particular en que se implementan.
• Los espacios en blanco pueden ser múltiples, o con tabs. Es solo por un tema
de legibilidad que se alinean.
Se permiten los tokens de control "$ORIGIN <domain name>", que define el sufijo de
todos los RRs que lo siguen, en caso que sean relativos; y "$INCLUDE <file name>"
que permite insertar el contenido de un archivo dentro de otro.
Acá vemos cómo se define el registro SOA, con sus campos numéricos acompañados
de comentarios, para recordar qué representan. Luego lo siguen dos registros NS con
los nombres de los servidores de nombre para la zona. Fíjense que el primero de ellos
es parte de la misma zona, y el segundo pertenece a un árbol del DNS completamente
distinto, el .com.
La opción "-i none" le indica que no realice tests especiales de "siblings", luego viene
el nombre de la zona y finalmente el archivo de la zona.
Pero ¡tenemos un error! Lo que sucede es que pese a que tenemos lo mínimo, que
es 1 SOA y 1 NS, nos falta la dirección IP de uno de los NS, que es parte de la misma
zona. En este caso, el registro A o AAAA es obligatorio. Agreguémoslo entonces.
¡Muy importante también acá es los puntos y coma del final del bloque! Otra fuente
común de errores.
Entre comillas después del token "zone" va el nombre de la zona. Dentro lo mínimo a
configurar, debemos declarar si es una zona primaria o secundaria (antiguamente se
le llamaba master o slave, pero ahora por correctitud política se le cambió el nombre).
Si es primary, quiere decir que será definida mediante un archivo de zona local, y
luego se declara dónde está el archivo.
Con esto, ¡ya podemos levantar Bind y probar nuestra nueva zona! Por lo general el
nombre del servicio se llama "named".
Ahora tenemos entonces nuestro servidor respondiendo por una zona, ¡felicitaciones!
Pero, ¿podemos considerar que nuestro servidor ya es parte del DNS global? De
ninguna manera. Para eso, necesitamos "colgarlo" de algunos de los nombres reales
en Internet. ¡Ningún resolver del mundo al ser consultado por ejemplo.cl vendrá a
buscarlo a nuestro servidor! Esto es porque ahora necesitamos decirle a nuestro
padre que somos autoritativos del dominio.
Lo primero es que en nuestro primario debemos hacer dos cambios: usar una IP
pública, y declarar en la zona quiénes serán los secundarios, para que les de permiso
de transferencia de la zona.
También aprovechamos de crear un nombre nuevo dentro de la zona, que nos servirá
para hacer consultas externas.
Luego de esto, podemos verificar consultando a alguno de los NS del padre por la
delegación.
Primero averiguamos algún servidor de nombres del padre, consultando por el tipo
NS de CL.
Podemos utilizar cualquiera de ellos, pero es importante que la consulta por nuestro
dominio sea dirigido a alguno de los autoritativos, ¡nunca a un resolver! Esto porque
en caso de que aún no esté la delegación lista, obtendremos de respuesta un
NXDOMAIN, y el resolver lo almacenará en su caché por algún tiempo. Siempre en
Ahora sí, que ya tenemos certeza que está bien delegado, podemos hacer la prueba
final, enviando una consulta por el registro TXT a un resolver público cualquiera, como
Quad9 en este caso.
Reversos de IPs
Otra labor bastante común en operadores de redes es tener que declarar las "IPs
reversas" para ciertos nombres. Por ejemplo, las buenas prácticas dicen que los
servidores de nombre y los servidores de correo deben tener reversos bien definidos,
y calzar con el nombre "directo".
Ahora a los reversos. Para declarar los reversos debemos "dar vuelta" la dirección IP.
En IPv4 es por octeto, y se le pone de sufijo in-addr.arpa. Entonces, el registro PTR
que necesitamos para el correo, que recordemos tenía de nombre mail.ejemplo.cl y
registro A 10.14.2.25, sería 25.2.14.10.in-addr.arpa.
Recordemos que en IPv6, un par "dos puntos" seguidos, ¡en realidad son ceros!
Los reversos son delegados desde la raíz del DNS a los RIRs de cada región, los que
a su vez los subdividen y subdelegan a las organizaciones que las administran. En el
caso de nuestra región, es LACNIC quien asigna los bloques IPs, por lo tanto son
ellos nuestro "padre" desde donde delegamos las zonas de reversos.
Nuestra zona sería entonces la 2.14.10.in-addr.arpa, y dentro tendría todos los PTRs
que queramos definir para nuestras IPs. En este caso, solo tenemos la 25, que es
nuestro mail.ejemplo.cl.
Una opción muy útil para calcular "el número de ceros" en IPv6 es utilizar "-x" en dig,
que transforma la IP a su formato reverso. Por ejemplo, para consultar el formato del
reverso de nuestro NS, le pasamos la dirección IPv6.
Bind trae una política por default, pero utiliza 1 sola llave para el DNSKEY set, llamada
"common signing key". No recomiendo utilizar esta política, porque como vimos
anteriormente, es mejor utilizar dos llaves, una KSK y otra ZSK, lo que permite tener
la KSK por mucho tiempo, y solo ir rotando en forma más frecuente la ZSK. Eso nos
permite no tener que estar cambiando las llaves en el padre muy seguido, que puede
ser engorroso.
La ZSK, la llave que firma el resto de la zona se rotará cada 30 días, con el mismo
algoritmo. Al rotar esta llave no es necesario contactar al padre, así que podemos
hacerlo más frecuente.
Podemos mirar en el log que todo salió bien. Acá vemos la creación de las llaves, con
identificadores 10376 la KSK y 23260 la ZSK.
La KSK se identifica por el campo flags de valor 257, y la ZSK utiliza el 256.
En las firmas podemos ver los identificadores de las llaves al final de las líneas, la
10376 y 23260.
Una vez que está todo bien, ya podemos ir al padre y entregarle el campo DS de
arriba, según el formato que cada registrar permite. Es muy importante que esta etapa
sea hecha una vez que todos los secundarios ya tengan la zona firmada, y además
que ya expiró en todos los cachés de los recursivos alguna versión anterior de la zona,
sin firmar. Para ello es recomendable esperar al menos el doble del TTL del máximo
de nuestros registros.
Sin embargo, ya existe una solución en desarrollo que está de a poco siendo adoptada
por distintos TLDs. Este mecanismo permite que el hijo envíe una señal al padre
mediante la publicación de un registro especial, llamado CDS, "child DS". El padre
debe activamente escanear a sus hijos, y cada vez que vea un registro CDS, debe
Cada TLD puede tener sus propias políticas de CDS. Por ejemplo algunos requieren
que la primera vez que se active DNSSEC este DS sea puesto manualmente en el
panel de control; pero de ahí en adelante todos los rollovers serán automatizados con
el registro CDS. Otros permiten que se active DNSSEC desde cero, pero exigen que
el CDS se mantenga funcionando por una cantidad de días antes de aceptarlo.
Acá veremos algunos de los gráficos que genera, con una explicación de cómo
interpretarlos. Todas estas imágenes se obtuvieron también desde el sitio de DNS-
OARC.
Este gráfico es muy útil para detectar si algún nodo está llevando demasiado tráfico
comparado con el resto, lo que indica que sería bueno balancearlo con algún
mecanismo BGP, en caso de ser anycast. También se puede ver claramente con
escalas de tiempo más amplias si hay alguna sobrecarga en ciertos momentos, o si
hubo algún ataque DoS, por ejemplo.
En este segundo gráfico vemos una clasificación de las consultas por tipo. Cada color
es un tipo distinto. Acá vemos que el rojo es por lejos lo más común, que representa
el tipo A, direcciones IPv4. También vemos que el azul destaca, que representa el
tipo PTR, de reversos. En el eje izquierdo tenemos el tráfico en consultas por
segundo. Este gráfico es útil para ver su eventual cambio en el tiempo, que podría
representar alguna evolución en el comportamiento de resolvers.
En este gráfico casi no hay REFUSED, se ve una leve línea arriba de color azul, pero
un aumento de REFUSED podría indicar que alguien está delegando mi servidor a
una zona inexistente.
En este gráfico vemos el protocolo IP, o transporte, utilizado por las consultas.
Claramente UDP domina todo el tráfico, con un pequeño porcentaje en verde,
indicando TCP. Un aumento de TCP podría indicar que nuestras respuestas son muy
grandes, lo que obliga a los resolvers que utilizan UDP y se trunca su respuesta, a
reintentar con TCP.
Por último, el tamaño del paquete de respuesta también es muy interesante. Acá
vemos en color verde el RCODE 3, que representa NXDOMAIN. Como se ve, se trata
de respuestas muy pequeñas, entre 100 y 150 bytes, que no tendrán ningún problema
en cualquier red. En rojo están los NOERROR, y esto es esperable que sean un poco
más grandes, al llevar registros de respuesta y algunos ADDITIONAL. Con DNSSEC
los NXDOMAIN crecen mucho más, porque dependiendo de la utilización de NSEC o
NSEC3, llevan 2 o 3 registros adicionales para demostrar la inexistencia de la
consulta, cada uno con sus respectivas firmas. Hay que tener cuidado en este gráfico
Acá se indica el sitio oficial de DSC, dónde ver más imágenes de demostración, y el
repositorio github con el código fuente.
Este es un ejemplo de uso vía API, utilizando el comando curl para solicitudes web.
El primer comando crea una zona nueva, y el segundo le agrega un registro A. Estos
ejemplos son del servicio de Cloudflare, pero son muy similares todos.
¿En qué debemos fijarnos al elegir uno de ellos? La gente de Netnod y la “Fundación
para la Internet en Suecia” han publicado una guía con recomendaciones, y acá
veremos un resumen de todas ellas.
Luego es muy importante la diversidad, para evitar puntos únicos de falla. Diversidad
en topología, geográfica o de software.