netsleuth/README.ru.md
Andrew Pimenov 4ffc39906b add --format/--ru/--json flags to control which report artifacts get written
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.
2026-08-09 13:00:13 +03:00

9.7 KiB
Raw Blame History

netsleuth

English

Кроссплатформенная 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) разрешены только для некоммерческого использования; эта лицензия удерживает любой форк в тех же рамках.