Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
shadow-fleet-tracker-light — Трекер теневого флота Балтийского моря с открытым исходным кодом. 1200+ судов, живые данные AIS, оповещения о приближении к кабелям. Никаких облаков, никакой подписки, работает локально. | Kitploit
Инструменты/GitHubGitHub/formerlab/shadow-fleet-tracker-light
OSINT (Разведка открытых источников)РазведкаКартирование сетиСетевая криминалистикаЭксфильтрация данныхФорензикаСбор информацииЦифровая криминалистикаРазведка угроз

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Реагирование на Инциденты
Анализ DNS
Анализ Журналов
GitHubformerlab/shadow-fleet-tracker-light

shadow-fleet-tracker-light

Трекер теневого флота Балтийского моря с открытым исходным кодом. 1200+ судов, живые данные AIS, оповещения о приближении к кабелям. Никаких облаков, никакой подписки, работает локально.

Репозиторий
423 месяцев назадПроверено Kitploit

Shadow Fleet Tracker Light

License: MIT

Мониторинг теневого флота Балтийского моря через живые данные AIS. Отслеживает 1200+ судов из каталога War&Sanctions ГУР Украины через WebSocket-канал AISStream, отображает позиции на самообновляющейся карте, отмечает близость к подводным кабелям и обнаруживает паттерны перевалки грузов Россия↔Запад.

Бесплатно, с открытым исходным кодом, работает локально. Никакого облака, подписка не требуется, кроме бесплатного API-ключа AISStream.

Часть инструментария суверенной разведки Former Lab.


Поддержать Former Lab

Shadow Fleet Tracker Light создан и поддерживается командой Former Lab — суверенные вычисления, создание открытых инструментов, ориентированных на конфиденциальность, на старом оборудовании, без венчурного финансирования.

Если этот инструмент оказался вам полезен, подумайте о поддержке на Patreon. Доступен бесплатный тариф с 7-дневной пробной версией платных тарифов. Всегда поддерживайте Украину!

patreon.com/FormerLab

Статья в блоге о трекере, скриншоты и подробности: https://www.patreon.com/posts/153285871


Быстрый старт

root@kitploit:~
git clone https://github.com/FormerLab/shadow-fleet-tracker-light.git
cd shadow-fleet-tracker-light
pip install -r requirements.txt
export AISSTREAM_API_KEY=your_key_here   # бесплатно на aisstream.io
python shadow_tracker.py &
uvicorn webserver:app --host 0.0.0.0 --port 8000

Откройте http://localhost:8000 — карта доступна по адресу /map.

Пользователи Windows: см. раздел Настройка для синтаксиса переменных окружения в PowerShell/cmd.

Пользователи Linux / macOS могут использовать start.sh. Пользователи Windows — start.bat или start.ps1 — оба скрипта открывают трекер и панель в отдельных окнах и запускают браузер автоматически.


Что он делает

  • Подключается к WebSocket AISStream и подписывается на ограничивающий прямоугольник Балтийского моря
  • Фильтрует поток по списку наблюдения из 1200+ MMSI судов, полученному из каталога ГУР Украины (Vessels1.db)
  • Отображает живые позиции и маршрутные треки на карте Folium/Leaflet, обновляемой каждые 3 минуты
  • Оповещает, когда судно приближается к сегменту кабеля на расстояние менее 10 км (из filtered_cables.kml)
  • Обнаруживает длительное нахождение в районе — суда, движущиеся медленно или стоящие на месте 20+ минут в фиксированной зоне
  • Обнаруживает паттерны перевалки — суда, заходившие в российские порты, а затем в западные хабы (или наоборот) в течение 21 дня
  • Записывает все данные о позициях в SQLite для анализа в автономном режиме
  • Тёплый перезапуск из журнала позиций — карта заполняется сразу при запуске последними известными позициями, без ожидания
  • Предоставляет панель управления FastAPI для просмотра журнала, анализа судов, экспорта GPX, проверки перевалки и интерактивного повтора маршрута

Карта

Тёмная базовая карта CartoDB с наложенными кабельными маршрутами зелёным цветом. Маркеры судов обновляются каждые 3 минуты с живым обратным отсчётом до следующего обновления — страница перезагружается автоматически. Всплывающие окна показывают MMSI, IMO, флаг, скорость, курс, пункт назначения и глубокие ссылки на MarineTraffic, VesselFinder и War&Sanctions. Статус санкций OpenSanctions отображается, если настроен API-ключ.

