Zum Inhalt

Windows Server (Salto-Server) — Systemdokumentation

Hostname: Salto-Server IP: 10.128.40.6 Stand: 23. Februar 2026


Hardware (Virtuelle Maschine)

Komponente Details
Typ Hyper-V VM auf Host 10.128.40.5
CPU 1x Intel Core i7-14700 @ 2496 MHz
RAM 8 GB (ca. 5,7 GB belegt)
OS-Disk (C:) 65 GB (20 GB frei) — Virtual Disk
Daten-Disk (E:) 500 GB (364 GB frei) — Synology iSCSI
Laufwerk D: Wechseldatenträger (leer)

Betriebssystem

Eigenschaft Wert
OS Windows Server 2019 Standard (Build 17763)
Installation 08.08.2025
Letzter Start 10.02.2026, 16:55
Domain WORKGROUP (eigenständig)
Hotfixes 9 installiert (KB5066137 u.a.)

Netzwerk

Eigenschaft Wert
Adapter Microsoft Hyper-V Network Adapter
IPv4 10.128.40.6/24 (statisch)
Gateway 10.128.40.1 (Sophos XGS)
DNS 10.128.40.1, 10.128.30.1
DHCP Nein
NetBIOS Aktiviert

Installierte Hauptsoftware

Software Version Funktion
SALTO ProAccess Space 6.12.2.3 Schließanlagen-Management
Salto Local IO Bridge 1.5.0.0 USB-Geräte-Kommunikation (PPD/Keylaser)
SQL Server 2022 (Instanz: SALTO) 16.0.1000.6 Datenbank für Salto
Node.js 22.14.0 Salto-Abhängigkeit
TeamViewer Fernwartung
FlexiHub USB-over-Network (Workaround)
HHD Virtual USB Tools USB-Virtualisierung Server-Seite
Hornetsecurity VM Backup 9.13.3 VM-Backup
Physical Server Backup 2.2.0 Server-Backup
Sophos Endpoint Endpoint-Protection
Blackbox-Exporter 0.25.0 Prometheus Monitoring
SNMP-Exporter 0.27.0 Prometheus Monitoring
Grafana Dashboard (Port 3000)
OpenSSH Server Remote-Zugang

Salto ProAccess Space — Konfiguration

Installation

  • Pfad: C:\SALTO\ProAccess Space\
  • Datenbank: SQL Server 2022, Instanz SALTO, DB-Name SALTO_SPACE
  • SQL-Auth: Windows-Authentifizierung (SQLAuthenticationEnabled=0)

Service-Ports (aus service.ini)

Port Protokoll Funktion Status
8100 TCP (HTTP) Web-Frontend + Metrics-Endpoint Aktiv, Firewall offen
8102 TCP (WebSocket) Local IO Bridge Kommunikation Aktiv, Firewall BLOCKIERT
8099 TCP (SOAP) Service-Port (Grafik-Mapping) Aktiv, lauscht
5001-10000 UDP Peripherie-Kommunikation (IP-Geräte) Konfiguriert

Zugriff

  • Web-Interface: http://10.128.40.6:8100
  • WebSocket (Bridge): http://10.128.40.6:8102
  • Prometheus Metrics: http://10.128.40.6:8100/metrics/text (aktiviert 23.02.2026)

Prometheus-Integration (aktiv seit 23.02.2026)

MetricsEnabled=1 in service.ini → App.Metrics Endpoint auf /metrics/text (Port 8100).

Datenfluss:

http://10.128.40.6:8100/metrics/text (CRLF, GAUGE uppercase)
  → SSH-Tunnel Pi:18100 → Salto:8100
  → salto-metrics-proxy.py (Port 18101, CRLF→LF, GAUGE→gauge)
  → Prometheus scrape http://172.17.0.1:18101/metrics/text
  → Grafana Dashboard "Salto ProAccess Space" (salto-proaccess-2026)

