Internet tiene una rica base conceptual, con muchas ideas interesantes que le permiten funcionar tal como la conocemos. Uno de los realmente interesantes es el DNS. Antes de que se inventara, todos en Internet (que ciertamente no eran muchos en ese momento) dependían de un archivo compartido llamado HOSTS.TXT, mantenido por el Instituto de Investigación de Stanford. Este archivo se sincronizaba manualmente a través de FTP y, a medida que crecía el número de hosts, también crecía el ritmo de cambio y la inviabilidad del sistema. En 1983, Paul Mockapetris se propuso encontrar una solución a largo plazo al problema y pasó a diseñar e implementar DNS. Es un testimonio de su genio el hecho de que su creación haya podido escalar desde unos pocos miles de computadoras hasta Internet tal como lo conocemos hoy.
Con el objetivo combinado de obtener una comprensión profunda de DNS, hacer algo interesante con Rust y aliviar algunas de mis propias picazones, originalmente me propuse implementar mi propio servidor DNS. Este documento no es una crónica veraz de ese viaje, sino una versión idealizada del mismo, sin todos los desvíos que acabé tomando. Implementaremos gradualmente un servidor DNS completo, comenzando desde los primeros principios.
Cada capítulo tiene un ejemplo correspondiente que contiene el código completo hasta ese punto de la guía, denominado sample1.rs
a sample5.rs
. Estos se pueden ejecutar usando, para el primer capítulo, cargo run --example sample1
.
read_qname
que permitía que un paquete malicioso desencadenara un bucle infinito. Se modernizó el código para adaptarlo a las prácticas actuales de oxidación y se corrigieron varias ineficiencias desagradables.