2026-03-07 16:46:42 +01:00
2026-03-07 16:46:42 +01:00
2026-03-07 16:46:42 +01:00
2026-03-07 16:31:30 +01:00
2026-03-07 16:31:30 +01:00
2026-03-07 16:31:30 +01:00
2026-03-07 16:31:30 +01:00
2026-03-07 16:31:30 +01:00
2026-03-07 16:31:30 +01:00
2026-03-07 16:31:30 +01:00

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:

  1. POST data/Login.json → Challenge erhalten
  2. SHA256 des Passworts berechnen
  3. PBKDF2 (SHA256-Pwd, Challenge[:16], 1000 Iterationen) → AES-128 Key
  4. AES-128-CCM Verschlüsselung des Pwd-Hashs mit Challenge-Nonce/AAD
  5. POST data/Login.json mit 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

Description
No description provided
Readme 52 KiB
Languages
Go 95.3%
Makefile 3.5%
Dockerfile 1.2%