Verfügbare Metrik-Gruppen (170 Metriken): - process_* / processor_* — CPU-Auslastung - memory_* — RAM verfügbar, .NET Heap, GC-Zeit - disk_* / io_* — Disk I/O und freier Speicher (in GB) - networkinterface_* — Netzwerk-Throughput - db_sql — SQL-Abfrage-Latenzen (Summary) - acm_business_* — Thread-Pool-Auslastung - periodictasksmanager_* — Scheduler-Status - saltosynchronizationcontext_* — Interne Context-Queues - saltoscheduler_* — Job-Scheduler

Proxy-Service: salto-metrics-proxy.service (Pi, systemd, User: ak) - Script: /usr/local/bin/salto-metrics-proxy.py - SSH-Tunnel: -L 0.0.0.0:18100:localhost:8100 in snmp-tunnel.service - Hostnamen-Mapping: 127.0.0.1 salto-server in /etc/hosts


USB-Workaround (aktuell im Einsatz)

Da die Local IO Bridge nicht funktioniert, wird ein USB-over-Network-Workaround verwendet:

Komponente Software Funktion
Server HHD Virtual USB Tools (Port 43581) USB-Geräte virtuell bereitstellen
Server FlexiHub USB-over-Network Management
Client USB Network Gate Client USB-Geräte vom Server nutzen

Nachteil: Der Benutzer muss sich per RDP auf dem Server anmelden, um Salto zu bedienen. Nur die USB-Strecke (PPD/Keylaser) wird über den Client geleitet.


Laufende Dienste (relevant)

Dienst Funktion
ProAccessSpaceService Salto ProAccess Space Hauptdienst
SaltoLocalIOBridge Local IO Bridge (läuft, aber extern nicht erreichbar)
MSSQL$SALTO SQL Server Instanz für Salto
SQLWriter SQL Server VSS Writer
TeamViewer Fernwartung
flexihub USB-over-Network
UsbService USB Network Gate Server
hhdvusbsrv HHD Virtual USB Virtualization Server
hhdvusbcli HHD Virtual USB Virtualization Client
blackbox_exporter Prometheus Blackbox-Exporter
snmpexporter Prometheus SNMP-Exporter
SyslogRelay (Scheduled Task) Sophos Syslog UDP→TCP Relay für Pi
sshd OpenSSH Server
Sophos * Endpoint Protection (4 Dienste)
Hornetsecurity * VM Backup (5 Dienste)

Windows Firewall — Eingehende Regeln (benutzerdefiniert)

Regel Port Protokoll Status
salto web 8100 TCP Aktiv
Grafana Dashboard 3000 TCP Aktiv
SNMP Exporter 9116 TCP Aktiv
OpenSSH SSH Server 22 TCP Aktiv
Syslog UDP 1514 Inbound 1514 UDP Aktiv (für Sophos Syslog-Relay)
HHD Virtual USB Data 43581 TCP Aktiv
HHD Virtual USB Control Any TCP Aktiv
FlexiHub (GUI + Service) Any Any Aktiv
TeamViewer (App + Service) Any TCP/UDP Aktiv
Ping erlauben ICMPv4 Aktiv
RDP 3389 TCP/UDP Aktiv
WinRM 5985 TCP Aktiv

Fehlende Regeln

Port Zweck Auswirkung
8102 TCP Salto WebSocket / Local IO Bridge Bridge kann von Clients nicht erreicht werden
8099 TCP Salto Service-Port Grafik-Mapping nicht von extern erreichbar
1100 UDP Salto Gateways/Controller v1 IP-Geräte-Kommunikation
4433 UDP Salto Encoder v2 Encoder-Kommunikation
5001-10000 UDP Salto Peripherie IP-Device-Kommunikation

Erreichbarkeit von extern (Test von raspip5 via VPN)

