Este projeto implementa um servidor DNS assíncrono completo, escrito em Python, com foco em performance, segurança, extensibilidade e persistência. Ele não se limita a resolver consultas DNS em tempo real, mas atua como uma plataforma de resolução DNS, combinando cache em memória, banco de dados, circuit breaker, rate limiting e validação de segurança.
O sistema foi projetado para operar em ambientes de produção, mitigando abusos (DDoS, amplification), reduzindo latência e evitando dependência excessiva de servidores DNS externos.
O fluxo de resolução DNS segue a hierarquia abaixo:
- Recebimento da query via UDP
- Validação de segurança da requisição
- Rate limiting por IP
- Cache em memória (LRU + TTL)
- Banco de dados persistente
- Resolução DNS externa (upstream)
- Validação DNSSEC (opcional)
- Persistência do resultado + cache
- Resposta ao cliente
Essa abordagem reduz drasticamente latência, carga externa e exposição a falhas de rede.
O DNSServer é o núcleo da aplicação. Ele:
- Escuta requisições DNS via UDP usando
asyncio - Mantém handlers por tipo de registro (A, AAAA, MX, etc.)
- Aplica validações de segurança e rate limiting
- Coordena cache, banco e resolução externa
Ele funciona como um dispatcher, delegando a resolução real aos handlers registrados.
- Programação assíncrona (
asyncio) - UDP Datagram Protocol
- Dispatcher de handlers
Classe baseada em asyncio.DatagramProtocol. É responsável apenas por:
- Receber datagramas UDP
- Criar tasks assíncronas para processamento
Isso garante que o servidor nunca bloqueie o loop principal, mesmo sob alta carga.
O cache em memória é implementado com uma política LRU (Least Recently Used) e TTL (Time To Live).
- Remove automaticamente registros pouco utilizados
- Mantém os dados mais relevantes em memória
- Respeita o comportamento do DNS
- Evita servir dados obsoletos
O cache é utilizado em duas camadas:
- Cache geral de respostas DNS
- Cache interno para rate limiting
O banco de dados atua como cache persistente entre reinicializações.
- Armazenar registros DNS resolvidos externamente
- Permitir respostas mesmo sem conectividade externa
- Reduzir chamadas repetidas a upstreams
- Acesso totalmente assíncrono
- Repositórios separados por tipo de registro (A, MX, TXT, etc.)
- Conversão entre entidades de banco e
RRdo DNS
Esta classe estende o DNSServer e implementa a estratégia de fallback:
Cache → Banco → DNS Externo
Ela centraliza:
- Consulta ao banco
- Chamada a servidores DNS upstream
- Persistência automática de resultados
Esse padrão transforma o servidor em um resolver inteligente, e não apenas um proxy DNS.
Quando um registro não é encontrado localmente, o servidor consulta upstreams DNS configurados.
- Circuit Breaker
- Timeout controlado
- Tratamento explícito de erros DNS (NXDOMAIN, SERVFAIL)
O Circuit Breaker protege o sistema contra falhas externas.
- Closed: funcionamento normal
- Open: chamadas externas bloqueadas
- Half-Open: teste controlado de recuperação
- Evita cascata de falhas
- Reduz latência quando upstreams estão indisponíveis
- Protege recursos internos
Implementado por IP usando sliding window.
- Conta requisições por IP
- Reseta contadores por janela de tempo
- Bloqueia IPs abusivos temporariamente
- Prevenir DDoS
- Evitar abuso do resolver
- Garantir qualidade de serviço
O DNSSecurityValidator protege contra ataques comuns.
- Tamanho máximo da query
- Formato do nome de domínio (RFC 1035)
- Bloqueio de QTYPE.ANY (amplification)
Essas validações ocorrem antes de qualquer resolução, reduzindo custo computacional.
Quando habilitado, o sistema valida respostas DNS usando DNSSEC.
- Autenticidade da resposta
- Integridade dos dados
- Proteção contra spoofing e cache poisoning
Caso a validação falhe, a resposta é rejeitada com SERVFAIL.
Cada tipo de registro DNS possui um handler específico:
- A
- AAAA
- MX
- CNAME
- TXT
- NS
- SOA
- SRV
Esses handlers:
- Chamam a lógica de fallback
- Aplicam TTL apropriado
- Facilitam extensão futura (ex: DNS over HTTPS)
Todo o projeto é baseado em async/await.
- Alta concorrência
- Baixo consumo de threads
- Ideal para I/O intensivo (rede + banco)
O servidor pode lidar com milhares de requisições simultâneas sem bloqueio.
- Baixa latência
- Alta escalabilidade
- Segurança reforçada
- Persistência inteligente
- Fácil extensão
- Preparado para produção
- DNS over HTTPS (DoH)
- DNS over TLS (DoT)
- Replicação de banco
- Métricas Prometheus
- Interface administrativa
- Cache distribuído (Redis)
Este projeto não é apenas um servidor DNS, mas uma plataforma de resolução DNS moderna, projetada com princípios de engenharia de software, arquitetura resiliente e segurança em mente.
Ele combina conceitos clássicos de redes com padrões modernos de sistemas distribuídos, resultando em um resolver robusto, eficiente e extensível.