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