Известные названия судов из Vessels1.db отображаются сразу при первом появлении, без ожидания статического сообщения AIS.

При запуске карта заполняется данными за последние 24 часа из журнала позиций. Суда, ещё не замеченные в текущем сеансе, отображаются серыми маркерами с пометкой «последний раз видели Xh назад» — они переходят в живой цвет по мере поступления новых пингов.


Файлы

root@kitploit:~
shadow_tracker.py          Основной процесс — потребитель WS, рендеринг карты, запись в БД
loitering_module.py        Обнаружение длительного нахождения и аннотация карты
transshipment_module.py    Обнаружение заходов в порты и маркировка перевалки Россия↔Запад
webserver.py               Панель управления FastAPI
gur_scrape.py              Одноразовый скрапер — построение отображения IMO→GUR-ID + полный каталог судов
check.py                   Предстартовые проверки — версия Python, зависимости, API-ключ, сеть
start.sh                   Запускатор для Linux / macOS
start.bat                  Запускатор для Windows (Command Prompt)
start.ps1                  Запускатор для Windows (PowerShell)
requirements.txt           Зависимости

Vessels1.db                Список наблюдения — 1200+ судов (MMSI + IMO + название, где известно)
vessel_data_log.db         Журнал позиций — во время выполнения, только добавление
vessel_static.db           Кэш статических данных AIS (название, пункт назначения, история флага)
transshipment.db           Журнал заходов в порты и событий перевалки
loitering_events.db        События длительного нахождения
filtered_cables.kml        Геометрия подводных кабелей Балтийского моря
cables.kml                 Полный набор данных о кабелях (исходный источник до фильтрации)
gur_mapping.json           Отображение IMO→GUR-ID (создаётся gur_scrape.py, опционально)
gur_vessels_full.json      Полный каталог ГУР — GUR-ID→{imo, mmsi, name, flag} (создаётся gur_scrape.py)

Список наблюдения

Vessels1.db — канонический список отслеживаемых судов. Более 1200 записей из каталога War&Sanctions ГУР Украины, охватывающих танкеры и грузовые суда, идентифицированные как часть российского теневого флота или причастные к гибридной деятельности в Балтийском море.

Список включает суда, недавно захваченные или перехваченные балтийскими властями:

MMSI скорректированы по текущим данным AIS — суда теневого флота часто меняют флаг. Файл update_vessels_2026_03.sql документирует все изменения с указанием источников.

Список наблюдения намеренно открыт. Добавляйте суда напрямую в Vessels1.db во время работы трекера — они будут подхвачены в течение 5 минут без перезапуска.

Linux / macOS:

root@kitploit:~
sqlite3 Vessels1.db "INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'НАЗВАНИЕ СУДНА');"

Windows (без CLI sqlite3):

root@kitploit:~
import sqlite3
conn = sqlite3.connect("Vessels1.db")
conn.execute("INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'НАЗВАНИЕ СУДНА')")
conn.commit()
conn.close()

Модель данных

Vessels1.db — список наблюдения

root@kitploit:~
vessels(mmsi TEXT PK, imo TEXT, name TEXT, destination TEXT)

vessel_data_log.db — журнал позиций

root@kitploit:~
vessel_data_log(timestamp, mmsi, name, imo, destination, speed, heading, latitude, longitude, cable_alert)

Только добавление. Записывается при каждом цикле рендеринга карты.

vessel_static.db — кэш статических данных AIS

root@kitploit:~
vessel_static(mmsi TEXT PK, name TEXT, imo TEXT, destination TEXT, flag TEXT)
flag_history(id, mmsi, flag, timestamp)

Заполняется из живых сообщений AIS ShipStaticData. Приоритет выше, чем у названий из Vessels1.db, после получения. flag_history записывает каждую смену флага с отметкой времени — события перерегистрации флага регистрируются и отображаются на странице конкретного судна.

loitering_events.db — журнал длительного нахождения (создаётся во время выполнения)

root@kitploit:~
loitering_events(id, mmsi, timestamp, latitude, longitude, near_cable)

transshipment.db — журнал заходов в порты и перевалки (создаётся во время выполнения)

