home
erste Version am 22.06.2014
letzte Änderung am 31.07.2014

Zwei Tools zur Traffic-Überwachung eines Tunnels


Hier dokumentiere ich die Einrichtung und Nutzung von zwei Programmen, mit denen die Übertragungsraten auf dem tun0-Interface protokolliert und visualisiert werden können.


Inhalt
  1. Einrichtung des Scripts zum Erstellen der Log-Files
  2. Log-Files
  3. Das Programm zur grafischen Anzeige der Logs
  4. Das Menü von tun0graf.py
  5. Befehlszeilenparameter


Einrichtung des Scripts zum Erstellen der Log-Files

Das Script tun0moni.py läuft auf dem System mit dem zu überwachenden Interface. In meinem Fall also auf der Tunnel-VM.
Im Script selbst ist nicht viel anzupassen. Der einzige Konfigurationsparameter ist das zu überwachende Interface.
In der Zeile
ETH_IF="tun0"
könnte (bei Bedarf) das "tun0" durch "eth0" oder "enp0s25" ersetzt werden.

Nachdem das Script im ~/bin-Verzeichnis abgelegt wurde, wird es mittels eines cron-Jobs einmal pro Minute aufgerufen. Also erst ein
crontab -e
und darin dann zufügen der Zeile
* * * * * $HOME/bin/tun0moni.py

Die vom Script erstellten Log-Dateien werden unter ~/logs gespeichert. Also nicht vergessen:
cd
mkdir logs


Jeden Tag wird eine neue Datei angelegt, deren Dateiname dem Tagesdatum entspricht. Z.B. 2014_06_09.log für den 09.06.2014.
Die Dateigröße einer solchen Tages-Datei liegt üblicherweise zwischen 20KB und 30KB. Pro Jahr somit etwa 10MB.
Sehr viel ist das zwar nicht...trotzdem habe ich mir auf ~/logs ein nfs-Share vom VM-Host gemountet.
Somit füllt sich einerseits das Dateisystem der VM durch die Logs nicht, ein viel wichtigeres Feature ist aber, dass die Logs leicht[er] für ein anderes Programm (s.u.) zugreifbar sind.
Und auf der VM brauchts nur eine Zeile in /etc/fstab:
11w://vms/ssh/logs/tunnel /home/dede/logs nfs defaults 0 0
...unter der Voraussetzung, dass auf dem VM-Host namens 11w eine nfs-Freigabe existiert, unterhalb der die Verzeichnisse ./vms/ssh/logs/tunnel liegen.

BTW: das Script funktioniert nur dann, wenn es (per cron-Job) jede Minute aufgerufen wird.
Werte werden nur dann ins Log geschrieben, wenn das Script vor mindestens 58 und maximal 62 Sekunden auch schon mal gelaufen ist.

Weiterhin sollte auch hier analog zu TunnelVM dem cron-Daemon das Logging in /var/log/auth.log und /var/log/syslog abgewöhnt werden.


Log-Files

Die Log-Files haben den Aufbau
    Zeit    <Leerzeichen>    Empfangsdatenrate    <Leerzeichen>    Sendedatenrate

Also etwa so:
00:00 603171 263501
00:01 583369 258071
00:02 695308 253680
00:03 645328 258900
00:04 653133 256595
00:05 592954 258870
00:06 566347 255666
[....]
23:55 458366 301832
23:56 487447 305495
23:57 461396 316329
23:58 558681 307666
23:59 635217 318183


Die Werte für Empfangsdatenrate und Sendedatenrate sind die durchschnittlichen "Bytes pro Sekunde" während der angegebenen Minute.

Hier noch ein Test-Log, um damit ggf. das folgende Programm testen zu können. Und noch eins mit allen 60*24 Werten.


Das Programm zur grafischen Anzeige der Logs

Das Script tun0graf.py läuft auf einem System mit grafischer Oberfläche und benötigt wxWidgets oder wxPython.
Also z.B:
    python-wxWidgets-2.8.12.1-7.1.2.x86_64    für openSUSE
oder
    wxPython-2.8.12.0-5.fc20.x86_64    für Fedora.

Wird das Script gestartet, erscheint zunächst mal ein leeres Fenster mit einer Skala:
Screenshot von tun0graf.py

