Material Lectura - Módulo 3
Material Lectura - Módulo 3
Material Lectura - Módulo 3
En este módulo veremos las particularidades del DNS recursivo, en qué fijarse al
configurarlo, y algunas funciones avanzadas.
Existe una discusión filosófica desde hace muchos años de cuánto es conveniente
alejarse del estándar frente a autoritativos que no se comportan bien. Hay una escuela
de pensamiento que dice que lo importante es obtener la respuesta, sea como sea.
Esto es, llenar los resolvers de casos de borde y atajos para ser capaces de
enfrentarse a la internet salvaje. Pero por otro lado, hay otros que piensan que hay
que castigar ejemplificadoramente a los autoritativos que no cumplen las reglas, y
negarse a resolver sus nombres. Tiene que existir un límite a lo mal configurado que
un servicio pueda estar. Porque en el momento que renunciamos al estándar y
aceptamos comportamientos errados, eso nunca se solucionará. La Internet funciona
porque todos aceptamos regirnos por ciertas reglas, y los que no las quieren seguir,
deben aceptar las consecuencias, que en este caso quiere decir que sus nombres no
serán resolvibles.
En lo personal simpatizo con esta última vertiente, pero creo que debe ser un proceso
gradual y coordinado. Es por esto que se han realizado hasta el momento dos "DNS
flag days", unas campañas coordinadas entre los desarrolladores de software de
resolutores y grandes servicios públicos, donde entre todos se decide qué es lo más
En una sección más adelante veremos los detalles de estos DNS flag days.
Arquitectura de recursivos
Lo más importante al dimensionar un servicio de resolvers es la cantidad de clientes
que tendrá. De eso depende no solo el tráfico ni la carga, sino sobre todo el uso del
caché del resolver. Un resolver con un caché muy pequeño pasará mucho tiempo
lleno, y tendrá que hacer mucha resolución completa en Internet. Un resolver con un
caché grande será capaz de almacenar muchas de las respuestas, y por ende liberará
de carga en la resolución en Internet, dando un servicio muy rápido a sus clientes. El
caché lo es todo, lo que significa capacidad de memoria.
Sin embargo, dicho todo esto, no son grandes números de los que estamos hablando,
y además es posible ir escalando en forma simple una vez que se esté llegando a
síntomas de agotamiento.
Yo tengo un full resolver en mi laptop, que me funciona sin problemas desde hace
años.
Hay oficinas pequeñas de 100 personas que funcionan con un resolver virtualizado,
con 8GB de RAM, con resultados perfectos.
Un resolver debe tener un acceso a Internet ojalá lo más limpio posible, sin
limitadores, ni cortafuegos, ni controladores de estado. Solo se permite tráfico de
salida, con las respuestas respectivas. Hacia adentro, el llamado "downstream",
puede estar bloqueado vía cortafuegos y la configuración propia del resolver, para
que solo escuche y atienda a sus propios clientes.
En lo posible hay que tener al menos dos resolvers, ojalá en redes distintas, para
estar cubiertos frente a caídas de uno de ellos. Todos los clientes aceptan más de 1
resolver, y realizan algún tipo de balance entre ellos.
Como contamos antes, Bind de ISC fue uno de los primeros y por mucho tiempo el
estándar de facto. El mismo servicio de autoritativo de Bind puede funcionar como
recursivo, y realizar las dos labores al mismo tiempo. Sin embargo como también
vimos antes, no es recomendable mezclar las dos funciones. Incluso si quiere utilizar
Bind para las dos funciones, es mejor que los tenga en máquinas distintas, o dos
instancias separadas, para no mezclar los cachés.
Dicho esto, las otras empresas que mantienen solo DNS autoritativos, también tienen
otro software para los recursivos. Acá los tenemos. La gente de Power DNS tiene a
"Power DNS Recursor", la de NSD tiene a "Unbound", y los de Knot DNS tienen a
"Knot resolver". Cualquiera de ellos es una buena elección, y los invito a revisar sus
particularidades que son bastante similares a lo indicado en la sección de
autoritativos. En especial podría recomendar fuertemente revisar Unbound, que
debido a su simpleza en la configuración y especialización en lo recursivo podría ser
preferible a otros más complejos.
En estos capítulos utilizaremos Bind, al igual que en los ejemplos en los autoritativos.
Todas las funciones tienen su equivalente en los otros softwares.
Mención aparte acá, en vez de hablar de software de DNS recursivo privado, son los
llamados "resolvers públicos", que mantienen ciertas empresas. Estos son servicios
El segundo inconveniente tiene que ver con eficiencia. Hay bastantes servicios de
caché de contenido web, como los CDN, que utilizan a los resolvers para elegir la
ubicación más cercana al usuario. Si yo utilizo el resolver de mi ISP, ese resolver
muchas veces está optimizado para ante una consulta por un proveedor de video, por
ejemplo YouTube, me envíe como respuesta una IP que está dentro del propio ISP,
logrando que obtenga un servicio muy cercano. Si, sin embargo, utilizo un resolver
externo fuera de mis redes, puede que al acceder al mismo video sea enviado a una
IP lejana, que ya no tendrá la misma velocidad de servicio.
Un recursivo necesita dos cosas para funcionar: la lista de IPs de los root servers del
árbol DNS, y la llave pública DNSSEC de la raíz. Con esos dos datos es suficiente
para partir y comenzar a dar servicio. Como vimos, las direcciones IPs de la raíz se
llaman "root hints", y es generalmente un dato que viene de paquete en el software,
pero que se puede configurar a mano por el operador. Es muy raro que un root server
cambie sus IPs, pero ha ocurrido de vez en cuando. En estos casos se hace con
mucho cuidado, avisando con años de anticipación, y siempre se cuida de mantener
la IP antigua también por varios años más, para ir de a poco analizando si hay
resolvers retrasados.
La llave DNSSEC de la raíz es un poco más delicada. En la historia hemos tenido solo
dos. La primera fue la original del año 2004, y la única rotación hasta el momento fue
el año 2018, momento en que comenzó a operar la segunda llave y la primera se
retiró. El momento de esa rotación fue complejo, por ser la primera vez que se hizo,
y no se estaba seguro de cuántos resolvers no tendrían la nueva. Existe un
mecanismo automatizado, dentro del mismo DNS, que permite que las llaves se "auto-
roten". Sin embargo, lo que se vió en esa primera experiencia es que además de ese
mecanismo, son los propios desarrolladores de software los que se preocupan de
distribuir la nueva llave con actualizaciones de sus servicios, y avisar en sus propios
canales a sus usuarios. De todas formas, una rotación de la llave raíz es un evento lo
suficientemente importante como para estar atentos, y seguir las instrucciones que
defina su distribución de software.
Esto me asegura que solo se dará servicio de recursión a los clientes de mi red. El
resto de clientes que hagan consultas recursivas recibirán una respuesta REFUSED.
Además por supuesto es posible hacer bloqueos a nivel de firewall para que ni
siquiera puedan acceder al puerto 53 de mi resolver desde redes externas.
Tamaño de buffer
Uno de los puntos que ha ganado bastante atención es el tamaño máximo del buffer
UDP que se debe utilizar, tanto desde el resolver hacia el "upstream", es decir los
autoritativos que contacta; como desde el resolver a su "downstream", es decir los
clientes que atiende. Para ambos casos es necesario declarar el tamaño de buffer
máximo, y así evitar la fragmentación de paquetes UDP.
Validación DNSSEC
La validación DNSSEC es recomendada en todo resolver. En Bind es tan simple como
activar la directiva dnssec-validation con el valor "auto". De esta manera se utiliza la
llave de la raíz configurada por defecto dentro de Bind, incluida su cambio cuando hay
rotación de la llave raíz. Es el valor más seguro para DNSSEC.
Al activar validación DNSSEC, nuestro resolver verificará que las firmas RRSIG que
vienen con las zonas firmadas sean criptográficamente válidas. Incluirá la descarga
de las llaves de la zona, utilizando la delegación de registros DS desde el padre al
hijo. Si alguna de estas firmas es inválida, el resolver enviará una respuesta
SERVFAIL al cliente, lo que lo protege de recibir una respuesta inválida.
Como vemos en el ejemplo, ese bit "ad" que incluye el resolver en su mensaje indica
que la respuesta ha sido validada correctamente usando DNSSEC.
Para probar la protección que DNSSEC nos entrega frente a un dominio incorrecto,
podemos revisar un nombre de dominio que intencionalmente está mal firmado, como
www.dnssec-failed.org.
Si además le indicamos con “+dnssec“ que queremos los registros RRSIG, podemos
revisar en dónde está el problema.
Lo que dice el protocolo es que esa zona no debe ser resuelta, pero ¿qué pasa si es
un dominio muy famoso? ¿Un dominio que sí funciona en un resolver que no valida?
Existía el miedo que por ser "demasiado seguros", dejáramos fuera un servicio
importante para nuestros clientes.
Este miedo fue resuelto hace muchos años atrás cuando se activó la validación
DNSSEC en forma simultánea en muchos operadores, para que de esa forma no
existiera esta supuesta "desventaja" al tener activo este modo de seguridad. Es así
como hoy todos los resolvers públicos quad-8, quad-1, quad-9, etcétera, todos validan
con DNSSEC. Si un dominio, por importante que sea, expira sus firmas, entonces
efectivamente quedará fuera de Internet. Ya no se puede culpar al resolver, porque el
que cometió la falta es el operador de la zona.
Para eso existe la directiva validate-except en Bind, que acepta nombres de dominio
donde bajo ellos se desactivará la validación, sin importar si sus firmas son
incorrectas. De todas formas, por supuesto que esta técnica debe usarse con mucho
cuidado y siempre como excepción en casos bien analizados, y reevaluados
constantemente. Desactivar DNSSEC es muy peligroso porque sería imposible para
un cliente diferenciar una excepción de un ataque.
La primera de ellas se llama "qname minimisation". Esta técnica se utiliza para evitar
divulgar demasiada información a los DNS autoritativos sobre la consulta que nuestro
cliente realiza.
De esta manera, un resolver que usa qnamemin, le enviará a la raíz solo la consulta
por ".com", y a los servidores de .com solo la consulta por "example.com",
minimizando de esta forma la información divulgada.
Esta técnica tiene sus problemas, porque hay veces donde un autoritativo sí tiene
información a varios niveles por debajo, lo que ocasiona muchas consultas repetidas
que podrían resolverse de una vez. Por eso la técnica qnamemin no está libre de
Actualmente Bind usa por defecto un valor "relajado" de qnamemin que le permite
esquivar ciertos problemas. También se puede activar en modo estricto, mediante una
configuración manual.
Lo que permite esta técnica es modificar ciertas respuestas DNS a criterio del
operador del recursivo.
Por último, hay ocasiones en que un juez o tribunal nos podría exigir dejar de resolver
un nombre, y para ello también se puede aplicar esta técnica.
La forma de operar las RPZ es creando zonas, al mismo estilo de las zonas normales
autoritativas, pero con nombres y acciones que tienen prioridad sobre la resolución
normal.
Y cada zona RPZ puede tener los nombres que queramos bloquear, apuntando a la
IP que queramos en un registro A, o bien apuntando con un CNAME a la raíz en caso
de bloqueo con respuesta NXDOMAIN
Existen también servicios que entregan zonas listas con dominios para bloquear
mediante RPZ, como SpamHaus, ThreatStop, Infoblox, etcétera. Estos permiten que
uno declare una zona secundaria, que descarga los datos desde ellos como primarios,
y vienen con dominios ya preparados para bloquear. En dnsrpz.info pueden buscar
más información.
Mirando las estadísticas de Bind con el comando "rndc stats" es posible inferir la
utilización de caché comparando la cantidad de queries marcadas como "recursion",
que requirieron hacer la recursión completa, versus las queries respondidas en total.