
Глобальный TUI-чекер распространения DNS — наблюдайте, как DNS-запись распространяется через 34 публичных резолвера по всему миру, на карте мира в вашем терминале.
# dnsglobe
[](https://crates.io/crates/dnsglobe)
[](https://aur.archlinux.org/packages/dnsglobe/)
[](https://aur.archlinux.org/packages/dnsglobe-bin/)
[](LICENSE)
**Глобальная проверка распространения DNS для вашего терминала** — TUI на Rust, который
параллельно опрашивает 34 публичных DNS-резолвера по всему миру, сравнивает их
ответы и показывает распространение вашей записи на карте мира.

Представьте dnschecker.org / whatsmydns.net, но в вашем терминале, с режимом наблюдения:
запустите проверку, и она будет повторять опрос, пока запись не распространится повсюду.
Резолверы охватывают глобальные anycast-сети (Google, Cloudflare, Quad9),
Северную Америку, Европу, Россию, Ближний Восток, Восточную Азию и южное
полушарие (Telstra AU, SafeSurfer NZ, UOL BR) — каждый опрашивается напрямую, поэтому
вы видите актуальное представление о записи с каждого сервера.
Каждый резолвер опрашивается напрямую (без кэша, EDNS0, TCP-fallback для
усечённых ответов), поэтому вы видите актуальное представление о записи с каждого
сервера. Ответы, содержащие любую общую запись, группируются вместе — так round-robin DNS
(каждый резолвер кэширует разный набор IP-адресов из пула) считается одним
согласованным ответом, а не двадцатью противоречащими. Индикатор распространения показывает,
сколько резолверов находится в группе большинства; выбросы помечаются
`≠ DIFFERS` после получения всех результатов.
Таблица умещается в терминал шириной 80 колонок: полный IPv4-адрес каждого резолвера,
время приёма-ответа, TTL и обратный отсчёт до истечения остаются нетронутыми, а вердикт
в строке сжимается до глифа на левом поле (`✓ ≠ ! ↻ ∅ ✗`), чтобы ответ
сохранял место. Обратный отсчёт намеренно грубый — `45s`, `4m`, `2h`, `1d`
— ведь колонка секунд, тикающих не в унисон, — это шум после минуты.
Когда терминал достаточно широк, справа появляется вид мира
с одной точкой на резолвер, окрашенной по статусу (зелёный — согласен, пурпурный — отличается,
красный — ошибка, жёлтый — в процессе). Вид адаптируется к ширине: терминалы ≥157
колонок получают плоскую карту мира, более узкие (≥131 колонок) — вращающийся 3D-
глобус, которому нужно меньше колонок; изменение размера через порог превращает одно
в другое. Ctrl+O вручную переключает карту/глобус, а `--view auto|map|globe`
(или `view = "..."` в файле конфигурации) принудительно задаёт стиль.
Каждый резолвер спрашивают, какой из его сайтов отвечает вам, через NSID
(RFC 5001) — опцию EDNS, которую отвечающий узел заполняет своим именем
(`gpdns-yul`, `yul01`, `res721.qyul1`, `jfk-dns1-02.inet.centurylink.net`).
Для этого не нужна поддержка конкретного оператора, поэтому добавленные вами резолверы тоже могут сообщать
сайт. Там, где NSID не называет место, вступают в силу оператор-специфичные идентификационные
запросы: Quad9 (`TXT id.server.on.quad9.net`), Cloudflare
(`CH TXT id.server`), Google (исходящая подсеть через
`TXT o-o.myaddr.l.google.com`, сопоставляемая с `TXT locations.publicdns.goog`),
OpenDNS (`TXT debug.opendns.com`), CleanBrowsing и Neustar UltraDNS. Обнаруженный
сайт показывается в колонке Loc в виде кодов стиля `→YUL`, а
точка резолвера на карте перемещается в POP, который фактически обслуживает ваши запросы.
## Использование
Установка:
```sh
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
```
Запуск:
```sh
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` (или `ecs = [...]` в файле конфигурации) добавляет опцию EDNS Client Subnet
([RFC 7871](https://datatracker.ietf.org/doc/html/rfc7871)) к каждому
запросу, поэтому зоны GeoDNS отвечают для этой клиентской сети, а не с
собственной точки обзора резолвера. Подсети задаются как CIDR или просто IP-адреса; большинство публичных
резолверов используют не более /24 (IPv4) или /56 (IPv6). Если настроено несколько подсетей,
Ctrl+N переключает активную (плюс позиция *выкл*) и
немедленно перезапрашивает; `--once` выполняет каждую подсеть и завершается
сводкой сходимости по каждой подсети. Резолверы, которые намеренно игнорируют ECS
(Cloudflare, Quad9, …), помечаются `NO ECS` — их ответ показывается для
справки, но исключается из процента распространения, поскольку описывает
их собственное местоположение, а не проверяемую сеть.
### Клавиши
| Key | Действие |
| -------------- | ------------------------------- |
| type / ⌫ / Del | изменить домен |
| ←/→ / Home/End | переместить курсор в поле домена |
| Enter | начать проверку и наблюдать: повторный опрос каждые 30 с, пока распространение не достигнет 100% |
| Ctrl+R | остановить или возобновить наблюдение |
| Tab / Shift-Tab | выбрать тип записи (A, AAAA, CNAME, MX, NS, TXT, SOA) и перезапросить |
| ↑/↓ / PgUp/PgDn | перемещать подсветку по таблице резолверов (прокрутка следует за курсором) |
| + | добавить резолвер для этой сессии (имя, IP, необязательно местоположение и позицию на карте) |
| Ctrl+X | удалить выделенный резолвер из этой сессии |
| Ctrl+S | циклически менять сортировку таблицы: резолвер / местоположение / пинг / статус / ответ |
| Ctrl+O | переключить вид мира между плоской картой и вращающимся глобусом |
| Ctrl+N | циклически переключать клиентскую подсеть ECS и перезапрашивать (только если `--ecs`/конфиг задаёт её) |
| Ctrl+U | очистить домен |
| Esc / Ctrl+C | выйти |
## Конфигурация
При желании вы можете добавить собственные резолверы — или полностью заменить встроенный список —
с помощью TOML-файла конфигурации в `~/.config/dnsglobe/config.toml`
(`$XDG_CONFIG_HOME/dnsglobe/config.toml`, если задан). Установите `DNSGLOBE_CONFIG`, чтобы
использовать другой путь.
```toml
# 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
```
Некорректная конфигурация (неверный IP, неизвестный ключ, нераспознанный цвет, неправильная подсеть `ecs`,
`lat` без `lon`, `replace = true` без резолверов) сообщается при
запуске с указанием проблемной записи.
## Примечания
- Несколько резолверов — это anycast-сети, поэтому отвечающий узел — ближайший к вам.
Сети, которые идентифицируют свой узел — через NSID или
идентификационный запрос, — сообщают фактический отвечающий сайт (`→YUL`); для
остальных в колонке местоположения указан домашний регион оператора.
- Встроенный список резолверов находится в `src/resolvers.rs`; используйте файл конфигурации
выше, чтобы расширить или заменить его без пересборки. Каждая встроенная запись была
проверена на ответы на внешние запросы; многие известные резолверы интернет-провайдеров (и,
в частности, все крупные африканские) отказывают в запросах извне своей сети,
поэтому их нельзя включить.
## Nix
Проект предоставляет опциональные выходные данные Nix flake для пользователей, которые уже используют Nix. Flake собирается из исходников.
```bash
# 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
```
Flake предоставляет `packages.<system>.default`, `apps.<system>.default`, `devShells.<system>.default` и `overlays.default`.
Обновляйтесь через тот же рабочий процесс Nix, который вы использовали для установки. Для установок через профиль выполните `nix profile list`, а затем `nix profile upgrade <index-or-name>`. Для входов flake выполните `nix flake update <repo>` в своём собственном flake и пересоберите.
## Devbox
Для воспроизводимых сред разработки используйте Devbox:
```bash
# 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
```
Или установите Devbox через Homebrew:
```bash
brew install jetify-com/devbox/devbox
```
---
Сделано с ❤️ командой, работающей над [514.ax](https://www.514.ax).