Log-Dateien werden per Drag&Drop, per Menü bzw. Datei-Auswahl-Dialog (s.u.) oder via Befehlszeilenparameter (s.u.) geladen.
Weiterhin können Log-Dateien auch aus tar.gz- oder tar.bz2-Archiven gelesen werden.
Wird statt einer Log-Datei ein solches Archiv via Menü oder Drag&Drop geladen, öffnet sich ein Dialogfenster zur Auswahl der gewünschten Log-Datei:
Dateiauswahl innerhalb eines Archives

Beim Laden eines Archives via Befehlszeilenparameter wird immer die erste Log-Datei aus dem Archiv geladen.
Wenn bereits eine Datei geladen ist bzw. angezeigt wird, kann mit den Tasten Cursor-Links und Cursor-Rechts zwischen den Dateien im aktuellen Verzeichnis bzw. Archiv gewechselt werden.

Nachdem eine Log-Datei geladen wurde, sieht es etwa so aus:
Screenshot von tun0graf.py

Natürlich kann das Fenster auch in seiner Größe verändert werden.
kleinerer Screenshot von tun0graf.py

Oder es kann ein Ausschnitt aufgezogen werden (indem man mit der linken Maustaste einen Punkt in der Grafik anklickt, die Taste gedrückt hält, mit der Maus an eine andere Stelle in der Grafik fährt und dort die linke Maustaste loslässt).
Hier mal von 20:16 (unten) bis ~20:50 (oben):
Bereich wird aufgezogen

Die Unterkante des Ausschnitts ist immer die Null-Linie der Skala, verändert werden Start-Zeit, End-Zeit und maximal angezeigte Übertragungsgeschwindigkeit.
Das Ergebnis der Ausschnittswahl / des Zoom-Vorgangs aus dem vorigen Bild sieht so aus:
aufgezogener Bereich

Wird während des Aufziehen eines Ausschnitts zusätzlich die Strg-Taste gedrückt gehalten, erfolgt der Zoom in die andere Richtung - der Ausschnitt wird vergrößert.
Statt des unten offenen Rechtecks werden in diesem Fall zwei senkrechte Linien dargestellt:
Zoom mit Strg-Taste

Hier wurde von 20:31 bis 20:40 aufgezogen, also neun Minuten.
Das Ergebnis dieses Zooms führt zu folgendem Ausschnitt, der an beiden Enden um neun Minuten vergrößert wurde:
Zoom mit Strg-Taste Ergebnis

Beim Aufziehen wird man evt. gelegentlich sehen, dass die Markierungslinien zu einem Pfeil werden.
Etwa so:
Verschieben

Ein Pfeil wird immer dann dargestellt, wenn die X- oder Y-Koordinate des Punktes, an dem man die linke Maustaste gedrückt hat, weniger als 10 Pixel von der X- bzw. Y-Koordinate des Punktes abweicht, an der der Mauscursor gerade steht - also statt einer Fläche eine Gerade aufgezogen wird.
In diesem Fall wird dann kein Ausschnitt der Kurve aufgezogen, sondern der angezeigte Bereich der Kurve (sofern möglich) gescrollt bzw. verschoben.

Der Scroll- bzw. Verschiebe-Vorgang aus obigem Bild würde zu folgender neuen Anzeige führen:
verschoben

Es wird so weit in die gewählte Richtung gescrollt, wie der Pfeil lang war.
Hier ist das Ergebnis 20:07 auf 19:51 - also 16 Minuten.
Der Pfeil ging von 20:27 bis 20:43 - was ebenfalls 16 Minuten entspricht.

Mit dem MausRad kann ebenfalls horizontal gescrollt werden, bei gleichzeitigem Drücken der Strg-Taste wird vertikal gescrollt.
Ein Scroll-Schritt ist in diesem Fall immer 10% der Fenster-Breite (mind. eine Minute) bzw. 10% der Fenster-Höhe.

Es kann auch sehr tief reingezoomt werden. Hier z.B. in den Reconnect des Tunnels um 04:00 Uhr:
tief gezoomt

Die blaue Kurve stellt übrigens den Empfang, die rote Kurve das Senden und die hellrote (oder wie auch immer die Farbe heißen mag) die jeweils kleinere Kurve dar.
Diese "kleinere Kurve" wird immer über der Sende- und Empfangs-Kurve dargestellt und sorgt dafür, dass die Höhe beider Kurven jederzeit erkannt werden kann - unabhängig davon, welche Kurve höher ist oder in welcher Reihenfolge sie ausgegeben werden.

