
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
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.
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
--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.
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.
→YUL); para as demais, a coluna de localização é a região de origem do operador.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.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.
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.
| 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 |