Python

Erstellen Sie Ihren eigenen Netzwerkmonitor mit PyShark

Erstellen Sie Ihren eigenen Netzwerkmonitor mit PyShark

Vorhandene Werkzeuge

Viele Tools zur Netzwerkanalyse gibt es schon länger. Unter Linux sind dies beispielsweise Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack sowie Tachometer und ettercap. Für eine detaillierte Beschreibung können Sie sich den Vergleich von Silver Moon ansehen [1].

Warum also nicht ein vorhandenes Tool verwenden und stattdessen ein eigenes schreiben? Gründe, die ich sehe, sind ein besseres Verständnis der TCP/IP-Netzwerkprotokolle, das Erlernen des richtigen Programmierens oder die Implementierung nur der spezifischen Funktionen, die Sie für Ihren Anwendungsfall benötigen, da die vorhandenen Tools Ihnen nicht das bieten, was Sie tatsächlich benötigen. Darüber hinaus können auch Geschwindigkeits- und Lastverbesserungen Ihrer Anwendung/Ihres Systems eine Rolle spielen, die Sie motiviert, mehr in diese Richtung zu gehen.

In freier Wildbahn gibt es mehrere Python-Bibliotheken für die Netzwerkverarbeitung und -analyse. Für die Low-Level-Programmierung ist die Socket-Bibliothek [2] der Schlüssel. Protokollbasierte Bibliotheken auf hoher Ebene sind httplib, ftplib, imaplib und smtplib. Um Netzwerkports und den Paketstrom konkurrierende Kandidaten zu überwachen, werden python-nmap [3], dpkt [4] und PyShark [5] verwendet. Sowohl zum Überwachen als auch zum Ändern des Paketstroms ist die Scapy-Bibliothek [6] weit verbreitet.

In diesem Artikel werfen wir einen Blick auf die PyShark-Bibliothek und überwachen, welche Pakete an einer bestimmten Netzwerkschnittstelle ankommen. Wie Sie unten sehen werden, ist die Arbeit mit PyShark unkompliziert. Die Dokumentation auf der Projektwebsite hilft Ihnen bei den ersten Schritten - damit kommen Sie sehr schnell zu einem brauchbaren Ergebnis. Wenn es jedoch um das Wesentliche geht, ist mehr Wissen erforderlich.

PyShark kann viel mehr, als es auf den ersten Blick scheint, und leider deckt die vorhandene Dokumentation dies zum Zeitpunkt dieses Schreibens nicht vollständig ab. Das macht es unnötig schwer und ein guter Grund, tiefer unter die Motorhaube zu schauen.

Über PyShark

PyShark [8] ist ein Python-Wrapper für Tshark [10]. Es nutzt einfach seine Fähigkeit, XML-Daten mit seinem Parsing zu exportieren export. Tshark selbst ist die Kommandozeilenversion von Wireshark. Sowohl Tshark als auch PyShark hängen von der Pcap-Bibliothek ab, die tatsächlich Netzwerkpakete erfasst und unter der Haube von Tcpdump verwaltet wird [7]. PyShark wird von Dan entwickelt und ständig gepflegt (er verwendet den Namen KimiNewt auf Twitter).

Um mögliche Verwechslungen zu vermeiden, gibt es ein ähnlich klingendes Tool, Apache Spark [11], eine vereinheitlichte Analyse-Engine für die umfangreiche Datenverarbeitung. Der Name PySpark wird für die Python-Schnittstelle zu Apache Spark verwendet, auf die wir hier nicht eingehen.

PyShark installieren

PyShark erfordert, dass sowohl die Pcap-Bibliothek als auch Tshark installiert sind. Die entsprechenden Pakete für Debian GNU/Linux 10 und Ubuntu heißen libpcap0.8 und tshark und kann mit apt-get wie folgt eingerichtet werden:

Listing 1: Installation der Pcap-Bibliothek und Tshark

# pip3 python-pyshark installieren

Falls noch nicht installiert, müssen auch Python3 und Pip hinzugefügt werden. Die entsprechenden Pakete für Debian GNU/Linux 10 und Ubuntu heißen python3 und python3-pip und können mit apt-get wie folgt installiert werden:

Listing 2: Python 3 und PIP für Python 3 installieren

# apt-get install python3 python3-pip

Jetzt ist es an der Zeit, PyShark hinzuzufügen. Basierend auf unseren Recherchen ist PyShark noch nicht für eine große Linux-Distribution paketiert. Die Installation erfolgt mit dem Python-Paketinstaller pip3 (pip für Python 3) als systemweites Paket wie folgt:

Listing 3: PyShark mit PIP . installieren

