A Internet tem uma base conceitual rica, com muitas ideias interessantes que lhe permitem funcionar como a conhecemos. Um dos mais legais é o DNS. Antes de ser inventado, todos na Internet – que reconhecidamente não eram tantos naquela fase – dependiam de um arquivo compartilhado chamado HOSTS.TXT, mantido pelo Stanford Research Institute. Esse arquivo era sincronizado manualmente via FTP e, à medida que o número de hosts crescia, também crescia a taxa de alteração e a inviabilidade do sistema. Em 1983, Paul Mockapetris decidiu encontrar uma solução de longo prazo para o problema e passou a projetar e implementar o DNS. É uma prova de sua genialidade que sua criação tenha sido capaz de escalar de alguns milhares de computadores até a Internet como a conhecemos hoje.
Com o objetivo combinado de obter uma compreensão profunda do DNS, de fazer algo interessante com Rust e de aliviar algumas das minhas próprias coceiras, originalmente decidi implementar meu próprio servidor DNS. Este documento não é uma crónica verdadeira dessa viagem, mas sim uma versão idealizada da mesma, sem todos os desvios que acabei por fazer. Implementaremos gradualmente um servidor DNS completo, começando pelos princípios básicos.
Cada capítulo possui um exemplo correspondente que contém o código completo até aquele ponto do guia, denominado sample1.rs
até sample5.rs
. Eles podem ser executados usando, no primeiro capítulo, cargo run --example sample1
.
read_qname
que permitia que um pacote malicioso acionasse um loop infinito. Modernizou o código para estar em conformidade com as práticas atuais de ferrugem e corrigiu várias ineficiências desagradáveis.