Python

Uw eigen netwerkmonitor bouwen met PyShark

Uw eigen netwerkmonitor bouwen met PyShark

Bestaande tools

Er bestaan ​​al geruime tijd veel tools voor netwerkanalyse. Onder Linux zijn dit bijvoorbeeld Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack evenals snelheidsmeter en ettercap. Voor een gedetailleerde beschrijving ervan, kun je de vergelijking van Silver Moon bekijken [1].

Dus waarom zou u geen bestaande tool gebruiken en in plaats daarvan uw eigen tool schrijven?? Redenen die ik zie zijn een beter begrip van TCP/IP-netwerkprotocollen, goed leren coderen of alleen de specifieke functie implementeren die u nodig hebt voor uw gebruik, omdat de bestaande tools u niet geven wat u werkelijk nodig hebt. Verder kunnen snelheids- en belastingsverbeteringen van uw applicatie/systeem ook een rol spelen die u motiveert om meer in deze richting te gaan.

In het wild bestaan ​​er nogal wat Python-bibliotheken voor netwerkverwerking en -analyse. Voor programmeren op laag niveau is de socketbibliotheek [2] de sleutel. Op protocol gebaseerde bibliotheken op hoog niveau zijn httplib, ftplib, imaplib en smtplib. Om netwerkpoorten en de pakketstroom concurrerende kandidaten te bewaken, worden python-nmap [3], dpkt [4] en PyShark [5] gebruikt. Voor zowel het bewaken als het wijzigen van de pakketstroom wordt de scapy-bibliotheek [6] veel gebruikt.

In dit artikel zullen we de PyShark-bibliotheek bekijken en controleren welke pakketten bij een specifieke netwerkinterface aankomen. Zoals je hieronder zult zien, is het werken met PyShark eenvoudig. De documentatie op de projectwebsite helpt je bij de eerste stappen - hiermee bereik je heel snel een bruikbaar resultaat. Als het echter om de kern gaat, is meer kennis nodig.

PyShark kan veel meer dan het op het eerste gezicht lijkt, en helaas, op het moment van schrijven, dekt de bestaande documentatie dat niet volledig. Dit maakt het onnodig lastig en is een goede reden om dieper onder de motorkap te kijken.

Over PyShark

PyShark [8] is een Python-wrapper voor Tshark [10]. Het gebruikt gewoon zijn mogelijkheid om XML-gegevens te exporteren met behulp van zijn parsing. Tshark zelf is de opdrachtregelversie van Wireshark. Zowel Tshark als PyShark zijn afhankelijk van de Pcap-bibliotheek die daadwerkelijk netwerkpakketten vangt en wordt onderhouden onder de motorkap van Tcpdump [7]. PyShark is ontwikkeld en wordt continu onderhouden door Dan (hij gebruikt de naam KimiNewt op Twitter).

Om mogelijke verwarring te voorkomen, bestaat er een soortgelijk klinkende tool, Apache Spark [11], een uniforme analyse-engine voor grootschalige gegevensverwerking. De naam PySpark wordt gebruikt voor de Python-interface naar Apache Spark, die we hier niet bespreken.

PyShark installeren

PyShark vereist dat zowel de Pcap-bibliotheek als Tshark zijn geïnstalleerd. De corresponderende pakketten voor Debian GNU/Linux 10 en Ubuntu heten libpcap0.8 en tshark en kan als volgt worden ingesteld met apt-get:

Lijst 1: De Pcap-bibliotheek en Tshark . installeren

# pip3 installeer python-pyshark

Indien nog niet geïnstalleerd, moeten Python3 en Pip ook worden toegevoegd. De corresponderende pakketten voor Debian GNU/Linux 10 en Ubuntu heten python3 en python3-pip en kunnen als volgt worden geïnstalleerd met apt-get:

Lijst 2: Installeer Python 3 en PIP voor Python 3

# apt-get install python3 python3-pip

Nu is het tijd om PyShark . toe te voegen. Op basis van ons onderzoek is PyShark nog niet verpakt voor een grote Linux-distributie. De installatie ervan wordt als volgt gedaan met behulp van het Python-pakketinstallatieprogramma pip3 (pip voor Python 3) als een systeembreed pakket:

Lijst 3: Installeer PyShark met PIP

# pip3 installeer python-pyshark

