# netsleuth [English](README.md) Кроссплатформенная CLI-утилита для глубокой диагностики сети: кто на самом деле ваш провайдер, действительно ли трафик идёт через VPN, где деградирует маршрут и что реально выдаёт канал. ```console $ 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 logs/report_AS64500_20260808T191200Z.ru.md logs/report_AS64500_20260808T191200Z.json ``` Всё остальное — ASN, вердикт по VPN, задержки, маршрут, скорость — попадает в три только что записанных файла, а не в консоль; терминал показывает только заголовок и куда смотреть дальше. ## Установка Требования: - Python 3.10 или новее - Windows, Linux или macOS - Доступ в интернет (netsleuth — сетевой инструмент; без сети он деградирует корректно, но сделает немного) - Опционально: нативный бинарник Ookla `speedtest` в `PATH` — лучший уровень замера скорости - Опционально: `mtr` в `PATH` — лучшие данные по маршруту ```bash git clone https://github.com//netsleuth cd netsleuth uv sync uv run netsleuth ``` Нужны `--tcp-trace` и `--ndt7`? Это опциональные extras, по умолчанию не ставятся: ```bash uv sync --extra tcptrace --extra ndt7 ``` Без `uv`: ```bash 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 ` | Добавить хост в веер пингов и трассировок | | `--speedtest-server ` | Зафиксировать конкретный сервер замера скорости | | `--watch` | Непрерывный мониторинг с живой панелью — чтобы поймать плавающие обрывы. Пишет один тайм-ряд `logs/watch_*.json` за сессию, а не отдельный отчёт на каждый тик | | `--compare a.json b.json` | Сравнить два прошлых отчёта: до/после смены VPN, до/после звонка провайдеру. Только чтение — без проб и сетевых запросов | | `--dnsbl` | Включить проверку по классическим зонам DNSBL | | `--ndt7` | Включить M-Lab NDT7 (замер публикуется как открытые данные CC0, включая ваш IP). В интерактивном терминале сначала печатает уведомление о согласии и спрашивает подтверждение; в неинтерактивном — продолжает без вопроса | | `--tcp-trace` | Включить TCP-SYN-трассировку через scapy сквозь middlebox'ы, режущие ICMP (нужны extras `tcptrace` и Npcap на Windows или root на Unix). Если не может запуститься — откатывается на обычный каскад | Каждый прогон пишет в `./logs/` три файла: Markdown-отчёт на английском, его полный перевод на русский (`.ru.md` — те же разделы, те же таблицы, те же числа, со взаимными ссылками) и JSON-дамп со всеми сырыми ответами провайдеров без усечения. `./logs/` в gitignore — отчёты содержат ваш внешний IP, город, координаты и название провайдера. netsleuth никогда не требует администратора или root. Там, где привилегии дали бы данные лучше, он деградирует до непривилегированного метода и пишет об этом в отчёте. ## Для разработчиков Стек: Python 3.10+, Typer, Rich, httpx, pydantic-settings, dnspython, psutil, icmplib, ctypes. ```bash 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](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](LICENSE) — выбрана потому что источники репутации по умолчанию (Shodan InternetDB, свободные зеркала Spamhaus) разрешены только для некоммерческого использования; эта лицензия удерживает любой форк в тех же рамках.