Netzwerktests auf der Shell

Netzwerktests auf der Shell sind keine Hexerei und können schnell und einfach durchgeführt werden. Ein kleiner Überblick über die Programme.

TL;DR

Vorstellung von kommandozeilenorientierten Programmen für die Messung von Netzwerkgeschwindigkeiten

Netzwerkbandbreitentest

Netzwerktests sind immer eine kleine Bestandsaufnahme für den Administrator eines Netzwerkes.
Anhand dieser kann man herausfinden wenn etwas im unargen liegt und auch Fehler innerhalb der Topologie eingrenzen.

Für die Konektivität gibt es die bekannten Werkzeuge wie ping, traceroute, dig, nslookup etc., sowie die IPv6-Pendants, wenn es keine Parameter für die Wahl zwischen IPv4 und IPv6 gibt.

Bedacht werden muss immer, dass die Messung nur den momentanen Istzustand wiedergibt.
Dieser schließt sich nach mehreren Faktoren auf wie z.B. nach der Nutzung der Netzwerktopologie, nach dem Zustand der Server etc
Auch wenn zu 90% gleichbleibende Umstände herrschen können die restlichen 10% der Flaschenhals sein.

MTU/MSS IP-Fragmentierung

Ich möchte in dem Fall nicht auf die Zusammenhänge von MSS/MTU und IP Fragementation eingehen und verweise schlicht auf den Beitrag MTU – Maximum Transfer Unit im Elektronik Kompendium.

In dem Artikel, also diesen welcher gerade gelesen wird, geht es um eine erste Bestandsaufnahme der Bandbreite mit einer einfachen Bandbreitenmessung anhand des gegebenen Wert der MTU von 1500. Siehe die Ausgabe von ifconfig nach einer Installation von Linux auf einem Server.

Der Grund dafür ist, dass man die Pakete nur marginal anpassen könnte, da man deren Weg nicht wirklich durch das Netz kennt.

Klar ist, dass ein Abruf der Daten von dem Server aus Kanada sich unterscheidet gegenüber einen Aufruf aus China, aus Australien oder aus Hawaii.

Natürlich kann man anhand von Logdateien schauen welcher Aufruf prozentual der höchste ist und somit den MTU-Wert für diese Region anpassen.

Nach einiger Überlegung sollte aber Jedem klar sein, dass dies Unfug ist und eine Optimierung des Servers doch an anderer Stelle vorgenommen werden sollte.

Somit ist das MTU-Frickeln erst einmal nebensächlich, außer man hat Zugriff auf die gesamte Netzwerktopologie.

Messen der Bandbreite auf der Shell

Für das Messen der Bandbreite stehen Programme zu der Verfügung, welche entweder autark funktionieren, oder dem Prinzip des Server-Client-Modells unterliegen.
Das bedeutet es muss ein Server für das Senden der Daten installiert sein und auf der Gegenseite ein Client welcher bei der Datenmessung der Empfänger ist.

Beides hat seine Vorteile und richtet sich je nach Einsatzzweck.

Speedtest

Ein Shellscript für das interkontinentale Testen der Netzwerkgeschwindigkeit.

Ich habe schon öfters Scripte geschrieben und Netzwerkmessungen durchgeführt und hatte vorteilhafter Weise immer die Möglichkeiten auch Zugriff auf die Gegenseite zu haben.
Das ist in vielen Fällen so gewollt und perfekt für ein geschlossenes Netzwerk in einer Firma, VPN oder weiteres.

Aber im Grunde war es nie wirklich möglich interkontinental, global zu messen und definitiv nicht im Privaten.
Es fehlte so etwas wie das „simple poormans speed measurement tool“ für die Shell, welches es schon mehr als öfters in der Webbrowserform gibt.

Matt Martz, alias Sivel, hat ein kleines Script mit dem Namen speedtest-cli auf github hochgeladen, welches sich die Server von Speedtest.net zu nutze macht und mit Hilfe der Serverliste die Bandbreite misst.

Nach der Installation per git clone https://github.com/sivel/speedtest-cli.git, oder
wget https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
ist das Pythonprogramm auch schon Einsatzbereit.

