Draytek Vigor 165 Informationen in Grafana

Ich habe meinen (V)DSL Anschluss etwas aufgewertet und setze jetzt ein Draytek Vigor 165 Modem vor meiner pfSense (SG-3100) ein. Das Modem liefert auf der Weboberfläche, und – wie ich gelernt habe – auch über telnet einen bunten Strauß an Informationen über die DSL Verbindung.

Zugriff auf Modem hinter pfSense

An sich arbeitet so ein Modem ja weitestgehend wartungsfrei, d.h. ein direkter Zugriff aus dem Netzwerk ist gar nicht unbedingt notwendig. Insbesondere das Vigor 165 (und auch schon vorher das Vigor 130) sind da eher von der Sorte „Plug and Play“. Aber: Manchmal möchte man ja schon unkompliziert auf das Webinterface oder die Konsole, und sei es nur, um mal die Firmware zu aktualisieren.

Mit pfSense stellt das zum Glück keine große Herausforderung dar.
Mein lokales Netz hat die Range 192.168.1.0/24, Port 1 des Modems ist auf 192.168.2.1 im Netz 192.168.2.0/24 konfiguriert.

Zunächst ist ein zusätzliches Interface Assignment in pfSense notwendig. Dieses Interface ist auf dem selben NIC wie die PPPoE Einwahl, das sieht dann in etwa so aus:

Das VDSLMGMT Interface bekommt die statische IP 192.168.2.2/24.
Dann erlauben wir auf dem LAN Interface in der Firewall die Kommunikation zwischen den beiden Netzen:

Zu guter Letzt brauchen wir noch eine Outbound NAT Regel. Outbound NAT sollte hier mindestens auf „Hybrid Outbound NAT“ gestellt sein, damit wir eigene Regeln hinzufügen können. Die Regel sieht bei mir so aus:

Danach sollte es möglich sein im Browser über http://192.168.2.1 auf das Webinterface vom Modem zu kommen. Ebenso sollte nun über „telnet 192.168.2.1“ ein Login kommen. Das sieht dann bei mir beispielsweise so aus:

Account:admin
Password: *********

Type ? for command help

DrayTek> vdsl status
  ---------------------- ATU-R Info (hw: annex B, f/w: annex A/B/C) -----------
   Running Mode            :      35B       State                : SHOWTIME
   DS Actual Rate          :248546000 bps   US Actual Rate       : 46717000 bps
   DS Attainable Rate      :259880804 bps   US Attainable Rate   : 47384000 bps
   DS Path Mode            :        Fast    US Path Mode         :        Fast
   DS Interleave Depth     :        1       US Interleave Depth  :        1
   NE Current Attenuation  :       14 dB    Cur SNR Margin       :        7  dB
   DS actual PSD           :    14. 3 dB    US actual PSD        :     0.-7  dB
   NE CRC Count            :        2       FE CRC Count         :       15
   NE ES Count             :        2       FE  ES Count         :        2
   Xdsl Reset Times        :        0       Xdsl Link  Times     :        4
   ITU Version[0]          : 00000000       ITU Version[1]       : 00000000
   VDSL Firmware Version   : 08-0B-02-06-00-07   [with Vectoring support]
   Power Management Mode   : DSL_G997_PMS_L0
   Test Mode               : DISABLE
  -------------------------------- ATU-C Info ---------------------------------
   Far Current Attenuation :       10 dB    Far SNR Margin       :        7  dB
   CO ITU Version[0]       : b5004244       CO ITU Version[1]    : 434dc1da
   DSLAM CHIPSET VENDOR    : < BDCM >
DrayTek>

Was die einzelnen Parameter bedeuten wurde in diesem Thread hier sehr gut gesammelt: https://www.onlinekosten.de/forum/showthread.php?p=2515443
Nur für den Fall, dass dieser irgendwann mal offline ist, hier eine Kopie davon.

Parameter anzeigen

Häufige Abkürzungen:
DS: Downstream (Datenverkehr in Richtung zum Kunden)
US: Upstream (Datenverkehr in Richtung zum Provider)
NE: Near End: Bewertung über die eigene Seite (aus Sicht von ATU-R oder -C)
FE: Far End: Bewertung über die entfernte Seite (aus Sicht von ATU-R oder -C)
ATU-R: „ADSL transceiver unit remote“ – Das Modem beim Kunden
ATU-C: „ADSL transceiver unit central office“ – Linecard im DSLAM vom Provider

