# RustDesk Server OSS + Zabbix 7.4 Monitoring Пошаговая установка мониторинга RustDesk Server OSS для Zabbix 7.4. ## Что мониторируется - количество зарегистрированных RustDesk ID; - IP зарегистрированных RustDesk ID; - автоматическое обнаружение RustDesk ID через LLD; - количество TCP-соединений `hbbr`; - количество активных relay-сессий; - IP активных relay-клиентов. --- # 1. Требования Необходимо: - Linux Server; - Docker; - RustDesk Server OSS; - Zabbix Agent 2; - Zabbix Server 7.4.x; - `sudo`; - `nsenter`; - `ss`; - `jq`. Проверить: ```bash command -v docker command -v sudo command -v nsenter command -v ss command -v jq ``` Если какой-либо команды нет, установите её через пакетный менеджер вашей ОС. --- # 2. Проверка RustDesk Server Предполагается, что RustDesk Server работает в Docker и содержит два контейнера: ```text hbbs hbbr ``` Проверить: ```bash docker ps ``` Должно быть примерно: ```text CONTAINER ID IMAGE NAMES xxxxxxxx rustdesk/rustdesk-server:latest hbbs xxxxxxxx rustdesk/rustdesk-server:latest hbbr ``` Проверить порт `hbbr`: ```bash docker port hbbr ``` Ожидается: ```text 21117/tcp -> 0.0.0.0:21117 21117/tcp -> [::]:21117 ``` --- # 3. Проверка hbbr Получить PID контейнера: ```bash docker inspect -f '{{.State.Pid}}' hbbr ``` Например: ```text 744150 ``` Проверить активные TCP-соединения внутри network namespace `hbbr`: ```bash nsenter \ -t "$(docker inspect -f '{{.State.Pid}}' hbbr)" \ -n \ ss -H -tn state established '( sport = :21117 )' ``` Если активных relay-сессий нет, команда может ничего не вывести. При наличии одной relay-сессии будет примерно: ```text 0 0 172.27.0.3:21117 91.221.35.119:2624 0 0 172.27.0.3:21117 194.58.38.147:63060 ``` --- # 4. Скачивание проекта Клонируйте репозиторий: ```bash git clone https://github.com/YOUR_USER/rustdesk-zabbix.git ``` Перейдите в каталог: ```bash cd rustdesk-zabbix ``` Структура проекта: ```text rustdesk-zabbix/ ├── README.md ├── rustdesk-monitor.sh ├── rustdesk-monitor-root ├── zabbix/ │ ├── rustdesk.conf │ └── rustdesk-template.yaml └── sudoers/ └── zabbix-rustdesk ``` --- # 5. Установка основного скрипта Скопируйте основной скрипт: ```bash sudo cp rustdesk-monitor.sh /usr/local/bin/rustdesk-monitor.sh ``` Установите владельца: ```bash sudo chown root:root /usr/local/bin/rustdesk-monitor.sh ``` Установите права: ```bash sudo chmod 755 /usr/local/bin/rustdesk-monitor.sh ``` Проверьте: ```bash ls -l /usr/local/bin/rustdesk-monitor.sh ``` Ожидается: ```text -rwxr-xr-x root root ... /usr/local/bin/rustdesk-monitor.sh ``` --- # 6. Проверка основного скрипта Проверьте количество зарегистрированных RustDesk ID: ```bash /usr/local/bin/rustdesk-monitor.sh peers ``` Например: ```text 10 ``` Проверьте IP конкретного RustDesk ID: ```bash /usr/local/bin/rustdesk-monitor.sh peer_ip 473224838 ``` Например: ```text 194.58.38.147 ``` --- # 7. Проверка Low-Level Discovery Выполните: ```bash /usr/local/bin/rustdesk-monitor.sh discovery ``` Должен вернуться JSON-массив: ```json [ { "{#RD_ID}": "335008209", "{#RD_IP}": "95.64.175.202" }, { "{#RD_ID}": "262961257", "{#RD_IP}": "89.175.70.58" } ] ``` Проверить JSON через `jq`: ```bash /usr/local/bin/rustdesk-monitor.sh discovery | jq empty ``` Проверить код возврата: ```bash echo $? ``` Должно быть: ```text 0 ``` --- # 8. Установка root helper Для мониторинга активных соединений `hbbr` нужен доступ к network namespace контейнера. Пользователь `zabbix` не имеет права самостоятельно выполнять `nsenter`. Поэтому используется отдельный helper: ```text /usr/local/sbin/rustdesk-monitor-root ``` Установите его: ```bash sudo cp rustdesk-monitor-root /usr/local/sbin/rustdesk-monitor-root ``` Установите владельца: ```bash sudo chown root:root /usr/local/sbin/rustdesk-monitor-root ``` Установите права: ```bash sudo chmod 755 /usr/local/sbin/rustdesk-monitor-root ``` Проверьте: ```bash ls -l /usr/local/sbin/rustdesk-monitor-root ``` Должно быть: ```text -rwxr-xr-x root root ... /usr/local/sbin/rustdesk-monitor-root ``` --- # 9. Проверка root helper ## Connections ```bash sudo /usr/local/sbin/rustdesk-monitor-root connections ``` При одной активной relay-сессии: ```text 2 ``` ## Sessions ```bash sudo /usr/local/sbin/rustdesk-monitor-root sessions ``` Результат: ```text 1 ``` ## Active relay IPs ```bash sudo /usr/local/sbin/rustdesk-monitor-root relay_ips ``` Например: ```text 194.58.38.147 91.221.35.119 ``` --- # 10. Настройка sudo для пользователя zabbix Создайте файл: ```bash sudo nano /etc/sudoers.d/zabbix-rustdesk ``` Добавьте: ```sudoers zabbix ALL=(root) NOPASSWD: /usr/local/sbin/rustdesk-monitor-root connections zabbix ALL=(root) NOPASSWD: /usr/local/sbin/rustdesk-monitor-root sessions zabbix ALL=(root) NOPASSWD: /usr/local/sbin/rustdesk-monitor-root relay_ips ``` Сохраните файл. Установите права: ```bash sudo chmod 440 /etc/sudoers.d/zabbix-rustdesk ``` Проверьте конфигурацию sudo: ```bash sudo visudo -c ``` Должно быть: ```text /etc/sudoers: parsed OK /etc/sudoers.d/zabbix-rustdesk: parsed OK ``` --- # 11. Проверка helper от имени zabbix Теперь обязательно проверьте выполнение именно от пользователя `zabbix`. ## Connections ```bash sudo -u zabbix sudo /usr/local/sbin/rustdesk-monitor-root connections ``` Ожидается: ```text 2 ``` ## Sessions ```bash sudo -u zabbix sudo /usr/local/sbin/rustdesk-monitor-root sessions ``` Ожидается: ```text 1 ``` ## Relay IPs ```bash sudo -u zabbix sudo /usr/local/sbin/rustdesk-monitor-root relay_ips ``` Например: ```text 194.58.38.147 91.221.35.119 ``` Если эти три команды работают — права настроены правильно. --- # 12. Установка конфигурации Zabbix Agent 2 Скопируйте: ```bash sudo cp zabbix/rustdesk.conf \ /etc/zabbix/zabbix_agent2.d/rustdesk.conf ``` Проверьте: ```bash cat /etc/zabbix/zabbix_agent2.d/rustdesk.conf ``` Конфигурация должна выглядеть так: ```ini UserParameter=rustdesk.peers,/usr/local/bin/rustdesk-monitor.sh peers UserParameter=rustdesk.peer.ip[*],/usr/local/bin/rustdesk-monitor.sh peer_ip "$1" UserParameter=rustdesk.discovery,/usr/local/bin/rustdesk-monitor.sh discovery UserParameter=rustdesk.relay.connections,sudo /usr/local/sbin/rustdesk-monitor-root connections UserParameter=rustdesk.relay.sessions,sudo /usr/local/sbin/rustdesk-monitor-root sessions UserParameter=rustdesk.relay.ips,sudo /usr/local/sbin/rustdesk-monitor-root relay_ips UserParameter=rustdesk.json,/usr/local/bin/rustdesk-monitor.sh json ``` --- # 13. Перезапуск Zabbix Agent 2 Выполните: ```bash sudo systemctl restart zabbix-agent2 ``` Проверьте: ```bash sudo systemctl status zabbix-agent2 --no-pager ``` Сервис должен иметь статус: ```text active (running) ``` --- # 14. Проверка Zabbix Agent 2 ## Registered peers ```bash zabbix_agent2 -t rustdesk.peers ``` Пример: ```text rustdesk.peers [s|10] ``` --- ## Peer IP Проверить конкретный ID: ```bash zabbix_agent2 -t 'rustdesk.peer.ip[473224838]' ``` Пример: ```text rustdesk.peer.ip[473224838] [s|194.58.38.147] ``` --- ## Discovery ```bash zabbix_agent2 -t rustdesk.discovery ``` Ожидается JSON: ```text rustdesk.discovery [s|[ { "{#RD_ID}": "335008209", "{#RD_IP}": "95.64.175.202" } ]] ``` --- ## Relay connections ```bash zabbix_agent2 -t rustdesk.relay.connections ``` Пример: ```text rustdesk.relay.connections [s|2] ``` --- ## Relay sessions ```bash zabbix_agent2 -t rustdesk.relay.sessions ``` Пример: ```text rustdesk.relay.sessions [s|1] ``` --- ## Relay IPs ```bash zabbix_agent2 -t rustdesk.relay.ips ``` Пример: ```text rustdesk.relay.ips [s|194.58.38.147 91.221.35.119] ``` --- # 15. Установка Zabbix Template В репозитории должен находиться файл: ```text zabbix/rustdesk-template.yaml ``` Откройте Zabbix: ```text Data collection → Templates → Import ``` Выберите: ```text rustdesk-template.yaml ``` Нажмите: ```text Import ``` После успешного импорта откройте: ```text Data collection → Templates ``` Найдите: ```text RustDesk Server OSS ``` --- # 16. Привязка Template к Host Откройте: ```text Data collection → Hosts ``` Выберите сервер RustDesk. Перейдите: ```text Templates → Link new templates ``` Выберите: ```text RustDesk Server OSS ``` Нажмите: ```text Update ``` --- # 17. Проверка Items После привязки Template откройте: ```text Data collection → Hosts → RustDesk host → Items ``` Должны появиться основные items. ## Registered peers ```text Name: RustDesk registered peers Key: rustdesk.peers Type: Zabbix agent Type of information: Numeric (unsigned) ``` --- ## Relay connections ```text Name: RustDesk relay connections Key: rustdesk.relay.connections Type: Zabbix agent Type of information: Numeric (unsigned) ``` --- ## Relay sessions ```text Name: RustDesk active relay sessions Key: rustdesk.relay.sessions Type: Zabbix agent Type of information: Numeric (unsigned) ``` --- ## Active relay IPs ```text Name: RustDesk active relay IPs Key: rustdesk.relay.ips Type: Zabbix agent Type of information: Text ``` --- # 18. Проверка Latest data Откройте: ```text Monitoring → Hosts → RustDesk host → Latest data ``` Найдите: ```text RustDesk registered peers ``` Например: ```text 10 ``` Найдите: ```text RustDesk relay connections ``` Например: ```text 2 ``` Найдите: ```text RustDesk active relay sessions ``` Например: ```text 1 ``` Найдите: ```text RustDesk active relay IPs ``` Например: ```text 194.58.38.147 91.221.35.119 ``` --- # 19. Настройка Low-Level Discovery Откройте: ```text Data collection → Hosts → RustDesk host → Discovery ``` Должно присутствовать правило: ```text RustDesk peer discovery ``` Key: ```text rustdesk.discovery ``` Update interval: ```text 5m ``` --- # 20. Проверка Discovery Откройте: ```text Discovery → RustDesk peer discovery ``` Проверьте: ```text Discovered entities ``` Для каждого найденного RustDesk ID должны появиться соответствующие entities. Например: ```text 335008209 262961257 392618968 440059160 ... ``` --- # 21. Item Prototype для IP клиентов Discovery использует следующие макросы: ```text {#RD_ID} {#RD_IP} ``` Item Prototype: ```text Name: RustDesk peer {#RD_ID} IP Key: rustdesk.peer.ip[{#RD_ID}] Type: Zabbix agent Type of information: Text ``` После работы Discovery Zabbix автоматически создаст items: ```text RustDesk peer 335008209 IP RustDesk peer 262961257 IP RustDesk peer 392618968 IP ... ``` --- # 22. Создание Dashboard Откройте: ```text Dashboards ``` Создайте новый Dashboard: ```text Create dashboard ``` Например: ```text RustDesk Monitoring ``` --- # 23. Dashboard — Active Sessions Добавьте Widget: ```text Add widget → Item value ``` Настройте: ```text Name: Active relay sessions Host: RustDesk host Item: RustDesk active relay sessions Refresh interval: 30s ``` На Dashboard будет отображаться: ```text Active relay sessions 1 ``` --- # 24. Dashboard — Relay Connections Добавьте второй Widget: ```text Add widget → Item value ``` Настройте: ```text Name: Relay connections Host: RustDesk host Item: RustDesk relay connections Refresh interval: 30s ``` Например: ```text Relay connections 2 ``` --- # 25. Dashboard — Active Relay IPs Добавьте: ```text Add widget → Item history ``` Настройте: ```text Name: Active relay IPs Host: RustDesk host Item: RustDesk active relay IPs Refresh interval: 30s Show lines: 10 ``` На Dashboard будет: ```text Active relay IPs 194.58.38.147 91.221.35.119 ``` --- # 26. Как работает подсчёт relay sessions `hbbr` слушает: ```text TCP/21117 ``` Одна relay-сессия обычно создаёт два TCP-соединения. Например: ```text 172.27.0.3:21117 → 91.221.35.119:2624 172.27.0.3:21117 → 194.58.38.147:63060 ``` Получаем: ```text connections = 2 sessions = 1 ``` Поэтому скрипт рассчитывает: ```text sessions = connections / 2 ``` --- # 27. Active Relay IPs Команда: ```bash /usr/local/sbin/rustdesk-monitor-root relay_ips ``` получает активные соединения: ```bash ss -H -tn state established ``` в network namespace контейнера `hbbr`. Из remote endpoint извлекается IP. Например: ```text 91.221.35.119:2624 194.58.38.147:63060 ``` Преобразуется в: ```text 91.221.35.119 194.58.38.147 ``` Затем выполняется сортировка и удаление дубликатов. --- # 28. Ограничение NAT Active relay IP нельзя всегда сопоставить с конкретным RustDesk ID. Например: ```text 194.58.38.147 ├── RustDesk ID 473224838 ├── RustDesk ID 440059160 └── RustDesk ID 317773715 ``` Все три устройства могут находиться за одним NAT. Поэтому: ```text rustdesk.relay.ips ``` показывает только: ```text уникальные IP активных relay-клиентов ``` а не: ```text RustDesk ID активной сессии ``` --- # 29. Диагностика: нет данных Проверь Docker: ```bash docker ps ``` Проверь `hbbr`: ```bash docker inspect -f '{{.State.Pid}}' hbbr ``` Проверь relay: ```bash docker logs --tail 100 hbbr ``` Проверь connections: ```bash sudo /usr/local/sbin/rustdesk-monitor-root connections ``` Проверь sessions: ```bash sudo /usr/local/sbin/rustdesk-monitor-root sessions ``` Проверь IP: ```bash sudo /usr/local/sbin/rustdesk-monitor-root relay_ips ``` --- # 30. Диагностика: Operation not permitted Если: ```text nsenter: reassociate to namespaces failed: Operation not permitted ``` проверь: ```bash sudo -u zabbix sudo \ /usr/local/sbin/rustdesk-monitor-root connections ``` Если команда возвращает число: ```text 2 ``` значит права настроены правильно. Проверь sudo: ```bash sudo visudo -c ``` Проверь: ```bash cat /etc/sudoers.d/zabbix-rustdesk ``` --- # 31. Диагностика: Numeric unsigned Если Zabbix показывает: ```text Value of type "string" is not suitable for value type "Numeric (unsigned)" ``` проверь: ```bash zabbix_agent2 -t rustdesk.relay.connections ``` Правильный результат: ```text rustdesk.relay.connections [s|2] ``` Неправильный результат: ```text rustdesk.relay.connections [s|nsenter: reassociate to namespaces failed: Operation not permitted 0] ``` В этом случае проверь выполнение: ```bash sudo -u zabbix sudo \ /usr/local/sbin/rustdesk-monitor-root connections ``` --- # 32. Диагностика: Item Unsupported Если item имеет статус: ```text Unsupported ``` проверь Agent: ```bash sudo systemctl status zabbix-agent2 --no-pager ``` Проверь конфигурацию: ```bash cat /etc/zabbix/zabbix_agent2.d/rustdesk.conf ``` После изменения: ```bash sudo systemctl restart zabbix-agent2 ``` Затем: ```bash zabbix_agent2 -t rustdesk.relay.connections ``` --- # 33. Полная проверка после установки Выполните: ```bash echo "===== DOCKER =====" docker ps echo echo "===== PEERS =====" /usr/local/bin/rustdesk-monitor.sh peers echo echo "===== DISCOVERY =====" /usr/local/bin/rustdesk-monitor.sh discovery | jq . echo echo "===== RELAY CONNECTIONS =====" /usr/local/sbin/rustdesk-monitor-root connections echo echo "===== RELAY SESSIONS =====" /usr/local/sbin/rustdesk-monitor-root sessions echo echo "===== RELAY IPs =====" /usr/local/sbin/rustdesk-monitor-root relay_ips echo echo "===== ZABBIX AGENT =====" zabbix_agent2 -t rustdesk.peers zabbix_agent2 -t rustdesk.discovery zabbix_agent2 -t rustdesk.relay.connections zabbix_agent2 -t rustdesk.relay.sessions zabbix_agent2 -t rustdesk.relay.ips ``` --- # 34. Ожидаемый результат Пример: ```text ===== DOCKER ===== hbbs hbbr ===== PEERS ===== 10 ===== DISCOVERY ===== [ { "{#RD_ID}": "335008209", "{#RD_IP}": "95.64.175.202" }, ... ] ===== RELAY CONNECTIONS ===== 2 ===== RELAY SESSIONS ===== 1 ===== RELAY IPs ===== 194.58.38.147 91.221.35.119 ===== ZABBIX AGENT ===== rustdesk.peers [s|10] rustdesk.discovery [s|[ ... ]] rustdesk.relay.connections [s|2] rustdesk.relay.sessions [s|1] rustdesk.relay.ips [s|194.58.38.147 91.221.35.119] ``` --- # 35. Быстрая установка Если все файлы уже находятся в репозитории, установка сводится к: ```bash git clone https://github.com/YOUR_USER/rustdesk-zabbix.git cd rustdesk-zabbix sudo cp rustdesk-monitor.sh \ /usr/local/bin/rustdesk-monitor.sh sudo cp rustdesk-monitor-root \ /usr/local/sbin/rustdesk-monitor-root sudo chown root:root \ /usr/local/bin/rustdesk-monitor.sh \ /usr/local/sbin/rustdesk-monitor-root sudo chmod 755 \ /usr/local/bin/rustdesk-monitor.sh \ /usr/local/sbin/rustdesk-monitor-root sudo cp zabbix/rustdesk.conf \ /etc/zabbix/zabbix_agent2.d/rustdesk.conf sudo cp sudoers/zabbix-rustdesk \ /etc/sudoers.d/zabbix-rustdesk sudo chmod 440 \ /etc/sudoers.d/zabbix-rustdesk sudo visudo -c sudo systemctl restart zabbix-agent2 ``` После этого проверить: ```bash zabbix_agent2 -t rustdesk.peers zabbix_agent2 -t rustdesk.discovery zabbix_agent2 -t rustdesk.relay.connections zabbix_agent2 -t rustdesk.relay.sessions zabbix_agent2 -t rustdesk.relay.ips ``` Затем импортировать: ```text zabbix/rustdesk-template.yaml ``` в Zabbix и привязать Template к RustDesk host. --- # 36. Итог После установки Zabbix получает: ```text rustdesk.peers │ └── количество зарегистрированных ID rustdesk.peer.ip[ID] │ └── IP конкретного зарегистрированного ID rustdesk.discovery │ └── автоматическое обнаружение ID rustdesk.relay.connections │ └── TCP connections hbbr rustdesk.relay.sessions │ └── активные relay sessions rustdesk.relay.ips │ └── IP активных relay-клиентов rustdesk.json │ └── общая информация ``` Готовый Dashboard: ```text ┌─────────────────────────────────────┐ │ ACTIVE RELAY SESSIONS │ │ 1 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ RELAY CONNECTIONS │ │ 2 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ ACTIVE RELAY IPs │ │ │ │ 194.58.38.147 │ │ 91.221.35.119 │ └─────────────────────────────────────┘ ``` --- ## License RustDesk является отдельным проектом. Данный проект мониторинга не является официальным компонентом RustDesk.