Die sehr lange Ausgabe der Serverliste erfolgt per:

chris@gottty:~/work/speedtest-cli$ ./speedtest.py --list
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
3681) FreeMobile (Paris, France) [1.59 km]
3782) Orange France (Paris, France) [1.59 km]
2770) SFR (Paris, France) [1.59 km]
1688) Bouygues Telecom (Paris, France) [1.59 km]
--- ✂ ---

Dies ist von Nutzen falls man nicht den nächstmöglichen Server für die Bandbreitenmessung nehmen möchte, sondern z.B. Server in Deutschland:

chris@gottty:~/work/speedtest-cli$  ./speedtest.py --list  |grep Germany 
3692) intersaar GmbH (Saarbrücken, Germany) [339.15 km]
3772) K-net Telekommunikation GmbH (Kaiserslautern, Germany) [399.25 km]
2769) Haimspiel Media GmbH (Cologne, Germany) [404.01 km]
1563) myplex.org (Cologne, Germany) [404.01 km]
2364) Black Fibre Networks Ltd (Karlsruhe, Germany) [442.12 km]
4012) pczialist.de (Karlsruhe, Germany) [442.12 km]
3794) MKTH (Hohentengen, Germany) [472.89 km]
--- ✂ ---

Anhand der ID, wie nehmen mal intersaar GmbH, kann nun die Bandbreite mit genau dem angegebenen Server gemessen werden:

chris@gotty:~/work/speedtest-cli$ ./speedtest.py --server 3692
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from OVH Systems (TOLLEIP)...
Hosted by intersaar GmbH (Saarbrücken) [339.15 km]: 80.268 ms
Testing download speed........................................
Download: 92.28 Mbit/s
Testing upload speed..................................................
Upload: 68.64 Mbit/s

Falls einfach nur die Netzwerkgeschwindigkeit getestet werden soll reicht der einfache Aufruf von speedtest-cli.
Es wird der nächste Server in der Umgebung anhand eines Pings mit einer neu geladenen Serverliste ermittelt und dann die Netzwerkbandbreite gemessen:

chris@gottty:~/work/speedtest-cli$ ./speedtest.py 
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from OVH Systems (TOLLEIP)...
Selecting best server based on ping...
Hosted by SFR (Paris) [1.59 km]: 78.996 ms
Testing download speed........................................
Download: 93.14 Mbit/s
Testing upload speed..................................................
Upload: 81.29 Mbit/s

Was mir ganz offen noch fehlt, wäre die Möglichkeit mehrere Server angeben zu können und dann eine Durchschnittsgeschwindigkeit zu haben. Vielleicht noch in verschiedenen angrenzenden Ländern, auf Wunsch auch interkontinental.
Im Moment ist man noch dazu gezwungen dies händisch oder per Scriptaufruf und temporärer Dateien zu erledigen.

Nuttcp

Ein Urgestein der Netzwerkmessung

Nuttcp basiert auf nttcp (Silicon Graphics) , welches wiederum eine Weiterentwicklung von ttcp (Mike Muuss, Berkeley 1984) ist.
Erweitert wurden IPv6, IPv4 Muticast, setzen der MSS etc

Nuttcp funktioniert nach dem Server-Client-Modell und ist in den Repositories von Debian und in den FreeBSD-Ports vorhanden.

Auf dem Server wird nuttcp mit dem Parameter -s gestartet und auf Wunsch kann noch mit dem Parameter -P ein Port angegeben werden.

Wenn nuttcp als Server gestartet wird forkt es sich automatisch in den Hintergrund und verbleibt dort bis ein Fehler auftritt, oder der Prozess per kill beendigt wird. Dies kann man mit dem Parameter –nofork unterbinden.

root@gottty:/home/chris# nuttcp -S

Auf dem Client wird nuttcp mit der IP des Servers als Parameter gestartet und es dauert 10 Sekunden bis der Test eine Ausgabe ergibt.