# pip3 python-pyshark installieren

Jetzt kann PyShark in Python-Skripten auf Ihrem Linux-System verwendet werden. Bitte beachten Sie, dass Sie die folgenden Python-Skripte als Administrator ausführen, zum Beispiel mit sudo, da die Pcap-Bibliothek es Ihnen nicht erlaubt, als regulärer Benutzer nach Paketen zu suchen.

Die folgende Anweisung fügt den Inhalt des PyShark-Moduls zum Namespace Ihres Python-Skripts hinzu:

Listing 4: Importieren des PyShark-Moduls

pyshark importieren

Methoden zum Erfassen von Paketen

PyShark wird standardmäßig mit zwei verschiedenen Modi geliefert, mit denen es angeboten wird, Pakete von der beobachteten Netzwerkschnittstelle zu sammeln. Verwenden Sie für die kontinuierliche Erfassung die LiveCapture()-Methode und zum Speichern in einer lokalen Datei die FileCapture()-Methode aus dem PyShark-Modul. Das Ergebnis ist eine Paketliste (Python-Iterator-Objekt), mit der Sie das erfasste Datenpaket nach Paket durchgehen können. Die folgenden Auflistungen zeigen, wie die beiden Methoden verwendet werden.

Listing 5: Verwenden Sie PyShark zum Aufnehmen von der ersten Wifi-Schnittstelle wlan0

pyshark importieren
fangen = pyshark.LiveCapture(Schnittstelle='wlan0')

Mit den vorherigen Anweisungen werden die erfassten Netzwerkpakete im Speicher gehalten. Der verfügbare Speicher kann begrenzt sein, jedoch ist das Speichern der erfassten Pakete in einer lokalen Datei eine Alternative. Verwendet wird das Pcap-Dateiformat [9]. Dadurch können Sie die erfassten Daten auch von anderen Tools verarbeiten und interpretieren, die ebenfalls mit der Pcap-Bibliothek verknüpft sind.

Listing 6: Verwenden Sie PyShark, um die erfassten Pakete in einer lokalen Datei zu speichern

pyshark importieren
fangen = pyshark.FileCapture('/tmp/networkpackages.Deckel')

Wenn Sie die Listen 5 und 6 ausführen, haben Sie noch keine Ausgabe not. Im nächsten Schritt grenzen Sie die abzuholenden Pakete nach Ihren Wunschkriterien genauer ein.

Pakete auswählen

Das zuvor eingeführte Capture-Objekt stellt eine Verbindung zur gewünschten Schnittstelle her. Als nächstes sammeln die beiden Methoden sniff() und sniff_continuously() des Capture-Objekts die Netzwerkpakete. sniff() kehrt zum Aufrufer zurück, sobald alle angeforderten Pakete gesammelt wurden. Im Gegensatz dazu liefert sniff_continuously() dem Aufrufer ein einzelnes Paket, sobald es abgeholt wurde. Dies ermöglicht einen Live-Stream des Netzwerkverkehrs.

Darüber hinaus lassen sich mit den beiden Methoden verschiedene Beschränkungen und Filtermechanismen von Paketen festlegen, zum Beispiel die Anzahl der Pakete mit dem Parameter packet_count und den Zeitraum, in dem die Pakete gesammelt werden sollen mit dem Parameter timeout. Listing 7 zeigt, wie man 50 Netzwerkpakete nur als Livestream mit der Methode sniff_continuously() sammelt.

Listing 7: Sammeln Sie 50 Netzwerkpakete von wlan0

pyshark importieren
fangen = pyshark.LiveCapture(Schnittstelle='wlan0')
für Paket in Capture.sniff_continuously(packet_count=5):
drucken (Paket)

Verschiedene Paketdetails sind mit der Anweisung print(packet) sichtbar (siehe Abbildung 1).

Abbildung 1: Packungsinhalt

In Listing 7 haben Sie alle Arten von Netzwerkpaketen gesammelt, unabhängig von Protokoll oder Service-Port. PyShark ermöglicht Ihnen eine erweiterte Filterung mit dem sogenannten BPF-Filter [12]. Listing 8 zeigt, wie Sie 5 TCP-Pakete sammeln, die über Port 80 eingehen und den Pakettyp ausgeben. Die Informationen werden im Paketattribut höchste_schicht gespeichert.

Listing 8: Nur TCP-Pakete sammeln

pyshark importieren
fangen = pyshark.LiveCapture(interface='wlan0', bpf_filter='tcp port 80')
Erfassung.sniff(packet_count=5)
drucken (einfangen)
für Paket in Capture:
drucken (Paket.höchste_schicht)

