RMM Agent BSD (OPNsense)
FreeBSD/OPNsense Agent für das RMM-System. Läuft als OPNsense-Plugin und liefert Systemdaten via Heartbeat sowie Remote-Commands über WebSocket.
Unterstützte Systeme
- OPNsense (FreeBSD, amd64)
Installation (Erstinstallation)
1. Repo klonen und Release bauen (auf dem Build-Server)
git clone https://git.cynfo.net/christian/rmm2.git /opt/rmm
cd /opt/rmm
make release VERSION=1.0.3
# → build/release/rmm-freebsd-1.0.3.zip
# enthält: rmm-agent + rmm-updater-freebsd + install.sh
2. Installer-ZIP im Frontend hochladen
Frontend → Firmware → Installer-Pakete → freebsd → ZIP hochladen
Das Frontend zeigt nach dem Upload den fertigen Installationsbefehl mit Copy-Button.
3. Installer auf der Firewall ausführen
Auf der OPNsense-Firewall (SSH als root):
fetch --no-verify-peer --no-verify-hostname \
-o /tmp/installer.zip \
"https://BACKEND_IP:8443/api/v1/installer/download?platform=freebsd&api_key=DEIN_API_KEY" \
&& cd /tmp && unzip -o installer.zip && sh /tmp/install.sh
4. Im WebGUI konfigurieren
Services → RMM Agent öffnen und eintragen:
| Feld | Beschreibung |
|---|---|
| Backend URL | https://BACKEND_IP:8443 |
| API Key | API-Key aus backend/config.yaml |
| Agent Name | Anzeigename im RMM-Frontend |
Agent-Binary aktualisieren (OTA)
Für Updates auf bereits installierten Agents übernimmt der rmm-updater Daemon die Verteilung automatisch.
Ablauf
- Neues Binary im Frontend hochladen (nur das Binary, kein ZIP)
- Update-Flag bei einzelnem Agent oder "Alle updaten" setzen
- Updater auf der Firewall erkennt den Flag (pollt alle 60s)
- Binary wird heruntergeladen und SHA256-verifiziert
- Agent wird gestoppt, Binary ersetzt, Agent gestartet
- Flag wird automatisch zurückgesetzt
Binary bauen und hochladen
cd /opt/rmm
make agent VERSION=1.0.4
# → build/rmm-agent
Frontend → Firmware → Agent-Binary → Version + freebsd → Binary hochladen
Oder per API:
curl -sk -X POST "https://BACKEND_IP:8443/api/v1/firmware/upload?version=1.0.4&platform=freebsd" \
-H "X-API-Key: DEIN_API_KEY" \
--data-binary @build/rmm-agent
Update auslösen
# Einzelnen Agent updaten
curl -sk -X POST "https://BACKEND_IP:8443/api/v1/agents/AGENT_ID/request-update" \
-H "X-API-Key: DEIN_API_KEY"
# Alle Agents updaten
curl -sk -X POST "https://BACKEND_IP:8443/api/v1/agents/request-update-all" \
-H "X-API-Key: DEIN_API_KEY"
Updater-Details
- Binary:
rmm-updater-freebsd, läuft alsrmm_updaterrc.d Service - Liest dieselbe
config.yamlwie der Agent - SHA256-Verifizierung vor Ersetzung
- Automatisches Rollback bei fehlgeschlagenem Agent-Start
- Backup der alten Binary als
.bak - Logs:
/var/log/rmm-updater.log
OPNsense-Updates (Core + Packages)
Normales Update (Patches innerhalb der gleichen Version)
Über Frontend → Firewall → Agent-Tab → Update oder per API:
curl -sk -H "X-API-Key: DEIN_API_KEY" -X POST \
https://BACKEND_IP:8443/api/v1/agents/AGENT_ID/update \
-d '{"reboot":true}'
Ablauf im Agent:
opnsense-update— Core-Update herunterladenpkg upgrade -y— Paket-Updates installieren- Prüfung ob Reboot nötig (
opnsense-update -c)
Major-Upgrade (z.B. 25.7 → 26.1)
# Phase 1: Base + Kernel + Packages herunterladen, dann Reboot
curl -sk -H "X-API-Key: DEIN_API_KEY" -X POST \
https://BACKEND_IP:8443/api/v1/agents/AGENT_ID/major-update \
-d '{"version":"26.1","reboot":true}'
# Phase 2: nach Reboot — Pakete finalisieren
curl -sk -H "X-API-Key: DEIN_API_KEY" -X POST \
https://BACKEND_IP:8443/api/v1/agents/AGENT_ID/major-update \
-d '{"version":"26.1","phase":"2"}'
Update-Check
curl -sk -H "X-API-Key: DEIN_API_KEY" -X POST \
https://BACKEND_IP:8443/api/v1/agents/AGENT_ID/update-check
Konfigurationsdatei
# /usr/local/etc/rmm-agent/config.yaml
backend_url: "https://BACKEND_IP:8443"
api_key: "DEIN_API_KEY"
agent_name: "OPN.intra.kunde.de"
insecure: true # false wenn gültiges TLS-Zertifikat vorhanden
Service-Management (FreeBSD)
# Agent
service rmm-agent status
service rmm-agent start | stop | restart
# Updater
service rmm_updater status
service rmm_updater start | stop | restart
# Logs
tail -f /var/log/rmm-agent.log
tail -f /var/log/rmm-updater.log
Gesammelte Daten (Heartbeat alle 60s)
| Collector | Daten |
|---|---|
| Hardware | Hersteller, Modell, Seriennummer, BIOS |
| CPU | Modell, Cores, Threads, Auslastung |
| Memory | Total, Used, Free |
| Disks | ZFS Datasets, Belegung, Mountpoints |
| Network | Interfaces, IPs, Status, MAC, Statistiken |
| Services | Laufende OPNsense-Dienste |
| WireGuard | Tunnel, Peers, Transfer, Handshake |
| DHCP | Aktive Leases (KEA/ISC/dnsmasq) |
| Routing | Routing-Tabelle |
| Gateways | Status, RTT, Loss |
| Zertifikate | Ablaufdatum, Aussteller |
| Plugins | Installierte OPNsense-Plugins |
| Updates | Verfügbare Core + Package Updates |
| Cron | System-Crontab + OPNsense Jobs |
Remote-Commands (via WebSocket)
| Command | Beschreibung |
|---|---|
exec |
Beliebigen Shell-Befehl ausführen |
backup |
config.xml sichern |
update |
OPNsense Update (Core + Packages) |
major_update |
Major-Upgrade (2-Phasen) |
reboot |
Neustart |
tunnel_connect |
TCP-Tunnel öffnen (SSH, WebGUI, etc.) |
wg_add_peer |
WireGuard-Peer anlegen |
wg_delete_peer |
WireGuard-Peer löschen |
Hinweise (FreeBSD)
- Volle Pfade verwenden:
/usr/local/sbin/pluginctl,/usr/bin/netstat daemonstattnohupfür Hintergrundprozessecshhat kein$()— Agent verwendet/bin/sh -c- OPNsense Plugin-Cache nach View-Änderungen leeren
- PHP-Fehlerlog:
/var/log/php-fpm.log