root@takeshi:/home/seraphyn# nuttcp IPDESSERVERS
    2.9388 MB /  10.34 sec =    2.3835 Mbps 0 %TX 0 %RX 0 retrans 25.41 msRTT

Der Rest gibt Auskunft darüber

  • Wie viel Daten gesendet wurden: 2.9388
  • Der durchschnittliche Datendurchsatz: 2.3835
  • CPU Auslastung des Servers: 0 %RX
  • CPU Auslastung des Clients: 0 %TX

Das ganze wird mit dem Parameter -i 1, Berichte jede n Sekunden, etwas Aussagekräftiger.

Werden der Server und der Client mit dem Parameter -xt gestartet nutzt man noch die Möglichkeit ein automatisches Traceroute auszuführen.

Mit dem Parameter -T lässt sich die Testzeit verlängern, mit dem Parameter -w die TCP Empfangsfenstergröße verändern und mit…. am besten nuttcp ohne Parameter aufrufen, oder das Handbuch konsultieren.

iperf

iperf Testwerkzeug des National Laboratory for Advanced Network Research

iperf hat es nach der Vorstellung von nuttcp ein wenig schwer. Auch dieses Programm arbeitet nach dem Client-Server-Model und ist, wie z.B. auch das Perlwerkzeug NLANR/DAST Multicast Beacon für das Monitoring von Multicastverbindungen , im Rahmen eines Projektes entstanden.
Bei dem Projekt ging es darum das Verhalten von Hochleistungsverbindungsnetzwerke (HPC) aufgrund von passiver und aktiver Netzwerkmessungen und Analyse zu charakterisieren.
Teilweise findet man Informationen über das Projekt noch hier, oder auch auf Archive.org

iperf ist vielleicht nicht so umfangreich wie nuttcp, aber es reicht für einfache grundlegende Messungen und lässt sich über die Repositories von Debian, oder die Ports von FreeBSD installieren.

Siehe dazu auch IPERF – The Easy Tutorial

netcat

Die universelle Schnittstelle

netcat kann so ziemlich alles mit Datenströmen anstellen was man möchte, da es dem Programm egal ist was man Ihn an Daten übergibt. Mit netcat kann man viele schöne Dinge machen wie z.B.:

  • Portscannen > netcat
    ⏚ [seraphyn:~] 1 $ nc -z -v -n 192.168.0.16 80
    (UNKNOWN) [192.168.0.16] 80 (http) open
  • Dateitransfer > netcat
    Server

    ⏚ [seraphyn:~] $ nc -l 12973 < TEXT

    Client

    ⏚ [chris:~] $ nc -n 192.168.0.31 12973 > TEXT
  • Verschlüsselte Daten über das Netzwerk senden > netcat
    Server

    ⏚ [seraphyn:~] $ nc localhost 12973 | mcrypt –flush –bare -F -q -d -m ecb > TEXT

    Client

    ⏚ [chris:~] $ mcrypt –flush –bare -F -q -m ecb < TEXT | nc -l 12973
  • Laufwerk über das Netzwerk klonen > netcat
    Server

    ⏚ [seraphyn:~] $ dd if=/dev/sda | nc -l 12973

    Client

    ⏚ [chris:~] $ nc -n 172.31.100.7 12973 | dd of=/dev/sda
  • etc etc etc hat nicht Jemand mal ein Buch geschrieben ?
  • Speedtest, na endlich, > netcat
    Server

    ⏚ [seraphyn:~] $ nc -l -p 12973 > /dev/null
    

    Client

    ⏚ [chris:~] $ pv -r /dev/zero | nc IPDESSERVERS 12973
    [ 300kB/s]
    

Und natürlich auch viele unschöne Dinge, welches das Programm zu einem der Lieblinge der Grauzone macht.
netcat funktioniert nach dem Server-Client-Model, aber wiederum auch nicht, es kommt immer auf die Aufgaben an.
netcat ist auf jeden Fall eine wunderbare Sache für Scripte und das Schweizer Taschenmesser des Administrators.

Ich hoffe der kleine Überblick hat Spaß gemacht und vielleicht hat es etwas Lust auf mehr im Bereich Netzwerktechnik gemacht.