Every run used to write all three files (en.md, ru.md, json) unconditionally.
Default is now English Markdown only, sourced from output.formats in
config.yaml; --format/--ru/--json pick exactly what a run writes, and any
explicit --format replaces the default rather than adding to it (all/none
supported). write_report() moved from a fixed 3-positional-arg signature to
a {format: text} mapping so writes are conditional instead of always-three.
The en/ru Markdown cross-link header is now only set when both languages are
actually being written.
9.7 KiB
netsleuth
Кроссплатформенная CLI-утилита для глубокой диагностики сети: кто на самом деле ваш провайдер, действительно ли трафик идёт через VPN, где деградирует маршрут и что реально выдаёт канал.
$ netsleuth --quick
netsleuth 0.1.0 · auto mode · Windows
Verdict: ok (100/100) — No problems found on this connection.
Report written to logs/report_AS64500_20260808T191200Z.md
Всё остальное — ASN, вердикт по VPN, задержки, маршрут, скорость — попадает в только что записанный отчёт, а не в консоль; терминал показывает только заголовок и куда смотреть дальше. По умолчанию это один Markdown-файл на английском; --format управляет тем, что именно пишется (см. «Полезное» ниже).
Установка
Требования:
- Python 3.10 или новее
- Windows, Linux или macOS
- Доступ в интернет (netsleuth — сетевой инструмент; без сети он деградирует корректно, но сделает немного)
- Опционально: нативный бинарник Ookla
speedtestвPATH— лучший уровень замера скорости - Опционально:
mtrвPATH— лучшие данные по маршруту
git clone https://github.com/Horizontal42/netsleuth
cd netsleuth
uv sync
uv run netsleuth
Нужны --tcp-trace и --ndt7? Это опциональные extras, по умолчанию не ставятся:
uv sync --extra tcptrace --extra ndt7
Без uv:
python -m pip install -r requirements.txt
python -m pip install -e .
netsleuth
Настройка не требуется. Копируйте .env.example в .env только если у вас есть опциональные API-ключи.
Что он делает
- Идентификация — внешний IPv4 и IPv6, обратный DNS, ASN, организация, гео и тип адреса: домашний, мобильный, хостинговый или корпоративный. Проверяется по шести независимым источникам, поэтому один rate-limit не обнуляет результат.
- Оценка VPN/прокси — взвешенный вердикт (
none/likely/confirmed) из наличия туннельного интерфейса, аномалии MTU, расхождения шлюза и внешнего IP, флагов Cloudflare WARP, флагов proxy/hosting от провайдеров данных, типа сети в PeeringDB, расхождения таймзоны ОС и гео, а также несовпадения ASN DNS-резолвера. - Тест утечки DNS — перечисляет резолверы по каждому сетевому адаптеру, поэтому ловит классический случай, когда туннельный адаптер чистый, а на Wi-Fi-адаптере остался резолвер провайдера. Также определяет утечку EDNS Client Subnet.
- BGP-разведка — аплинки, пиры, клиенты, анонсируемые префиксы, стабильность маршрутов, присутствие на IX и размер клиентского конуса по CAIDA ASRank.
- Репутация — локально кэшируемые списки FireHOL (ни один запрос не покидает машину), экспозиция по Shodan InternetDB и опционально классические зоны DNSBL.
- Задержки и маршрут — статистика пингов по каждому хосту с настоящими джиттером/потерями/mdev и трассировка, которой никогда не нужны права администратора.
- Скорость — каскадный замер (бинарник Ookla → Cloudflare → fast.com → опционально M-Lab NDT7) с раздельными оценками bufferbloat на приём и передачу.
Полезное
| Флаг | Что делает |
|---|---|
--quick |
Экспресс-прогон ~10 с: только пинги эталонных хостов, без замера скорости |
--full |
60–120 с: полный замер скорости и полный MTR |
--target AS64500 / --target 64500 / --target 1.2.3.4 / --target example.com |
Исследовать конкретную сеть вместо своего подключения — префикс AS перед голым номером ASN необязателен |
--target-host <ip|domain> |
Добавить хост в веер пингов и трассировок |
--speedtest-server <id|url> |
Зафиксировать конкретный сервер замера скорости |
--watch |
Непрерывный мониторинг с живой панелью — чтобы поймать плавающие обрывы. Пишет один тайм-ряд logs/watch_*.json за сессию, а не отдельный отчёт на каждый тик |
--compare a.json b.json |
Сравнить два прошлых отчёта: до/после смены VPN, до/после звонка провайдеру. Только чтение — без проб и сетевых запросов. Читает отчёты, полученные с --format json |
--dnsbl |
Включить проверку по классическим зонам DNSBL |
--ndt7 |
Включить M-Lab NDT7 (замер публикуется как открытые данные CC0, включая ваш IP). В интерактивном терминале сначала печатает уведомление о согласии и спрашивает подтверждение; в неинтерактивном — продолжает без вопроса |
--tcp-trace |
Включить TCP-SYN-трассировку через scapy сквозь middlebox'ы, режущие ICMP (нужны extras tcptrace и Npcap на Windows или root на Unix). Если не может запуститься — откатывается на обычный каскад |
--format md,ru-md,json,all,none |
Выбрать, какие артефакты отчёта писать (по умолчанию: md). Повторяемый флаг и через запятую (--format md,json); любое использование заменяет дефолт, а не дополняет его. all пишет все три, none — ничего. Игнорируется с --watch/--compare |
--ru |
Сокращение для --format ru-md |
--json |
Сокращение для --format json |
Каждый прогон пишет в ./logs/ выбранные артефакты: Markdown-отчёт на английском, его полный перевод на русский (.ru.md — те же разделы, те же таблицы, те же числа, со взаимными ссылками, если пишутся оба) и/или JSON-дамп со всеми сырыми ответами провайдеров без усечения. По умолчанию — только английский Markdown; чтобы поменять дефолт навсегда, задайте output.formats в config.yaml, либо используйте --format на конкретном прогоне. ./logs/ в gitignore — отчёты содержат ваш внешний IP, город, координаты и название провайдера.
netsleuth никогда не требует администратора или root. Там, где привилегии дали бы данные лучше, он деградирует до непривилегированного метода и пишет об этом в отчёте.
Для разработчиков
Стек: Python 3.10+, Typer, Rich, httpx, pydantic-settings, dnspython, psutil, icmplib, ctypes.
uv sync --all-extras --group dev
uv run pytest -q
uv run netsleuth --quick
uv export --no-hashes --format requirements-txt -o requirements.txt # после изменения зависимостей
Архитектура, потоки данных и обоснование выбора каждого источника: ARCHITECTURE.ru.md.
Благодарности
netsleuth читает данные из RIPEstat, CAIDA ASRank, Team Cymru, PeeringDB, Cloudflare, ip-api.com, freeipapi.com, ipinfo.io, ipwho.is, Shodan InternetDB, проекта блоклистов FireHOL, Netflix fast.com и M-Lab. Все они используются в рамках бесплатных/безключевых тарифов.
Лицензия
PolyForm Noncommercial 1.0.0 — выбрана потому что источники репутации по умолчанию (Shodan InternetDB, свободные зеркала Spamhaus) разрешены только для некоммерческого использования; эта лицензия удерживает любой форк в тех же рамках.