Nu is PyShark klaar om te worden gebruikt in Python-scripts op uw Linux-systeem. Houd er rekening mee dat u de onderstaande Python-scripts als beheerder moet uitvoeren, bijvoorbeeld met sudo, omdat de Pcap-bibliotheek u niet toestaat om als gewone gebruiker naar pakketten te zoeken.

De volgende instructie voegt de inhoud van de PyShark-module toe aan de naamruimte van uw Python-script:

Lijst 4: Importeer de PyShark-module

import pyshark

Methoden voor het vastleggen van pakketten

Out of the box, PyShark wordt geleverd met twee verschillende modi waarmee het biedt om pakketten te verzamelen van de waargenomen netwerkinterface. Gebruik voor continu verzamelen de methode LiveCapture() en voor het opslaan in een lokaal bestand gebruikt u de methode FileCapture() uit de PyShark-module. Het resultaat is een pakketlijst (Python iterator-object) waarmee u het vastgelegde gegevenspakket per pakket kunt doorlopen. De onderstaande lijsten laten zien hoe u de twee methoden kunt gebruiken:.

Lijst 5: gebruik PyShark om vast te leggen vanaf de eerste wifi-interface wlan0

import pyshark
capture = pyshark.LiveCapture(interface='wlan0')

Met de vorige instructies worden de vastgelegde netwerkpakketten in het geheugen bewaard. Het beschikbare geheugen kan beperkt zijn, maar het opslaan van de vastgelegde pakketten in een lokaal bestand is een alternatief. In gebruik is het Pcap-bestandsformaat [9]. Hierdoor kunt u de vastgelegde gegevens verwerken en interpreteren door andere tools die ook aan de Pcap-bibliotheek zijn gekoppeld.

Listing 6: Gebruik PyShark om de vastgelegde pakketten op te slaan in een lokaal bestand

import pyshark
capture = pyshark.FileCapture('/tmp/netwerkpakketten.pet')

Lopende lijsten 5 en 6, je hebt nog geen output. De volgende stap is om de pakketten die moeten worden verzameld nauwkeuriger te verfijnen op basis van uw gewenste criteria.

Pakketten selecteren

Het eerder geïntroduceerde capture-object brengt een verbinding tot stand met de gewenste interface. Vervolgens verzamelen de twee methoden sniff() en sniff_continuously() van het capture-object de netwerkpakketten. sniff() keert terug naar de beller zodra alle gevraagde pakketten zijn verzameld. Daarentegen levert sniff_continuously() een enkel pakket aan de beller zodra het werd verzameld. Hierdoor is een livestream van het netwerkverkeer mogelijk.

Bovendien kunt u met de twee methoden verschillende beperkingen en filtermechanismen van pakketten specificeren, bijvoorbeeld het aantal pakketten met behulp van de parameter packet_count, en de periode waarin de pakketten moeten worden verzameld met behulp van de parameter time-out. Listing 7 laat zien hoe je 50 netwerkpakketten kunt verzamelen, alleen, als een livestream, met behulp van de methode sniff_continuously().

Listing 7: Verzamel 50 netwerkpakketten van wlan0

import pyshark
capture = pyshark.LiveCapture(interface='wlan0')
voor pakket in capture.sniff_continuous(packet_count=5):
afdrukken (pakket)

Verschillende pakketdetails zijn zichtbaar met het statement print(packet) (zie figuur 1).

Afbeelding 1: inhoud van het pakket

In lijst 7 heb je allerlei netwerkpakketten verzameld, ongeacht het protocol of de servicepoort. Met PyShark kun je geavanceerd filteren, met behulp van het zogenaamde BPF-filter [12]. Listing 8 laat zien hoe je 5 TCP-pakketten verzamelt die binnenkomen via poort 80 en het pakkettype afdrukt. De informatie wordt opgeslagen in het pakketkenmerk hoogste_laag.

Listing 8: Alleen TCP-pakketten verzamelen

import pyshark
capture = pyshark.LiveCapture(interface='wlan0', bpf_filter='tcp-poort 80')
gevangen nemen.snuiven(packet_count=5)
afdrukken (vastleggen)
voor pakket in capture:
afdrukken (pakket).hoogste_laag)

Sla listing 8 op als het bestand tcp-sniff.py, en voer het Python-script uit. De uitvoer is als volgt:

