
Отслеживайте активность Bluetooth в вашем районе
Bluetooth Neighborhood — отслеживайте BLE-устройства поблизости и анализируйте шаблоны трафика.
ВНИМАНИЕ: Альфа-версия ПО
Этот проект находится на ранней стадии разработки и не готов к использованию в production. Функции могут меняться, ломаться или удаляться без предупреждения. Используйте на свой риск. Собранные данные следует считать экспериментальными.
Главная панель со списком устройств, фильтрацией, поиском и статистикой в реальном времени
Страница конфигурации с вкладками — Alerts, Operations, Groups и Security
Страница Intel с информацией о проекте и обзором возможностей
Этот проект был вдохновлён уязвимостью WhisperPair (CVE-2025-36911), которая высветила риски для приватности в Bluetooth-устройствах.
Тысячи Bluetooth-устройств окружают нас постоянно: телефоны, автомобили, телевизоры, наушники, слуховые аппараты, машины доставки и многое другое. Bluehood демонстрирует, насколько просто пассивно обнаруживать эти устройства и наблюдать закономерности их присутствия.
Имея достаточно данных, вы потенциально можете:
Эти метаданные могут раскрыть на удивление личную информацию без какого-либо активного взаимодействия с устройствами.
Bluehood — это образовательный инструмент для повышения осведомлённости о приватности Bluetooth. Это проект на выходные, но его последствия стоит обдумать.
Bluehood — это Bluetooth-сканер, который:
? для просмотра)Предварительные требования — только для Linux-хостов
Bluehood взаимодействует с вашим Bluetooth-адаптером через BlueZ, стек Bluetooth для Linux. BlueZ должен быть установлен и запущен на хосте перед запуском контейнера — сам Docker-образ его не включает.
# Debian / Ubuntu (включая Ubuntu Server) sudo apt install bluez sudo systemctl enable --now bluetooth # Arch Linux sudo pacman -S bluez bluez-utils sudo systemctl enable --now bluetoothБез BlueZ на хосте вы увидите ошибку вида:
BLE scan error: [org.freedesktop.DBus.Error.ServiceUnknown] The name org.bluez was not provided by any .service files
# Create a docker-compose.yml or download the one from this repo
# Then start with Docker Compose
docker compose up -d
# View logs
docker compose logs -f
Docker-образ доступен в GitHub Container Registry:
ghcr.io/dannymcc/bluehood:latest
Веб-панель будет доступна по адресу http://localhost:8080
sudo apt install bluez && sudo systemctl enable --now bluetooth)Примечание: Старые адаптеры (Bluetooth 2.x/3.x) не поддерживают BLE-сканирование. Если ваш адаптер не поддерживает роль BLE Central, вы увидите:
No Bluetooth adapters with BLE 'central' role found.
Примечание: Docker работает в привилегированном режиме с host networking для доступа к Bluetooth. Это необходимо для BLE-сканирования.
Bluehood требует BLE-совместимый Bluetooth-адаптер (Bluetooth 4.0 или новее) с поддержкой роли Central. Старые адаптеры Bluetooth 2.x/3.x не поддерживают BLE-сканирование и не будут работать.
Если ваш адаптер не поддерживает роль BLE Central, Bluehood завершится с сообщением:
No Bluetooth adapters with BLE 'central' role found
Вы можете проверить возможности адаптера с помощью bluetoothctl show и поискать central среди поддерживаемых ролей.
# Install system dependencies (Arch Linux)
sudo pacman -S bluez bluez-utils python-pip
# Install system dependencies (Debian/Ubuntu)
sudo apt install bluez python3-pip
# Clone and install
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
pip install -e .
Bluetooth-сканирование требует повышенных привилегий. Выберите один из вариантов:
Запуск от root (проще всего):
sudo bluehood
Предоставление capabilities Python:
sudo setcap 'cap_net_admin,cap_net_raw+eip' $(readlink -f $(which python))
bluehood
Использование systemd-сервиса (рекомендуется для постоянной работы):
sudo cp bluehood.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now bluehood
Bluehood работает нативно на macOS без Docker. macOS использует CoreBluetooth вместо BlueZ, что автоматически обрабатывается библиотекой bleak.
# Clone the repository
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
# Create a virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install
pip install -e .
# Run
python -m bluehood.daemon
Веб-панель будет доступна по адресу http://localhost:8080
Примечание: При первом запуске macOS запросит разрешение на доступ к Bluetooth. Вы должны предоставить это разрешение, чтобы сканирование работало.
# Start with web dashboard (default port 8080)
bluehood
# Specify a different port (or set BLUEHOOD_PORT)
bluehood --port 9000
# Use a specific Bluetooth adapter
bluehood --adapter hci1
# Use separate adapters for BLE and classic scanning (concurrent)
bluehood --adapter hci0 --classic-adapter hci1
# List available adapters
bluehood --list-adapters
# Disable web dashboard (scanning only)
bluehood --no-web
# Enable Prometheus metrics exporter on port 9199
bluehood --metrics-port 9199
Панель предоставляет:
/settings#operations)Включите режим скриншота на боковой панели, чтобы обфусцировать конфиденциальные данные перед публикацией скриншотов:
AA:BB:XX:XX:XX:XX)Da********)Bluehood может отправлять push-уведомления через ntfy — бесплатный сервис уведомлений с открытым исходным кодом. Вы можете использовать публичный сервер ntfy.sh или собственный самостоятельно размещённый экземпляр.
bluehood-myname-alerts) или на своём сервере ntfyhttps://ntfy.sh), имя темы и токен доступа, если ваш сервер его требует, затем включите уведомленияДанные хранятся в ~/.local/share/bluehood/bluehood.db (SQLite).
Переопределите расположение с помощью переменных окружения:
BLUEHOOD_DATA_DIR — каталог для файлов данныхBLUEHOOD_DB_PATH — прямой путь к файлу базы данныхПримечание: Настройки heartbeat и очистки можно задать из веб-интерфейса (Settings > Operations) или через переменные окружения. Значения GUI имеют приоритет над переменными окружения.
Bluehood классифицирует устройства, используя несколько сигналов (в порядке приоритета):
Современные устройства рандомизируют свои MAC-адреса для приватности. Bluehood:
Bluehood анализирует временные метки наблюдений для обнаружения шаблонов:
Примеры шаблонов: «Ежедневно, вечера (17:00–21:00)», «Будни, утро (8:00–12:00)»
Bluehood обнаруживает устройства, которые часто появляются вместе в настраиваемом временном окне. Это может выявить:
На основе силы сигнала RSSI устройства классифицируются по зонам близости:
Отслеживает, как долго устройства находятся в зоне действия, анализируя промежутки между наблюдениями. Настраиваемый порог разрыва (по умолчанию 15 минут) определяет, когда начинается новая «сессия».
Bluehood может предоставлять метрики для сбора Prometheus. Включите, установив переменную окружения BLUEHOOD_METRICS_PORT или флаг CLI --metrics-port.
# Via environment variable
export BLUEHOOD_METRICS_PORT=9199
# Via CLI
bluehood --metrics-port 9199
Метрики доступны по адресу http://host:9199/metrics.
Готовая к импорту панель Grafana включена в grafana/bluehood-dashboard.json. Импортируйте её через UI Grafana (Dashboards > Import) или API:
curl -X POST "http://localhost:3000/api/dashboards/db" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d "{\"dashboard\": $(cat grafana/bluehood-dashboard.json), \"overwrite\": true}"
bluetoothctl power onbluehood --list-adaptersBLE scan error: org.freedesktop.DBus.Error.ServiceUnknown / The name org.bluez was not provided
BlueZ не установлен или не запущен на хосте. Исправление:
sudo apt install bluez # Debian/Ubuntu
sudo systemctl enable --now bluetooth
docker compose restart
Общий чек-лист:
systemctl status bluetoothbluetoothctl listВклад приветствуется! Пожалуйста, откройте issue или PR на GitHub.
MIT License — подробности см. в LICENSE.
Этот инструмент предназначен только для образовательных целей. Соблюдайте законы о приватности в вашей юрисдикции при мониторинге Bluetooth-устройств. Автор не несёт ответственности за любое неправомерное использование этого программного обеспечения.
Создано Danny McClelland
| Переменная | По умолчанию | Описание |
|---|
PUID | 1000 | UID пользователя контейнера — установите в соответствии с вашим пользователем хоста (id -u) при использовании bind mounts |
PGID | 1000 | GID пользователя контейнера — установите в соответствии с вашей группой хоста (id -g) при использовании bind mounts |
TZ | UTC | Часовой пояс контейнера (например, Europe/London) |
BLUEHOOD_ADAPTER | auto | Bluetooth-адаптер для BLE-сканирования (например, hci0) |
BLUEHOOD_CLASSIC_ADAPTER | same as BLUEHOOD_ADAPTER | Отдельный адаптер для сканирования classic Bluetooth (например, hci1). Если установлен другой адаптер, BLE- и classic-сканирование выполняются одновременно. |
BLUEHOOD_DATA_DIR | /data | Каталог хранения базы данных |
BLUEHOOD_PORT | 8080 | Порт веб-панели. Контейнер использует host networking, поэтому измените это значение (а не маппинг портов), если 8080 занят |
BLUEHOOD_NTFY_SERVER | https://ntfy.sh | Базовый URL сервера ntfy для push-уведомлений; укажите самостоятельно размещённый экземпляр. Значение, сохранённое на странице Settings, имеет приоритет |
BLUEHOOD_METRICS_PORT | disabled | Порт метрик Prometheus (например, 9199) |
BLUEHOOD_HEARTBEAT_URL | disabled | URL для POST heartbeat check-in (например, push URL healthchecks.io или uptime-kuma) |
BLUEHOOD_HEARTBEAT_INTERVAL | 300 | Секунды между heartbeat check-in |
BLUEHOOD_PRUNE_DAYS | 0 (disabled) | Автоудаление наблюдений старше N дней для освобождения хранилища |
BLUEHOOD_PRUNE_MIN_SIGHTINGS | 0 (disabled) | Если >0, удалять целые устаревшие устройства (старше BLUEHOOD_PRUNE_DAYS и с общим числом наблюдений меньше N) вместо простой обрезки старых строк наблюдений; отслеживаемые устройства никогда не удаляются |
| Клавиша | Действие |
|---|
/ | Фокус на строке поиска |
r | Обновить список устройств |
c | Переключить компактный вид |
w | Переключить отслеживание выбранного устройства |
Esc | Закрыть модальное окно |
? | Показать горячие клавиши |
| Метрика | Тип | Описание |
|---|
bluehood_scans_total | Counter | Всего завершённых циклов сканирования |
bluehood_scan_errors_total | Counter | Ошибки сканирования (метка: scan_type) |
bluehood_sightings_total | Counter | Всего зафиксированных наблюдений устройств |
bluehood_new_devices_total | Counter | Обнаружено новых уникальных устройств |
bluehood_last_scan_devices | Gauge | Устройств в последнем сканировании (метка: scan_type) |
bluehood_devices_total | Gauge | Уникальных устройств в БД (метка: bt_type) |
bluehood_devices_active | Gauge | Устройств, замеченных за последние 5 минут |
bluehood_devices_watched | Gauge | Количество отслеживаемых устройств |
bluehood_devices_ignored | Gauge | Количество игнорируемых устройств |
bluehood_scan_duration_seconds | Histogram | Длительность цикла сканирования |
bluehood_device_rssi_dbm | Histogram | Распределение RSSI BLE-устройств |
bluehood_build_info | Info | Информация о версии |