speedport-exporter
Prometheus Exporter und CLI-Tool für den Telekom Speedport Smart 4 Router.
Liest die verschlüsselte Statusseite (Status.json) des Routers aus, entschlüsselt sie (AES-256-CCM) und stellt die Daten als Prometheus-Metriken bereit oder gibt sie auf der Kommandozeile aus.
Features
- Keine Abhängigkeiten – einzelnes Go-Binary, kein Python/Node nötig
- AES-256-CCM Entschlüsselung – Status.json wird automatisch entschlüsselt
- Prometheus Exporter – DSL-Metriken, Fehler-Counter, Online-Status
- CLI-Modi –
status,raw,json,endpoints - Login-Support – Für geschützte Endpunkte (Geräteliste, IP-Daten etc.)
- Cross-Compile – Läuft auf Raspberry Pi, NAS, x86 Server
Schnellstart
Bauen
# Lokal bauen
make build
# Für Raspberry Pi
make pi
# Cross-compile (amd64, arm64, arm)
make cross
# Docker
make docker
CLI-Nutzung
# DSL-Status anzeigen (formatierte Übersicht)
./speedport-exporter status
# Alle Rohdaten anzeigen
./speedport-exporter raw
# JSON-Output (für Weiterverarbeitung mit jq etc.)
./speedport-exporter json
# Alle bekannten Endpunkte abfragen
./speedport-exporter endpoints
# Mit spezifischer Router-Adresse
./speedport-exporter status -host 192.168.2.1
# Mit Passwort für geschützte Endpunkte
SPEEDPORT_PASSWORD=meinpasswort ./speedport-exporter endpoints
Prometheus Exporter
# Server starten (Standard: Port 9810)
./speedport-exporter serve
# Auf anderem Port
./speedport-exporter serve -listen :9820
# Mit Environment-Variablen
SPEEDPORT_HOST=192.168.2.1 SPEEDPORT_PASSWORD=meinpasswort \
./speedport-exporter serve
Metriken sind dann unter http://localhost:9810/metrics abrufbar.
Prometheus-Metriken
| Metrik | Typ | Beschreibung |
|---|---|---|
speedport_up |
Gauge | Router erreichbar (1/0) |
speedport_online_status |
Gauge | Internet-Verbindung online (1/0) |
speedport_dsl_rate_kbps |
Gauge | DSL-Rate in kbit/s (Labels: direction, type) |
speedport_dsl_snr_db |
Gauge | Signal-Rausch-Abstand in dB |
speedport_dsl_attenuation_db |
Gauge | Leitungsdämpfung in dB |
speedport_dsl_power_dbm |
Gauge | Signalleistung in dBm |
speedport_dsl_errors_total |
Gauge | Fehlerzähler (CRC, FEC, HEC) |
speedport_dsl_uptime_seconds |
Gauge | Verbindungs-Uptime |
speedport_info |
Gauge | Router-Info als Labels |
speedport_raw_value |
Gauge | Alle numerischen Rohwerte |
speedport_scrape_duration_seconds |
Gauge | Scrape-Dauer |
speedport_scrape_errors_total |
Counter | Scrape-Fehler |
Beispiel-Labels
speedport_dsl_rate_kbps{direction="downstream",type="current"} 99960
speedport_dsl_rate_kbps{direction="upstream",type="current"} 39982
speedport_dsl_snr_db{direction="downstream"} 8.2
speedport_dsl_errors_total{direction="downstream",type="crc"} 42
speedport_info{device_name="Speedport Smart 4",firmware_version="010138.6.8.010.0",serial_number="...",dsl_mode="VDSL"} 1
Grafana Dashboard
Prometheus-Config (prometheus.yml):
scrape_configs:
- job_name: 'speedport'
scrape_interval: 60s
static_configs:
- targets: ['localhost:9810']
Beispiel-Grafana-Queries:
# Aktuelle Download-Rate
speedport_dsl_rate_kbps{direction="downstream",type="current"}
# SNR-Verlauf
speedport_dsl_snr_db
# CRC-Fehler pro Stunde
rate(speedport_dsl_errors_total{type="crc"}[1h]) * 3600
# Uptime
speedport_dsl_uptime_seconds / 3600
Installation als Service
# Binary installieren
sudo make install
# Service-User anlegen
sudo useradd -r -s /bin/false speedport-exporter
# Systemd-Service installieren
sudo cp speedport-exporter.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now speedport-exporter
# Status prüfen
sudo systemctl status speedport-exporter
curl localhost:9810/metrics
Docker
# Bauen
make docker
# Starten
docker run -d \
--name speedport-exporter \
--network host \
-e SPEEDPORT_HOST=192.168.2.1 \
speedport-exporter:dev
Oder mit Docker Compose:
services:
speedport-exporter:
build: .
network_mode: host
environment:
- SPEEDPORT_HOST=192.168.2.1
# - SPEEDPORT_PASSWORD=meinpasswort
restart: unless-stopped
Konfiguration
| Flag / Env | Default | Beschreibung |
|---|---|---|
-host / SPEEDPORT_HOST |
speedport.ip |
Router-Adresse |
-password / SPEEDPORT_PASSWORD |
(leer) | Router-Passwort |
-listen / SPEEDPORT_LISTEN |
:9810 |
HTTP-Listen-Adresse |
-debug |
false |
Debug-Logging |
Technische Details
Verschlüsselung
Der Speedport Smart 4 verschlüsselt seine Status.json-Antwort mit AES-256-CCM:
- Schlüssel: Fest im Router eingebaut (vom Community reverse-engineered)
- Nonce: Erste 8 Bytes des Schlüssels
- Auth-Tag: Letzte 16 Bytes des Ciphertexts
- Kodierung: Hex-String
Login-Mechanismus
Für geschützte Endpunkte wird ein Challenge-Response-Verfahren verwendet:
POST data/Login.json→ Challenge erhalten- SHA256 des Passworts berechnen
- PBKDF2 (SHA256-Pwd, Challenge[:16], 1000 Iterationen) → AES-128 Key
- AES-128-CCM Verschlüsselung des Pwd-Hashs mit Challenge-Nonce/AAD
POST data/Login.jsonmit verschlüsseltem Passwort → Session-Cookie
Bekannte Endpunkte
| Endpunkt | Auth | Beschreibung |
|---|---|---|
data/Status.json |
Nein | Basis-Status, DSL-Daten |
data/DSL.json |
Nein | DSL-Detaildaten |
data/IPData.json |
Ja | WAN-IP, IPv6 |
data/DeviceList.json |
Ja | Verbundene Geräte |
data/Modules.json |
Nein | Firmware-Informationen |
data/Overview.json |
Nein | Übersichtsdaten |
Hinweis
⚠️ Dieses Tool ist inoffiziell und steht in keiner Verbindung zur Telekom. Die Entschlüsselung basiert auf Community-Reverse-Engineering und kann mit Firmware-Updates nicht mehr funktionieren.
Credits an die Community-Projekte, deren Reverse-Engineering dies ermöglicht hat:
Lizenz
MIT