root@kitploit:~
port_calls(id, mmsi, name, port, port_type, entry_ts, exit_ts, min_speed)
transshipment_events(id, mmsi, name, direction, from_port, from_exit_ts,
                     to_port, to_entry_ts, days_between, detected_ts)

Требования

  • Python 3.11 или новее — python.org/downloads
  • API-ключ AISStream — бесплатно на aisstream.io (зарегистрируйтесь, затем скопируйте ключ из панели управления)
  • Зависимости из requirements.txt

Скрипты запуска

Самый простой способ запустить трекер. Каждый скрипт устанавливает зависимости, выполняет предстартовые проверки и запускает оба процесса.

Linux / macOS:

root@kitploit:~
chmod +x start.sh
export AISSTREAM_API_KEY=your_key_here
./start.sh

Windows (PowerShell):

root@kitploit:~
$env:AISSTREAM_API_KEY = "your_key_here"
.\start.ps1

Windows (Command Prompt):

root@kitploit:~
set AISSTREAM_API_KEY=your_key_here
start.bat

Все три скрипта сначала запускают check.py — предстартовую проверку, которая проверяет версию Python, зависимости, файлы данных, API-ключ и доступность сети, выводя понятные сообщения об ошибках, если чего-то не хватает.

Вы также можете запустить предстартовую проверку отдельно в любое время:

root@kitploit:~
python check.py

Настройка (вручную)

1. Клонирование и установка зависимостей

root@kitploit:~
git clone https://github.com/FormerLab/shadow-fleet-tracker-light.git
cd shadow-fleet-tracker-light
pip install -r requirements.txt

На Ubuntu 22.04+ и Debian 12+ может появиться ошибка «externally managed environment» от pip. Скрипты запуска обрабатывают это автоматически, создавая виртуальное окружение — просто запустите start.sh, и он все сделает. Если устанавливаете вручную, сначала создайте виртуальное окружение:

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate   # Linux/macOS
.venv\Scripts\activate      # Windows
pip install -r requirements.txt

2. Установите API-ключ AISStream

Linux / macOS:

root@kitploit:~
export AISSTREAM_API_KEY=your_key_here
export OPENSANCTIONS_API_KEY=your_key_here  # опционально

Windows (Command Prompt):

root@kitploit:~
set AISSTREAM_API_KEY=your_key_here
set OPENSANCTIONS_API_KEY=your_key_here

Windows (PowerShell):

root@kitploit:~
$env:AISSTREAM_API_KEY = "your_key_here"
$env:OPENSANCTIONS_API_KEY = "your_key_here"

3. Запустите трекер и панель в двух отдельных терминалах

Терминал 1 — потребитель AIS-потока:

root@kitploit:~
python shadow_tracker.py

Терминал 2 — веб-панель:

root@kitploit:~
uvicorn webserver:app --host 0.0.0.0 --port 8000

4. Откройте панель управления

root@kitploit:~
http://localhost:8000

Живая карта доступна по адресу http://localhost:8000/map и обновляется каждые 3 минуты. При первом запуске карта отображается немедленно из любой уже имеющейся в базе истории позиций — без ожидания.


API-ключи

СервисОбязательныйБесплатный тарифСсылка
AISStreamДаДа — безлимитно для некоммерческого использования

Без OPENSANCTIONS_API_KEY трекер работает в обычном режиме — значки санкций просто не отображаются во всплывающих окнах карты.


Конфигурация

Все настраиваемые параметры находятся в начале файла shadow_tracker.py:

Переменные окружения:

ПеременнаяОбязательнаяОписание
AISSTREAM_API_KEYДаAPI-ключ WebSocket AISStream
OPENSANCTIONS_API_KEYНетВключает проверку санкций во всплывающих окнах карты

OpenSanctions бесплатен для некоммерческого использования — зарегистрируйтесь на opensanctions.org/api. Без ключа трекер работает в обычном режиме; поля санкций не отображаются во всплывающих окнах.


Глубокие ссылки War&Sanctions (опционально)

war-sanctions.gur.gov.ua — это публичный каталог ГУР Украины, содержащий суда теневого флота и находящиеся под санкциями. Каждое судно имеет пронумерованную страницу с историей заходов в порты, картами и сведениями о санкциях.

gur_scrape.py создаёт локальное отображение IMO→GUR-ID, однократно обходя каталог:

root@kitploit:~
python gur_scrape.py

В результате создаётся gur_mapping.json. Трекер загружает его при запуске и использует прямые глубокие ссылки (/en/transport/ships/{id}) во всплывающих окнах карты, где это возможно, а для судов, ещё не добавленных в каталог, выполняет поиск по сайту Google.

Обход охватывает около 1600 записей с задержкой 1.5 с/запрос (~40 мин). Повторяйте время от времени по мере роста каталога — используйте --start, чтобы возобновить с определённого ID:

root@kitploit:~
python gur_scrape.py --start 1580

Для отладки одной страницы:

root@kitploit:~
python gur_scrape.py --probe 1517

gur_mapping.json перезагружается автоматически каждые 5 минут одновременно со списком наблюдения — перезапуск трекера после повторного обхода не требуется.

Пороги длительного нахождения в loitering_module.py:

КонстантаПо умолчаниюОписание

Настройки перевалки в transshipment_module.py:

КонстантаПо умолчаниюОписание

Охватываемые портовые зоны:

ПортТип
Усть-Луга, Приморск, Санкт-Петербург, ВыборгРоссийские экспортные терминалы
Скау/Скаген, Гётеборг, Киль, Копенгаген, ОрхусЗападные хабы перевалки

Панель управления

Страница конкретного судна

На странице каждого судна (/vessel/<mmsi>) отображаются:

  • Повтор маршрута — интерактивная карта Leaflet с кнопками воспроизведения/паузы/сброса и регулятором скорости. Трейл строится точка за точкой; маркер становится красным при пингах с предупреждением о кабеле
  • Сводка — первое/последнее появление, общее количество пингов, количество предупреждений о кабеле, количество пробелов в AIS, наблюдаемые пункты назначения
  • Отключения AIS — любой пробел ≥60 минут с отметками начала/конца и продолжительностью
  • Близость к кабелю — процент пингов, при которых было активно предупреждение о кабеле
  • Изменения статических данных — смены названия, смены флага с датами, история пунктов назначения. Смена флага — основная тактика уклонения теневого флота
  • GPX-экспорт — полный трек с временными метками, загружаемый в любой ГИС-инструмент

Страница перевалки

Отмечает два паттерна, выводимых из данных о позициях:

  • RU→WEST — судно заходило в российский порт, а затем в западный хаб в течение 21 дня. Возможное «отмывание» грузов для попадания в европейские цепочки поставок
  • WEST→RU — судно заходило в западный хаб, а затем в российский порт в течение 21 дня. Возможный поток европейских товаров на восток на подсанкционную территорию

Заходы в порты выводятся из данных о позициях — внешний API не требуется. Судно должно находиться внутри портовой зоны со скоростью <1,5 узла как минимум для 2 пингов, чтобы заход был зарегистрирован. Это показывает паттерн, а не окончательный вердикт.


Данные о кабелях

filtered_cables.kml получен из наборов данных с открытым исходным кодом и является приблизительным — не подходит для точных расчётов близости. Порог оповещения в 10 км учитывает эту погрешность. Приветствуются улучшения геометрии кабелей.


Архитектурные заметки

Трекер выполняет один асинхронный цикл поверх WebSocket-потока. Состояние хранится в памяти (vessel_info, static_cache) и сбрасывается в SQLite при каждом цикле рендеринга. Карта записывается атомарно через os.replace, чтобы избежать обслуживания частичного файла.

При запуске warm_restart() считывает последние WARM_RESTART_HOURS часов из vessel_data_log.db и предварительно заполняет vessel_info до подключения WebSocket. Начальная карта отображается немедленно. Устаревшие позиции визуально отличаются (серые маркеры, приглушённые треки) и переходят в живой цвет по мере поступления новых пингов.

Список наблюдения и gur_mapping.json перезагружаются с диска каждые 5 минут — суда можно добавлять, а отображение ГУР повторно обходить во время работы трекера без перезапуска.

Веб-сервер не имеет состояния и читает напрямую из файлов SQLite — общей памяти с процессом трекера нет.


Статус