Listing 9: De output van Listing 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

De vastgelegde pakketten uitpakken

Het vastgelegde object werkt als een Russische Matroska-pop - laag voor laag bevat het de inhoud van het bijbehorende netwerkpakket. Unboxing voelt een beetje als Kerstmis - je weet nooit welke informatie je erin vindt totdat je hem opende. Listing 10 demonstreert het vastleggen van 10 netwerkpakketten en het onthullen van het protocoltype, zowel de bron- als de bestemmingspoort en het adres.

Listing 10: Bron en bestemming van het vastgelegde pakket weergeven

import pyshark
import tijd
# interface definiëren
netwerkInterface = "enp0s3"
# definieer opnameobject
capture = pyshark.LiveCapture(interface=netwerkinterface)
print("luisteren op %s" % netwerkinterface)
voor pakket in capture.sniff_continuous(packet_count=10):
# aangepaste output
proberen:
# tijdstempel ophalen
lokale tijd = tijd.asctime(tijd).lokale tijd (tijd).tijd()))
# pakketinhoud ophalen
protocol = pakket.transport_layer # protocoltype
src_addr = pakket.ik p.src # bronadres
src_port = pakket[protocol].srcport # bronpoort
dst_addr = pakket.ik p.dst # bestemmingsadres
dst_port = pakket[protocol].dstport # bestemmingspoort
# uitvoer pakketinfo
print ("%s IP %s:%s <-> %s:%s (%s)" % (lokale tijd, src_addr, src_port, dst_addr, dst_port, protocol))
behalve AttributeError als e:
# negeer andere pakketten dan TCP, UDP en IPv4
voorbij lopen
afdrukken (" ")

Het script genereert een uitvoer, zoals weergegeven in figuur 2, een enkele regel per ontvangen pakket. Elke regel begint met een tijdstempel, gevolgd door het bron-IP-adres en de poort, dan het bestemmings-IP-adres en de poort, en ten slotte het type netwerkprotocol.


Afbeelding 2: Bron en bestemming voor vastgelegde pakketten

Conclusie

Het bouwen van uw eigen netwerkscanner was nog nooit zo eenvoudig. Gebaseerd op de fundamenten van Wireshark, biedt PyShark u een uitgebreid en stabiel raamwerk om de netwerkinterfaces van uw systeem te bewaken op de manier die u nodig heeft.

Links en referenties

  • [1] Silver Moon: 18 opdrachten om netwerkbandbreedte op Linux-server te bewaken, https://www.binaire getijden.com/linux-commands-monitor-network/
  • [2] Python-socketbibliotheek, https://docs.Python.org/3/bibliotheek/socket.html
  • [3] python-nmap, https://pypi.org/project/python3-nmap/
  • [4] dpkt, https://pypi.org/project/dpkt/
  • [5] PyShark, https://pypi.org/project/pyshark/
  • [6] scapy, https://pypi.org/project/scapy/
  • [7] Tcpdump en libpcap, http://www.tcpdump.org/
  • [8] PyShark, projectwebsite, http://kiminewt.github.io/pyshark/
  • [9] Libpcap-bestandsindeling, Wireshark Wiki, https://gitlab.com/wireshark/wireshark/-/wikis/Development/LibpcapFileFormat
  • [10] Tshark, https://www.draadhaai.org/docs/man-pages/tshark.html
  • [11] Apache Spark, https://spark.apache.org/
  • [12] BPF-filter, https://wiki.draadhaai.org/CaptureFilters
AppyMouse trackpad en muisaanwijzer op het scherm voor Windows-tablets
Tabletgebruikers missen vaak de muisaanwijzer, vooral wanneer ze gewend zijn om de laptop te gebruiken. Het touchscreen Smartphones en tablets hebben ...
Middelste muisknop werkt niet in Windows 10
De middelste muis knop helpt u door lange webpagina's en schermen met veel gegevens te bladeren. Als dat stopt, zul je uiteindelijk het toetsenbord ge...
Hoe de linker- en rechtermuisknop op Windows 10 pc te veranderen
Het is nogal een norm dat alle computermuisapparaten ergonomisch zijn ontworpen voor rechtshandige gebruikers. Maar er zijn muisapparaten beschikbaar ...