DNSao¶
DNSao é um encaminhador DNS leve, cache, sinkhole e dashboard de métricas para sua rede
O Que O DNSao Faz¶
O DNSao roda como servidor DNS para sua LAN, homelab ou pequeno servidor. Os dispositivos enviam queries DNS para o DNSao, e o DNSao decide como respondê-las:
dispositivo cliente -> DNSao -> mapeamento local / blocklist / cache -> resolvedor upstream
Na prática, isso significa que o DNSao pode:
- Encaminhar queries DNS para um ou mais resolvedores upstream usando UDP, DNS-over-TLS ou DNS-over-HTTPS
- Cachear respostas respeitando TTL e reaquecer entradas usadas com frequência antes que expirem
- Bloquear domínios de blocklists baixadas e liberar domínios através de allowlists
- Resolver nomes locais diretamente, incluindo mapeamentos de homelab como
nas.homeou*.lab.home - Roteiar clientes diferentes por upstreams ou listas diferentes usando grupos
- Mostrar métricas de DNS, upstream, cache, queries e JVM em um dashboard integrado
Casos De Uso Comuns¶
- DNS para rede doméstica: aponte a configuração DNS do DHCP do roteador para o DNSao e deixe todos os dispositivos usarem o serviço.
- Encaminhamento orientado à privacidade: use upstreams DoT ou DoH no lugar de DNS upstream UDP aberto.
- DNS sinkhole: bloqueie domínios de anúncios, trackers ou malware usando blocklists remotas.
- Nomes de homelab: mapeie serviços locais para nomes estáveis sem rodar um servidor DNS autoritativo separado.
- Observabilidade de DNS: inspecione histórico de queries, taxa de cache hit, latência de upstreams e saúde da JVM no dashboard.
Público-Alvo¶
O DNSao é para usuários técnicos que querem mais controle sobre o comportamento DNS em uma LAN, homelab ou pequeno servidor.
- Usuários que querem bloqueio de anúncios na rede inteira: use blocklists e allowlists DNS para fazer a filtragem uma vez na camada DNS em vez de em cada dispositivo.
- Usuários que querem transporte DNS upstream privado: encaminhe queries para resolvedores upstream via DoT ou DoH para reduzir sniffing de queries DNS entre o DNSao e o resolvedor. Veja DNS Criptografado para detalhes.
- Usuários que querem resolução DNS mais rápida: faça cache local respeitando TTL, rewarm de entradas frequentes e, opcionalmente, dispute múltiplos upstreams pela resposta mais rápida.
- Usuários que querem regras robustas de DNS na LAN: defina mapeamentos locais, wildcards DNS padrão, grupos por cliente, listas por grupo e upstreams por grupo.
- Usuários que querem alta disponibilidade simples: rode mais de uma instância do DNSao com o mesmo
application.ymle anuncie ambas via DNS do roteador/DHCP. Não há necessidade de cluster ou eleição de líder. - Usuários de homelab e self-hosting: nomeie serviços internos como
nas.home,grafana.labou*.lab.homesem rodar um DNS autoritativo separado. - Usuários que querem observabilidade DNS: inspecione histórico de queries, comportamento do cache, distribuição por upstream, latência de upstreams e saúde da JVM no dashboard.
- Usuários que querem uma stack DNS pequena e compreensível: configure um arquivo YAML e rode via Docker, systemd ou um JAR Java.
- Usuários que precisam de comportamento DNS diferente por cliente: aplique bloqueio mais rígido para TVs ou IoT, upstreams diferentes para clientes específicos e regras customizadas por grupo.
Se você está avaliando o DNSao contra Pi-hole, AdGuard Home ou Technitium DNS Server, veja Comparações.
Funcionalidades Principais¶
- Modos de servidor DNS UDP, TCP e HTTP
- Resolvedores upstream UDP, DoT e DoH
- Consulta paralela a upstreams com seleção da resposta mais rápida
- Cache consciente de TTL com cache negativo e rewarm assíncrono
- Políticas DNSSEC-aware:
off,simpleerigid - Mapeamentos locais com wildcards DNS padrão de um único rótulo
- Blocklists, allowlists e grupos de clientes
- Métricas e histórico de queries persistidos em SQLite por padrão
- Dashboard integrado para sumário, histórico de queries, estatísticas de upstream e VM stats
- Configuração em um único arquivo YAML
- Opções de instalação via Docker, script systemd e JAR manual
Objetivo¶
Outras ferramentas DNS normalmente focam em uma função: sinkhole, encaminhamento criptografado, cache ou métricas. O DNSao combina essas funções em um serviço pequeno configurado por um único arquivo application.yml.
Ele não é um servidor DNS autoritativo e não pretende substituir um resolvedor recursivo completo. Ele é um resolvedor encaminhador: clientes perguntam ao DNSao, e o DNSao responde a partir de regras locais/cache ou encaminha a query para upstreams.
Todo o código está disponível no GitHub do projeto, incluindo últimas releases e documentação de desenvolvimento.
Screenshots¶
Sumário De Queries¶
Gráfico Com Queries Por Horário¶
Distribuição De Upstreams¶
Benchmarks¶
Benchmarks de DNS podem ser um pouco injustos, porque depois da rajada inicial e de todos os domínios estarem cacheados, o exercício vira medir quão rápido a CPU consegue buscar algo da memória e empacotar corretamente a resposta. Ainda assim, algumas pessoas podem achar útil, então seguem testes usando dnsperf e uma lista de 250 domínios.
Primeiro em um LXC com um core de uma CPU recente (i5-12400), onde 10000 queries por segundo resulta em 100% de sucesso:
avital@texugo:~/temp$ dnsperf -s dnsao1.intranet -d domains.txt -l 1200 -Q 10000
DNS Performance Testing Tool
Version 2.14.0
[Status] Command line: dnsperf -s dnsao1.intranet -d domains.txt -l 1200 -Q 10000
[Status] Sending queries (to 192.168.68.128:53)
[Status] Started at: Sat Oct 25 10:30:23 2025
[Status] Stopping after 1200.000000 seconds
[Status] Testing complete (time limit)
Statistics:
Queries sent: 11997016
Queries completed: 11997016 (100.00%)
Queries lost: 0 (0.00%)
Response codes: NOERROR 10993096 (91.63%), NXDOMAIN 1003920 (8.37%)
Average packet size: request 30, response 267
Run time (s): 1200.000091
Queries per second: 9997.512575
Average Latency (s): 0.000414 (min 0.000093, max 0.503841)
Latency StdDev (s): 0.001498
E este em um Raspberry Pi 3, com a mesma lista domains.txt. Ao chegar em 100 queries por segundo, ele começa a mostrar seus limites:
avital@texugo:~/temp$ dnsperf -s dnsao2.intranet -d domains.txt -l 1200 -Q 50
DNS Performance Testing Tool
Version 2.14.0
[Status] Command line: dnsperf -s dnsao2.intranet -d domains.txt -l 1200 -Q 50
[Status] Sending queries (to 192.168.15.50:53)
[Status] Started at: Sat Oct 25 12:28:45 2025
[Status] Stopping after 1200.000000 seconds
[Status] Testing complete (time limit)
Statistics:
Queries sent: 60000
Queries completed: 60000 (100.00%)
Queries lost: 0 (0.00%)
Response codes: NOERROR 51968 (86.61%), NXDOMAIN 8032 (13.39%)
Average packet size: request 30, response 297
Run time (s): 1200.000098
Queries per second: 49.999996
Average Latency (s): 0.004377 (min 0.001777, max 0.258354)
Latency StdDev (s): 0.004117
avital@texugo:~/temp$ dnsperf -s dnsao2.intranet -d domains.txt -l 1200 -Q 100
DNS Performance Testing Tool
Version 2.14.0
[Status] Command line: dnsperf -s dnsao2.intranet -d domains.txt -l 1200 -Q 100
[Status] Sending queries (to 192.168.15.50:53)
[Status] Started at: Sat Oct 25 12:54:28 2025
[Status] Stopping after 1200.000000 seconds
Warning: received a response with an unexpected (maybe timed out) id: 24603
[Timeout] Query timed out: msg id 24602
[Timeout] Query timed out: msg id 11636
[Status] Testing complete (time limit)
Statistics:
Queries sent: 120000
Queries completed: 119998 (100.00%)
Queries lost: 2 (0.00%)
Response codes: NOERROR 103934 (86.61%), NXDOMAIN 16064 (13.39%)
Average packet size: request 30, response 276
Run time (s): 1200.000090
Queries per second: 99.998326
Average Latency (s): 0.004140 (min 0.001823, max 0.184822)
Latency StdDev (s): 0.002594