Скачать инструмент
СудноIMOСобытие
EAGLE S9329760Захвачено Финляндией, дек. 2024 — саботаж кабеля Estlink-2, найдено шпионское оборудование
EVENTIN9308065Захвачено Германией, янв.–мар. 2025 — дрейфовал у Рюгена, конфисковано 100 000 т российской нефти
KIWALA9332810Задержано Эстонией, апр. 2025 — без флага, под санкциями ЕС/Великобритании
JAGUAR9293002Перехвачено Эстонией, май 2025 — Россия подняла Су-35 для эскорта
KIRA K9346720Экипаж Wagner/ГРУ подтверждён на борту, дек. 2025
QENDIL9310525Экипаж Wagner/ГРУ, сен. 2025 — удар украинского дрона, дек. 2025
FITBURG9250397Захвачено Финляндией, 31 дек. 2025 — саботаж кабеля Хельсинки–Таллин
CAFFA9143611Захвачено Швецией, 6 мар. 2026 — украденное украинское зерно, ложный флаг
SEA OWL I9321172Захвачено Швецией, 12 мар. 2026 — под санкциями ЕС, ложный флаг Коморских островов
aisstream.io
OpenSanctionsНетДа — некоммерческое использованиеopensanctions.org/api
КонстантаЗначение по умолчаниюОписание
BALTIC_BBOX52.65–66°N, 9–30°EОграничивающий прямоугольник подписки AISStream
CABLE_ALERT_KM10Порог близости к кабелю
MAP_RENDER_INTERVAL180 сЧастота обновления карты
MMSI_RELOAD_INTERVAL300 сПерезагрузка списка наблюдения из БД
WARM_RESTART_HOURS24Количество часов истории позиций для загрузки при запуске
RECONNECT_DELAY10 сЗадержка повторного подключения к WebSocket
SPEED_THRESHOLD_KN
0.5 узла
Ниже этого значения считается остановкой
TIME_THRESHOLD_S1200 сПродолжительность, после которой фиксируется длительное нахождение
RADIUS_THRESHOLD_KM0.5 кмМаксимальный дрейф, чтобы считаться той же точкой
SPEED_THRESHOLD_KN
1.5 узла
Ниже этого значения внутри портовой зоны считается заходом
MIN_PINGS_IN_ZONE2Минимальное количество пингов перед регистрацией захода
WINDOW_DAYS21Максимальное количество дней между заходами для маркировки как перевалки
МаршрутОписание
/Просмотр журнала в реальном времени, автообновление каждые 60 с.
/mapПоследняя отрендеренная карта (совместимо с iframe)
/analyzeТаблица записей судов с фильтрацией и экспортом CSV
/timelineОбзор активности — по одной карточке на отслеживаемое судно, отсортировано по последнему появлению
/vessel/<mmsi>История конкретного судна: отключения AIS, близость к кабелям, смены флага, экспорт GPX
/vessel/<mmsi>/gpxЭкспорт GPX-трека — открывается в QGIS, OpenStreetMap, GPSBabel
/loiteringСобытия длительного нахождения с пометкой о близости к кабелю, сводка по судам, экспорт CSV
/transshipmentПаттерны заходов Россия↔Запад — события RU→WEST и WEST→RU, экспорт CSV
/log/downloadЗагрузка необработанного файла журнала
КомпонентСостояние
Потребитель AIS-потокаРаботает
Список наблюдения1200+ судов (полный каталог ГУР)
Оповещение о близости к кабелюРаботает
Обнаружение длительного нахожденияРаботает
Обнаружение перевалкиРаботает — заходы в порты выводятся из позиций, окно 21 день
Рендеринг картыРаботает — интервал 3 мин, обратный отсчёт, автообновление
Тёплый перезапускРаботает — предварительное заполнение карты из логов за последние 24 часа при запуске
Всплывающие окна судовПрямые ссылки на MarineTraffic + VesselFinder + War&Sanctions (1337 судов сопоставлены)
Всплывающие окна судовСтатус санкций OpenSanctions (опционально, требуется API-ключ)
Обнаружение смены флагаРаботает — фиксирует изменения, хранит в flag_history
Панель — журнал, суда, экспорт CSVРаботает
Панель — временная шкалаРаботает
Панель — история судна + GPXРаботает
Панель — повтор маршрутаРаботает — воспроизведение/пауза/сброс, управление скоростью, подсветка предупреждений о кабеле
Панель — страница длительного нахожденияРаботает
Панель — страница перевалкиРаботает