Listing 8 als Datei tcp-sniff speichern.py und führen Sie das Python-Skript aus. Die Ausgabe ist wie folgt:

Listing 9: Die Ausgabe von Listing 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Auspacken der erfassten Pakete

Das eingefangene Objekt funktioniert wie eine russische Matroska-Puppe - Schicht für Schicht enthält es den Inhalt des entsprechenden Netzwerkpakets. Das Auspacken fühlt sich ein bisschen wie Weihnachten an – man weiß nie, welche Informationen man darin findet, bis man es geöffnet hat. Listing 10 zeigt das Erfassen von 10 Netzwerkpaketen und das Aufdecken des Protokolltyps, sowohl des Quell- als auch des Zielports und der Adresse.

Listing 10: Quelle und Ziel des erfassten Pakets anzeigen

pyshark importieren
Importzeit
# Schnittstelle definieren
networkInterface = "enp0s3"
# Capture-Objekt definieren
fangen = pyshark.LiveCapture(Schnittstelle=NetzwerkSchnittstelle)
print("Abhören auf %s" % networkInterface)
für Paket in Capture.sniff_continuously(packet_count=10):
# angepasste Ausgabe
Versuchen:
# Zeitstempel abrufen
Ortszeit = Zeit.asctime (Zeit.Ortszeit (Uhrzeit).Zeit()))
# Paketinhalt abrufen
Protokoll = Paket.transport_layer # Protokolltyp
src_addr = Paket.ip.src # Quelladresse
src_port = Paket[Protokoll].srcport # Quellport
dst_addr = Paket.ip.dst # Zieladresse
dst_port = Paket[Protokoll].dstport # Zielport
# Paketinformationen ausgeben
drucken ("%s IP %s:%s <-> %s:%s (%s)" % (Lokalzeit, src_addr, src_port, dst_addr, dst_port, Protokoll))
außer AttributeError als e:
# Ignoriere andere Pakete als TCP, UDP und IPv4
bestehen
drucken (" ")

Das Skript erzeugt eine Ausgabe, wie in Abbildung 2 gezeigt, eine einzelne Zeile pro empfangenem Paket. Jede Zeile beginnt mit einem Zeitstempel, gefolgt von der Quell-IP-Adresse und dem Port, dann der Ziel-IP-Adresse und dem Port und schließlich dem Typ des Netzwerkprotokolls.


Abbildung 2: Quelle und Ziel für erfasste Pakete

Fazit

Es war noch nie so einfach, einen eigenen Netzwerkscanner zu erstellen. Basierend auf den Grundlagen von Wireshark bietet Ihnen PyShark ein umfassendes und stabiles Framework, um die Netzwerkschnittstellen Ihres Systems so zu überwachen, wie Sie es benötigen.

Links und Referenzen

  • [1] Silver Moon: 18 Befehle zur Überwachung der Netzwerkbandbreite auf einem Linux-Server, https://www.binäre Gezeiten.com/linux-befehle-monitor-network/
  • [2] Python-Socket-Bibliothek, https://docs.Python.org/3/Bibliothek/Socket.html
  • [3] python-nmap, https://pypi.org/project/python3-nmap/
  • [4] dpkt, https://pypi.org/project/dpkt/
  • [5] PyShark, https://pypi.org/projekt/pyshark/
  • [6] scapy, https://pypi.org/projekt/scapy/
  • [7] Tcpdump und libpcap, http://www.tcpdump.Organisation/
  • [8] PyShark, Projektwebsite, http://kiminewt.github.io/pyshark/
  • [9] Libpcap-Dateiformat, Wireshark-Wiki, https://gitlab.com/wireshark/wireshark/-/wikis/Development/LibpcapFileFormat
  • [10] Tshark, https://www.Drahthai.org/docs/man-pages/tshark.html
  • [11] Apache Spark, https://spark.Apache.Organisation/
  • [12] BPF-Filter, https://wiki.Drahthai.org/CaptureFilters
So installieren und spielen Sie Doom unter Linux
Einführung in Doom Die Doom-Serie entstand in den 90er Jahren nach der Veröffentlichung des ursprünglichen Doom. Es war sofort ein Hit und seitdem hat...
Vulkan für Linux-Benutzer
Mit jeder neuen Grafikkartengeneration stoßen Spieleentwickler an die Grenzen der grafischen Wiedergabetreue und kommen dem Fotorealismus einen Schrit...
OpenTTD vs. Simutrans
Das Erstellen einer eigenen Transportsimulation kann Spaß machen, entspannend und äußerst verlockend sein. Deshalb sollten Sie so viele Spiele wie mög...