Files
2026-09-27 13:30:07 +00:00

1487 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.json
```
Откройте Zabbix:
```text
Data collection
→ Templates
→ Import
```
Выберите:
```text
rustdesk-template.json
```
Нажмите:
```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.