Erklärung der einzelnen Felder, der Reihe nach:

Running Mode
Derzeit aktives VDSL-Profil

State
Derzeitiger Betriebsmodus des Modems:
READY: Neu gestartet oder gerade rekonfiguriert – idle
TRAINING: Anlernphase
SHOWTIME: Verbindung hergestellt

DS/US Actual Rate
Aktuelle Datenrate in Bit/s – Limitiert durch gebuchtes Geschwindigkeitsprofil oder DLM

DS/US Attainable Rate
Maximal erreichbare Datenrate in Bit/s, die das Modem mit derzeitiger Konfiguration auf der Leitung erreichen könnte

DS/US Path Mode
FastPath aktiv?

DS/US Interleave Depth
Verschränkungstiefe

NE Current Attenuation
Bitte Beschreibung ergänzen

Cur SNR Margin
Der wohl wichtigste Parameter:
Verfügbarer Spielraum des Signal/Rauschabstands. Mehr = Besser
Mit dem Befehl „vdsl snr [-50 .. 50]“ kann beeinflusst werden wie weit dieser Spielraum zugunsten einer höheren Datenrate ausgenutzt werden soll.

DS/US actual PSD
Power Spectral Density, also die Leistungsdichte im Spektralbereich. Gibt eben an, mit wieviel Leistung die DSL-Geräte ihr Signal auf die Leitung bringen.

NE/FE CRC Count
Anzahl aufgetretener Prüfsummen-Fehler bei Daten von eigener (NE) oder Gegenseite (FE).

NE/FE ES Count
Errored Seconds – Anzahl fehlerbehafteter Sekunden bei Daten von eigener (NE) oder Gegenseite (FE).

Xdsl Link Times
Anzahl der DSL-Synchronisierungen

VDSL Firmware Version
Im Webinterface ausgewählter „DSL Modem Code“.

Power Management Mode
Ausgehandeltes Energiespar-Profil

Far Current Attenuation

Far SNR Margin

CO ITU Version[0]
CO ITU Version[1]
Linecard-Version
Die letzten 2 Bytes (Hexadezimal) vom letzten Wert ergeben in der Dezimalschreibweise die
Version, wie sie auch von einer Fritz!Box angezeigt wird und in der LineCard Übersicht verwendet wird.
„….c064“ aus dem Beispiel oben wird zu „192.100“.

DSLAM CHIPSET VENDOR
Chipsatz-Hersteller auf Seite des Providers. z.B. „BDCM“ = Broadcom

Das ist insgesamt schon alles ziemlich spannend, nun möchte ich diese Informationen aber dauerhaft sammeln und visualisieren.
Dazu nutze ich Node-Red, InfluxDB und Grafana.

Node-Red

Um die Daten vom Modem auszulesen, zu verarbeiten und an die InfluxDB zu schicken wird Node-Red verwendet. Dieses läuft problemlos in einem Dockercontainer, eine Anleitung dazu findet sich hier. Wichtig ist, den Ordner /data im Container zu persistieren, da sich hier drin dann die Konfigurationen und die Flows befinden.

Der Flow selbst ist relativ einfach aufgebaut: Verbinden zum Router, Einloggen, den Befehl „vdsl status“ absetzen, die Ausgabe parsen und an InfluxDB schicken. Der Flow sieht dann so aus:

Es gibt ein paar Kleinigkeiten, die es zu berücksichtigen gilt: Innerhalb der telnet Verbindung zum Router müssen die einzelnen Eingaben mit zeitlichem Abstand gesendet werden, also der Benutzername, das Kennwort und dann der eigentliche Befehl. Das übernimmt die erste Function (Build Payload). Hier steht dieses drin:

setTimeout(function(){
    msg['payload'] = '[PASSWORT]\n';
    node.send(msg);
}, 1000);

setTimeout(function(){
    msg['payload'] = 'vdsl status\n';
    node.send(msg);
}, 2000);

setTimeout(function(){
    msg['payload'] = 'exit\n';
    node.send(msg);
}, 4000);

msg['payload'] = 'admin\n';
return msg;

Hierdurch wird als erstes ein „admin\n“ an die TCP Verbindung im nächsten Node geschickt. Dann, nach 1000ms Wartezeit sendet der Node das Passwort, nach 2000ms Wartezeit das „vdsl status\n“ und nach 4000ms loggt sich der Node wieder aus.