Port Status Dienst
22 OFFEN SSH
80 geschlossen
135 OFFEN RPC
139 OFFEN NetBIOS
443 geschlossen
445 OFFEN SMB
3389 OFFEN RDP
5985 OFFEN WinRM
8100 OFFEN Salto Web
8102 GESCHLOSSEN Salto WebSocket (Bridge) — PROBLEM
8443 geschlossen

Problemanalyse: Local IO Bridge

Symptom

Die Salto Local IO Bridge auf Client-PCs kann keine Verbindung zum Server aufbauen. Dadurch können PPD und Keylaser nicht über den Browser bedient werden.

Ursache

Port 8102 (TCP) ist in der Windows Firewall nicht freigegeben.

Der Salto-Service lauscht intern auf Port 8102 (WebSocket), aber es gibt keine eingehende Firewall-Regel dafür. Es existiert nur die Regel "salto web" für Port 8100.

Kommunikationsfluss (Soll-Zustand)

Client-Browser (http://10.128.40.6:8100)
  ↕ HTTP
Salto Web-Interface

Client: Local IO Bridge Service
  → localhost:50000-51000 (Browser ↔ Bridge)
  → 10.128.40.6:8102 TCP (Bridge ↔ Server)  ← HIER BLOCKIERT
  → USB-Port (Bridge ↔ PPD/Keylaser)

Lösung

  1. Windows Firewall-Regel für Port 8102 erstellen: netsh advfirewall firewall add rule name="Salto WebSocket Bridge" dir=in action=allow protocol=TCP localport=8102 profile=domain,private

  2. Sophos XGS Firewall prüfen: Falls die Sophos XGS (10.128.40.1) auch Port 8102 zwischen Client-Subnetz und Server blockiert, dort ebenfalls freigeben.

  3. Auf dem Client: Local IO Bridge neu starten (System Tray → Stop Service → Start Service)

  4. Optional: Auch Port 8099 freigeben, falls Grafik-Mapping benötigt wird.

  5. Nach erfolgreichem Test: FlexiHub/HHD Virtual USB Tools können deinstalliert werden, da der USB-Workaround nicht mehr nötig ist.

Zusätzliche Empfehlungen

  • HTTPS aktivieren: Salto unterstützt HTTPS auf Port 8100 — aktuell läuft nur HTTP
  • SQL Server sichern: SQL-Auth ist deaktiviert (gut), aber Instanz-Name ist von extern sichtbar
  • Sophos Firewall: UDP-Ports 1100, 4433 und Range 5001-10000 prüfen, falls Salto IP-Geräte (Online-Türcontroller) im Einsatz sind


Sophos Syslog-Relay (eingerichtet 23.02.2026)

Sophos XGS-Firewalls haben keine direkte Route zum Pi (192.168.178.199). Der Salto-Server fungiert als UDP→TCP Relay.

Funktionsweise

Sophos XGS (10.128.40.1) → UDP:1514 → Salto (10.128.40.6)
  → PowerShell SyslogRelay → TCP:localhost:5514
  → SSH-Reverse-Tunnel → Pi rsyslog TCP:5514
  → /var/log/sophos/xgs.log → Promtail → Loki

Konfiguration

  • Script: C:\syslog-relay.ps1
  • Scheduled Task: SyslogRelay (Ausführung als SYSTEM, AtStartup, RestartCount=5)
  • Windows Firewall: Regel "Syslog UDP 1514 Inbound" (UDP, Port 1514, Any Profile, Allow)

Verwaltung

# Status prüfen
Get-ScheduledTask -TaskName SyslogRelay | Select-Object State

# Neustart
Stop-ScheduledTask SyslogRelay; Start-ScheduledTask SyslogRelay

# Test: Paket an sich selbst senden (→ landet auf Pi)
$u = New-Object System.Net.Sockets.UdpClient
$b = [System.Text.Encoding]::ASCII.GetBytes('<14>Test: Relay-Test')
$u.Send($b, $b.Length, '127.0.0.1', 1514)
$u.Close()

Erstellt: 19.02.2026 | Aktualisiert: 23.02.2026