netsleuth/README.ru.md
2026-08-08 21:21:29 +03:00

7.6 KiB
Raw Blame History

netcheck

English

Кроссплатформенная CLI-утилита для глубокой диагностики сети: кто на самом деле ваш провайдер, действительно ли трафик идёт через VPN, где деградирует маршрут и что реально выдаёт канал.

$ netcheck --quick
netcheck 0.1.0 · авто-режим · Windows

Соединение   Wi-Fi 2  ·  192.168.1.34  ·  MTU 1500  ·  шлюз 192.168.1.1
Внешний IP   203.0.113.44  (AS64500 Example Telecom, Амстердам NL)
VPN          нет           уверенность 0.10
Задержка     1.1.1.1  12.4 мс сред.  ·  джиттер 1.9 мс  ·  потери 0%
Вердикт      🟢 всё в порядке — проблем не найдено

Отчёт записан в logs/report_AS64500_20260808T191200Z.md
                 logs/report_AS64500_20260808T191200Z.json

Установка

Требования:

  • Python 3.10 или новее
  • Windows, Linux или macOS
  • Доступ в интернет (netcheck — сетевой инструмент; без сети он деградирует корректно, но сделает немного)
  • Опционально: нативный бинарник Ookla speedtest в PATH — лучший уровень замера скорости
  • Опционально: mtr в PATH — лучшие данные по маршруту
git clone https://github.com/<owner>/netcheck
cd netcheck
uv sync
uv run netcheck

Без uv:

python -m pip install -r requirements.txt
python -m pip install -e .
netcheck

Настройка не требуется. Копируйте .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 1.2.3.4 / --target example.com Исследовать конкретную сеть вместо своего подключения
--target-host <ip|domain> Добавить хост в веер пингов и трассировок
--speedtest-server <id|url> Зафиксировать конкретный сервер замера скорости
--watch Непрерывный мониторинг с живой панелью — чтобы поймать плавающие обрывы
--compare a.json b.json Сравнить два прошлых отчёта: до/после смены VPN, до/после звонка провайдеру
--dnsbl Включить проверку по классическим зонам DNSBL
--ndt7 Включить M-Lab NDT7 (замер публикуется как открытые данные CC0, включая ваш IP)
--tcp-trace Включить TCP-SYN-трассировку через scapy сквозь middlebox'ы, режущие ICMP (нужен Npcap или root)

Каждый прогон пишет в ./logs/ два файла: Markdown-отчёт для чтения и JSON-дамп со всеми сырыми ответами провайдеров без усечения. ./logs/ в gitignore — отчёты содержат ваш внешний IP, город, координаты и название провайдера.

netcheck никогда не требует администратора или 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 netcheck --quick
uv export --no-hashes --format requirements-txt -o requirements.txt   # после изменения зависимостей

Архитектура, потоки данных и обоснование выбора каждого источника: ARCHITECTURE.ru.md.

Благодарности

netcheck читает данные из RIPEstat, CAIDA ASRank, Team Cymru, PeeringDB, Cloudflare, ip-api.com, freeipapi.com, ipinfo.io, ipwho.is, Shodan InternetDB, проекта блоклистов FireHOL, Netflix fast.com и M-Lab. Все они используются в рамках бесплатных/безключевых тарифов.

Лицензия

Пока не выбрана — см. LICENSE. Выбор между MIT и Polyform Noncommercial; источники репутации по умолчанию (Shodan InternetDB, свободные зеркала Spamhaus) разрешены только для некоммерческого использования — в этом суть решения.