Das Parsing des Outputs übernimmt eine weitere Function, hier mache ich einiges mit Regex. Das geht mutmaßlich alles deutlich schöner, funktioniert aber in dieser Form und reicht für meine Zwecke aus.

var str = msg.payload.toString();
var modeState = str.match(/Running\sMode\s+:\s*([\w\d.-]+)\s*State\s+:\s*([\w]+)/);
var actualRates = str.match(/DS\sActual\sRate\s+:\s*([\d]+)\sbps\s*US\sActual\sRate\s+:\s*([\d]+)/);
var attainableRates = str.match(/DS\sAttainable\sRate\s+:\s*([\d]+)\sbps\s*US\sAttainable\sRate\s+:\s*([\d]+)/);
var curAttSNR = str.match(/NE\sCurrent\sAttenuation\s+:\s*([\d]+)\sdB\s*Cur\sSNR\sMargin\s+:\s*([\d.]+)/);
var farAttSNR = str.match(/Far\sCurrent\sAttenuation\s+:\s*([\d]+)\sdB\s*Far\sSNR\sMargin\s+:\s*([\d.]+)/);
var psd = str.match(/DS\sactual\sPSD\s+:\s*([\s\d.-]+)\sdB\s*US\sactual\sPSD\s+:\s*([\s\d.-]+)\s+dB/);
var crc = str.match(/NE\sCRC\sCount\s+:\s*([\d]+)\s*FE\sCRC\sCount\s+:\s*([\d]+)/);
var esc = str.match(/NE\sES\sCount\s+:\s*([\d]+)\s*FE\s\sES\sCount\s+:\s*([\d]+)/);

var newMsg = [{ 
    payload: { 
        mode: modeState !== null ? modeState[1] : '', 
        state: modeState !== null ? modeState[2] : '', 
        dsActualRate: Number(actualRates[1]),
        usActualRate: Number(actualRates[2]),
        dsAttainableRate: Number(attainableRates[1]),
        usAttainableRate: Number(attainableRates[2]),
        neCurrentAttenuation: Number(curAttSNR[1]),
        curSNRMargin: Number(curAttSNR[2]),
        feCurrentAttenuation: Number(farAttSNR[1]),
        feSNRMargin: Number(farAttSNR[2]),
        
        dsActualPSD: psd[1],
        usActualPSD: psd[2],
        neCrcCount: Number(crc[1]),
        feCrcCount: Number(crc[2]),
        neEsCount: Number(esc[1]),
        feEsCount: Number(esc[2])
    } 
}];

return newMsg;

Ihr könnt den Flow hier herunterladen. Vermutlich (hoffentlich) muss das Passwort in der ersten Function ersetzt werden, hier steht der Standard „admin“ drin.

InfluxDB

In InfluxDB habe ich mir eine eigene Datenbank für die VDSL Daten erstellt.

[email protected]:~# influx 
Connected to http://localhost:8086 version 1.7.9
InfluxDB shell version: 1.7.10
> create database vdsl
> 

Mehr ist hier an sich nicht zu tun, wie man eine InfluxDB einrichtet findet sich zigfach im Internet…

Grafana

Wenn die Daten in der InfluxDB gelandet sind, kann mit einem beliebigen Visualisierungstool gearbeitet werden. Ich nutze Grafana, aber dasselbe ist sicherlich auch mit Chronograf oder ähnlichem möglich.

Bei mir sieht das dann zum Beispiel so aus:

Wie man sieht, habe ich mit der SNR Margin im Modem herumgespielt, da ich insbesondere des Abends Probleme mit Packet loss und Verbindungsabbrüchen habe. Das Kommand hierfür ist „vdsl snr XX“, wobei XX der SNR Wert ist, um den korrigiert werden soll. Aktuell muss ich mit einer Korrektur von 50, als 5dB arbeiten, damit die Verbindung stabil bleibt. Dadurch synchronisiert das Modem zwar nur noch mit ca. 200 Mbit/s im Downstream anstatt der möglichen 250 Mbit/s, aber immerhin keine Disconnects…

Ich hoffe, irgendwem nützt dies hier was, und sonst weiß ich wenigstens in zwei Jahren noch, was ich da gebaut habe.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.