Die Statuszeile hat vier Bereiche.
Ganz links wird der Dateiname angezeigt, danach die Anzahl der Zoom-Schritte, dann die zuletzt angeklickte Stelle in der Kurve im Format "Geschwindigkeit @ Zeitpunkt".
Ganz rechts wird die übertragene Datenmenge für den gesamten Tag dargestellt.

Innerhalb der Kurven-Skala wird die übertragene Datenmenge des aktuell angezeigten Ausschnitts dargestellt:
Screenshot v1.31 mit anzeige der übertragenen Datenmenge



Das Menü von tun0graf.py

Das Programm verwendet ein Kontextmenü:
offenes Menü

Es bedeuten:
letzten Zoom zurücknehmen
Nimmt den letzten Zoom-Schritt zurück.
Zoom auf Grundstellung
Löscht alle Zoom-Schritte und zeigt wieder einen Zeitbereich von 24 Stunden an, bei dem die Oberkante der Y-Achse auf der höchsten Geschwindigkeit des jeweils angezeigten Tages steht.
Log laden
Hier kann eine Log-Datei über einen Datei-Auswahl-Dialog geladen werden. Es wird das Verzeichnis als Vorauswahl eingestellt, aus dem zuletzt eine Log-Datei geöffnet wurde.
SendeKurve anzeigen
Schaltet die Anzeige der (roten) Sende-Kurve um bzw. an oder aus.
EmpfangsKurve anzeigen
Analog für die (blaue) Empfangs-Kurve.
Überlagerung anzeigen
Ebenso für die (hellrote) jeweils kleinere Kurve.
MinutenMarker anzeigen
Schaltet die Minuten-Marker am unteren Fensterrand an oder aus.
Änderungen verfolgen
Ist nur auswählbar, wenn das Log-File des aktuellen Tages angezeigt wird. In diesem Fall kann das Log-File sekündlich auf Änderung (seiner Dateigröße) geprüft werden, um bei erkannter Änderung bzw. Verlängerung die neuen Geschwindigkeitswerte zu laden und zur Anzeige zu bringen.
lokale Y-Anpassung
Wenn markiert, führt es bei "Änderungen verfolgen" dazu, dass die Y-Achse der Kurve bei neu hinzukommenden Werten so korrigiert wird, dass die höchste, im aktuell angezeigten Ausschnitt dargestellte, Geschwindigkeit komplett ins Bild passt.
Snapshot speichern
Nach einem Datei-Speicher-Dialog zur Abfrage eines Dateinamens wird die aktuell angezeigte Kurve als PNG-Bild gespeichert.
aktuelle Einstellungen speichern
Speichert die Einstellungen "Bildschirmposition des Fensters", "Größe des Fensters" und die Markierung der entspr. Menüpunkte in der Datei ~/tun0graf.conf, um sie beim nächsten Programmstart von "tun0graf.py" rekonstruieren zu können.
über das Programm
Öffnet ein kleines Fenster mit Informationen über das Programm.



Befehlszeilenparameter

tun0graf.py kennt (neben -h und --help) die drei Parameter log_filename, -s snapshot_filename, -z size und -c curve.
Die Syntax lautet:   tun0graf.py [-h] [log_filename [-s snapshot_filename]] [-z size] [-c S|R|O] Befehlszeilenparameter überstimmen möglicherweise anderslautende Einstellungen in der Datei ~/.tun0graf.conf.

Der Aufruf
tun0graf.py ~/11w/logs/tunnel/2014_06_12.log -s ~/bild -z 730,200
führt dazu, dass im Homeverzeichnis eine 730x200 Pixel große Bilddatei bild.png als Snapshot der Log-Datei ~/11w/logs/tunnel/2014_06_12.log erstellt wird:
aus dem Programm heraus erstellter Screenshot


Um nur die Sendekurve zu erhalten, ist zusätzlich -c S  zu übergeben.
tun0graf.py ~/11w/logs/tunnel/2014_06_12.log -s ~/bild2 -z 730,200 -c S
Das führt zu folgendem bild2.png:
ein weiterer aus dem Programm heraus erstellter
      Screenshot