
dnsglobe v0.5.0
Verificador global de propagação de DNS com TUI — veja um registro DNS se propagar por 34 resolvedores públicos em todo o mundo, em um mapa-múndi no seu terminal
dnsglobe
Um verificador global de propagação de DNS para o seu terminal — uma TUI em Rust que consulta 34 resolvedores DNS públicos ao redor do mundo em paralelo, compara as respostas e mostra a propagação do seu registro em um mapa-múndi.

Pense no dnschecker.org / whatsmydns.net, mas no seu terminal, com o modo de observação: inicie uma verificação e ele fará novas consultas até que o registro tenha se propagado em todos os lugares.
Os resolvedores abrangem as redes anycast globais (Google, Cloudflare, Quad9), América do Norte, Europa, Rússia, Oriente Médio, Leste Asiático e o hemisfério sul (Telstra AU, SafeSurfer NZ, UOL BR) — cada um consultado diretamente, para que você veja a visão atual de cada servidor sobre o registro.
Cada resolvedor é consultado diretamente (sem cache, EDNS0, fallback TCP para respostas truncadas), então o que você vê é a visão atual de cada servidor sobre o registro. Respostas que compartilham qualquer registro são agrupadas — assim, DNS round-robin (cada resolvedor armazenando em cache um subconjunto diferente de um pool de IPs) conta como uma resposta consistente, não vinte conflitantes. O medidor de propagação mostra quantos resolvedores estão no grupo majoritário; os discrepantes são sinalizados com ≠ DIFFERS quando todos os resultados chegam.
A tabela cabe em um terminal de 80 colunas: o endereço IPv4 completo de cada resolvedor, o tempo de ida e volta, o TTL e a contagem regressiva de expiração permanecem intactos, e o veredito de cada linha se reduz ao glifo na margem esquerda (✓ ≠ ! ↻ ∅ ✗) para que a resposta mantenha o espaço. A contagem regressiva é propositalmente grosseira — 45s, 4m, 2h, 1d — pois uma coluna de segundos dessincronizados é ruído acima de um minuto.
Quando o terminal é largo o suficiente, uma visão do mundo aparece à direita com um ponto por resolvedor, colorido por status (verde concorda, magenta difere, vermelho erro, amarelo em andamento). A visão se adapta à largura: terminais com ≥157 colunas recebem um mapa-múndi plano; os mais estreitos (≥131 colunas) recebem um globo 3D giratório, que precisa de menos colunas; redimensionar através do limite transforma um no outro. Ctrl+O alterna mapa/globo manualmente, e --view auto|map|globe (ou view = "..." no arquivo de configuração) força um estilo diretamente.
Cada resolvedor é questionado sobre qual de seus sites está respondendo para você, via NSID (RFC 5001) — uma opção EDNS que o nó respondedor preenche com seu próprio nome (gpdns-yul, yul01, res721.qyul1, jfk-dns1-02.inet.centurylink.net). Isso não exige suporte por operador, então resolvedores que você adicionar também podem informar um site. Quando o NSID não indica nenhum lugar, as consultas de identificação específicas do operador assumem: Quad9 (TXT id.server.on.quad9.net), Cloudflare (CH TXT id.server), Google (sub-rede de saída via TXT o-o.myaddr.l.google.com comparada com TXT locations.publicdns.goog), OpenDNS (TXT debug.opendns.com), CleanBrowsing e Neustar UltraDNS. O site descoberto aparece na coluna Loc como códigos no estilo →YUL, e o ponto do resolvedor no mapa se move para o POP que está de fato atendendo suas consultas.
Uso
Instalação:
brew install 514-labs/tap/dnsglobe # Homebrew (macOS/Linux)
cargo install dnsglobe # from crates.io
yay -S dnsglobe # from archlinux aur (compile from source)
yay -S dnsglobe-bin # from archlinux aur (install prebuilt binary)
nix run github:514-labs/dnsglobe # Nix flakes (builds from source)
# or grab a prebuilt binary from the GitHub Releases page
Execução:
dnsglobe # start empty, type a domain
dnsglobe example.com # query immediately and watch
dnsglobe example.com TXT # same, starting on TXT records
dnsglobe --once example.com TXT # no TUI: print results, exit (for scripts)
dnsglobe example.com --ecs 203.0.113.0/24 # see the zone as that client network does
dnsglobe --once example.com --ecs 203.0.113.0/24,198.51.100.0/24
# one table per subnet + a convergence summary
EDNS Client Subnet (ECS)
--ecs (ou ecs = [...] no arquivo de configuração) anexa uma opção EDNS Client Subnet (RFC 7871) a cada consulta, para que zonas GeoDNS respondam para aquela rede de cliente em vez do ponto de observação do próprio resolvedor. Sub-redes são CIDRs ou IPs simples; a maioria dos resolvedores públicos usa no máximo /24 (IPv4) ou /56 (IPv6). Com várias sub-redes configuradas, Ctrl+N alterna a ativa (além de uma posição off) e faz novas consultas imediatamente; --once executa cada sub-rede e termina com um resumo de convergência por sub-rede. Resolvedores que ignoram deliberadamente o ECS (Cloudflare, Quad9, …) são marcados como NO ECS — a resposta deles é exibida para referência, mas excluída do percentual de propagação, pois descreve a localização deles próprios, não a rede sondada.
Teclas
| Key | Action |
|---|---|
| type / ⌫ / Del | editar domínio |
| ←/→ / Home/End | mover o cursor no campo de domínio |
| Enter | iniciar a verificação e observar: re-consulta a cada 30 s até a propagação atingir 100% |
| Ctrl+R | parar ou retomar a observação |
| Tab / Shift-Tab | selecionar o tipo de registro (A, AAAA, CNAME, MX, NS, TXT, SOA) e re-consultar |
| ↑/↓ / PgUp/PgDn | mover o destaque pela tabela de resolvedores (rola para acompanhar) |
| + | adicionar um resolvedor para esta sessão (nome, IP, localização opcional e posição no mapa) |
| Ctrl+X | remover o resolvedor destacado desta sessão |
| Ctrl+S | alternar a ordenação da tabela: resolvedor / localização / ping / status / resposta |
| Ctrl+O | alternar a visão do mundo entre mapa plano e globo giratório |
| Ctrl+N | alternar a sub-rede de cliente ECS e re-consultar (somente quando --ecs/config tiver definido uma) |
| Ctrl+U | limpar domínio |
| Esc / Ctrl+C | sair |
Configuração
Opcionalmente, adicione seus próprios resolvedores — ou substitua a lista embutida por completo — com um arquivo de configuração TOML em ~/.config/dnsglobe/config.toml ($XDG_CONFIG_HOME/dnsglobe/config.toml se definido). Defina DNSGLOBE_CONFIG para usar um caminho diferente.
# Set to true to replace the built-in list instead of extending it —
# e.g. to watch propagation across your own nameservers only.
replace = false
# EDNS Client Subnet(s) to query with (Ctrl+N cycles; --ecs overrides).
ecs = ["203.0.113.0/24"]
# World-view style: auto (default — pick by terminal width), map, or globe.
# The --view flag overrides this.
view = "auto"
[[resolvers]]
name = "Corp DNS" # required — shown in the Resolver column
ip = "10.0.0.53" # required — IPv4 or IPv6, queried on port 53
location = "HQ" # optional — Loc column / location sort
lat = 40.7 # optional — position on the world map;
lon = -74.0 # omit both to leave it off the map
[[resolvers]]
name = "NS1 (public)"
ip = "198.51.100.53"
# Optionally recolor the UI. Every key is optional; unset roles keep their
# defaults. Colors are ANSI names ("lightcyan"), 256-color indexes ("208"),
# or hex ("#ff8700" — needs truecolor support).
[theme]
accent = "lightcyan" # borders, titles, cursor, anycast sites
agree = "lightgreen" # answers matching the majority; fast latency
differ = "lightmagenta" # answers disagreeing with the majority
error = "white on lightred"
# ERR / SERVFAIL / NONE; slow latency. Written
# "<fg> on <bg>", it becomes a filled badge on the
# status glyph and word — legible on any background;
# a plain color like "lightred" drops the badge
pending = "lightyellow" # queries in flight; middling latency
stale = "208" # caches serving an answer past its own TTL
upstream = "lightblue" # refetched but upstream still has the old data
muted = "faint" # labels, hints, countdowns, quiet borders —
# "faint" dims your terminal's default foreground;
# set a color if your terminal renders faint poorly
coastline = "gray" # map/globe land outline
grid = "244" # globe graticule and limb
Configuração inválida (IP incorreto, chave desconhecida, cor não reconhecida, sub-rede ecs inválida, lat sem lon, replace = true sem resolvedores) é relatada na inicialização com o nome da entrada problemática.
Notas
- Vários resolvedores são redes anycast, então o nó que responde é o mais próximo de você. Redes que identificam seu nó — via NSID ou uma consulta de identificação — informam o site que realmente respondeu (
→YUL); para as demais, a coluna de localização é a região de origem do operador. - A lista de resolvedores embutidos fica em
src/resolvers.rs; use o arquivo de configuração acima para estendê-la ou substituí-la sem recompilar. Cada entrada embutida foi verificada para responder a consultas externas; muitos resolvedores conhecidos de ISPs (e, notavelmente, todos os grandes da África) recusam consultas vindas de fora de sua rede, então não podem ser incluídos.
Nix
O projeto oferece saídas opcionais de Nix flake para usuários que já usam Nix. O flake compila a partir do código-fonte.
# Latest source from default branch
nix run github:514-labs/dnsglobe
# Specific release (uses the flake at that git tag)
nix run github:514-labs/dnsglobe/v0.4.0
# Named outputs (if the flake exposes them): #latest, #source
nix run github:514-labs/dnsglobe#source
# Build / develop
nix build github:514-labs/dnsglobe
nix develop github:514-labs/dnsglobe
O flake expõe packages.<system>.default, apps.<system>.default, devShells.<system>.default e overlays.default.
Atualize usando o mesmo fluxo de trabalho do Nix que você usou para instalar. Para instalações em perfil, execute nix profile list e depois nix profile upgrade <index-or-name>. Para entradas de flake, execute nix flake update <repo> no seu próprio flake e recompile.
Devbox
Para ambientes de desenvolvimento reproduzíveis, use o Devbox:
# Install Devbox first (if not already installed)
curl -fsSL https://get.jetify.dev/devbox | bash
# Initialize the environment
devbox shell
# Build the project
devbox run build
Ou instale o Devbox via Homebrew:
brew install jetify-com/devbox/devbox
Feito com ❤️ pelo pessoal que trabalha no 514.ax.