Python

Bygg din egen nettverksmonitor med PyShark

Bygg din egen nettverksmonitor med PyShark

Eksisterende verktøy

Mange verktøy for nettverksanalyse har eksistert i ganske lang tid. Under Linux, for eksempel, er dette Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack samt speedometer og ettercap. For en detaljert beskrivelse av dem kan du ta en titt på Silver Moon's sammenligning [1].

Så hvorfor ikke bruke et eksisterende verktøy, og skriv ditt eget, i stedet? Årsaker jeg ser er bedre forståelse av TCP / IP-nettverksprotokoller, lære å kode riktig, eller implementere akkurat den spesifikke funksjonen du trenger for din brukstilfelle fordi de eksisterende verktøyene ikke gir deg det du faktisk trenger. Videre kan forbedringer av hastighet og belastning av applikasjonen / systemet også spille en rolle som motiverer deg til å bevege deg mer i denne retningen.

I naturen finnes det ganske mange Python-biblioteker for prosessering og analyse av nettverk. For programmering på lavt nivå er stikkontaktbiblioteket [2] nøkkelen. Protokollbaserte biblioteker på høyt nivå er httplib, ftplib, imaplib og smtplib. For å overvåke nettverksporter og konkurransekandidater for pakkestrømmen, brukes python-nmap [3], dpkt [4] og PyShark [5]. For både overvåking og endring av pakkestrømmen er scapy-biblioteket [6] mye brukt.

I denne artikkelen vil vi se på PyShark-biblioteket og overvåke hvilke pakker som kommer til et bestemt nettverksgrensesnitt. Som du vil se nedenfor, er det enkelt å jobbe med PyShark. Dokumentasjonen på prosjektnettstedet vil hjelpe deg med de første trinnene - med det vil du oppnå et brukbart resultat veldig raskt. Imidlertid, når det gjelder nitty-gritty, er mer kunnskap nødvendig.

PyShark kan gjøre mye mer enn det ser ut ved første øyekast, og dessverre, når dette skrives, dekker den eksisterende dokumentasjonen ikke det i sin helhet. Dette gjør det unødvendig vanskelig og gir en god grunn til å se dypere under panseret.

Om PyShark

PyShark [8] er en Python-innpakning for Tshark [10]. Den bruker ganske enkelt sin evne til å eksportere XML-data ved hjelp av parsing. Tshark selv er kommandolinjeversjonen av Wireshark. Både Tshark og PyShark er avhengig av Pcap-biblioteket som faktisk fanger opp nettverkspakker og vedlikeholdes under panseret på Tcpdump [7]. PyShark er utviklet og vedlikeholdes kontinuerlig av Dan (han bruker navnet KimiNewt på Twitter).

For å forhindre mulig forvirring finnes det et lignende lydverktøy, Apache Spark [11], som er en enhetlig analysemotor for databehandling i stor skala. Navnet PySpark brukes til Python-grensesnittet til Apache Spark, som vi ikke diskuterer her.

Installere PyShark

PyShark krever at både Pcap-biblioteket og Tshark er installert. De tilsvarende pakkene for Debian GNU / Linux 10 og Ubuntu heter libpcap0.8 og tshark og kan settes opp som følger ved hjelp av apt-get:

Oppføring 1: Installere Pcap-biblioteket og Tshark

# pip3 installer python-pyshark

Hvis den ikke er installert ennå, må Python3 og Pip også legges til. De tilsvarende pakkene for Debian GNU / Linux 10 og Ubuntu heter python3 og python3-pip og kan installeres som følger ved hjelp av apt-get:

Oppføring 2: Installer Python 3 og PIP for Python 3

# apt-get install python3 python3-pip

Nå er det på tide å legge til PyShark. Basert på vår forskning er PyShark ikke pakket for noen større Linux-distribusjon ennå. Installasjonen av den gjøres ved å bruke Python-pakkeinstallasjonsprogrammet pip3 (pip for Python 3) som en systemomfattende pakke som følger:

Listing 3: Installer PyShark ved hjelp av PIP

# pip3 installer python-pyshark

Nå er PyShark klar til å brukes i Python-skript på Linux-systemet ditt. Vær oppmerksom på å utføre Python-skriptene nedenfor som en administrativ bruker, for eksempel ved å bruke sudo fordi Pcap-biblioteket ikke tillater deg å se etter pakker som en vanlig bruker.

Følgende uttalelse legger til innholdet i PyShark-modulen i navneområdet til Python-skriptet:

Oppføring 4: Importer PyShark-modulen

importer pyshark

Metoder for å fange pakker

Ut av esken kommer PyShark med to forskjellige moduser som den tilbyr å samle pakker fra det observerte nettverksgrensesnittet. For kontinuerlig samling, bruk LiveCapture () -metoden, og for å lagre til en lokal fil, bruk FileCapture () -metoden fra PyShark-modulen. Resultatet er en pakkeliste (Python iterator-objekt) som lar deg gå gjennom den fangede datapakken etter pakke. Listingene nedenfor viser hvordan du bruker de to metodene.

Oppføring 5: Bruk PyShark til å fange fra det første Wifi-grensesnittet wlan0

importer pyshark
fange = pyshark.LiveCapture (grensesnitt = 'wlan0')

Med de foregående uttalelsene blir de fangede nettverkspakker lagret i minnet. Det tilgjengelige minnet kan være begrenset, men det er et alternativ å lagre de fangede pakkene i en lokal fil. Pcap-filformatet er i bruk [9]. Dette lar deg behandle og tolke innsamlede data med andre verktøy som også er koblet til Pcap-biblioteket.

Liste 6: Bruk PyShark til å lagre de fangede pakkene i en lokal fil

importere pyshark
fange = pyshark.FileCapture ('/ tmp / nettverkspakker.lokk')

Kjører oppføringer 5 og 6, vil du ikke ha noen utdata ennå. Det neste trinnet er å begrense pakkene som skal samles mer presist ut fra dine ønskede kriterier.

Velge pakker

Det tidligere introduserte fangeobjektet oppretter en forbindelse til ønsket grensesnitt. Deretter samler de to metodene sniff () og sniff_continuously () av ​​fangeobjektet nettverkspakker. sniff () returnerer til den som ringer så snart alle de forespurte pakkene er samlet inn. Derimot leverer sniff_continuously () en enkelt pakke til den som ringer så snart den ble samlet inn. Dette tillater en direkte strøm av nettverkstrafikken.

Videre lar de to metodene deg spesifisere forskjellige begrensninger og filtreringsmekanismer for pakker, for eksempel antall pakker som bruker parameteren packet_count, og perioden pakkene skal samles inn ved hjelp av parameter timeout. Oppføring 7 viser hvordan du kan samle 50 nettverkspakker, bare som en live stream, ved hjelp av metoden sniff_continuously ().

Oppføring 7: Samle 50 nettverkspakker fra wlan0

importer pyshark
fange = pyshark.LiveCapture (grensesnitt = 'wlan0')
for pakke i fangst.sniff_continuously (packet_count = 5):
skrive ut (pakke)

Ulike pakkeopplysninger er synlige ved bruk av utsagnstrykk (pakke) (se figur 1).

Figur 1: innhold i pakken

I liste 7 samlet du alle slags nettverkspakker uansett hvilken protokoll eller tjenesteport. PyShark lar deg gjøre avansert filtrering ved å bruke det såkalte BPF-filteret [12]. Oppføring 8 viser hvordan du samler inn 5 TCP-pakker som kommer inn via port 80 og skriver ut pakketypen. Informasjonen lagres i pakkeattributtet høyeste lag.

Oppføring 8: Bare å samle inn TCP-pakker

importer pyshark
fange = pyshark.LiveCapture (grensesnitt = 'wlan0', bpf_filter = 'TCP-port 80')
fange.snuse (packet_count = 5)
skrive ut (fange)
for pakke i fangst:
utskrift (pakke.høyeste lag)

Lagre oppføring 8, som filen tcp-sniff.py, og kjør Python-skriptet. Resultatet er som følger:

Listing 9: Output of Listing 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Unboxing de fangede pakkene

Det fangede objektet fungerer som en russisk Matroska dukke - lag for lag, den inneholder innholdet i den tilsvarende nettverkspakken. Unboxing føles litt som jul - du vet aldri hvilken informasjon du finner inni før du åpnet den. Oppføring 10 viser å fange 10 nettverkspakker og avsløre protokolltypen, både kilde og destinasjonsport og adresse.

Liste 10: Viser kilde og destinasjon for den fangede pakken

importer pyshark
importtid
# definere grensesnitt
networkInterface = "enp0s3"
# definere fangeobjekt
fange = pyshark.LiveCapture (grensesnitt = nettverksgrensesnitt)
skriv ut ("lytter på% s"% networkInterface)
for pakke i fangst.sniff_continuously (packet_count = 10):
# justert utgang
prøve:
# få tidsstempel
lokaltid = tid.asctime (tid.lokaltid (tid.tid()))
# få pakkeinnhold
protokoll = pakke.transport_layer # protokolltype
src_addr = pakke.ip.src # kildeadresse
src_port = pakke [protokoll].srcport # kildeport
dst_addr = pakke.ip.dst # destinasjonsadresse
dst_port = pakke [protokoll].dstport # destinasjonsport
# utgangspakkeinfo
skriv ut ("% s IP% s:% s <-> % s:% s (% s) "% (localtime, src_addr, src_port, dst_addr, dst_port, protocol))
unntatt AttributeError som e:
# ignorere andre pakker enn TCP, UDP og IPv4
sende
skrive ut (" ")

Skriptet genererer en utgang, som vist i figur 2, en enkelt linje per mottatt pakke. Hver linje starter med en tidsstempel, etterfulgt av kildens IP-adresse og port, deretter destinasjonens IP-adresse og port, og til slutt typen nettverksprotokoll.


Figur 2: Kilde og destinasjon for fangede pakker

Konklusjon

Å bygge din egen nettverksskanner har aldri vært enklere enn det. Basert på grunnlaget for Wireshark, tilbyr PyShark deg et omfattende og stabilt rammeverk for å overvåke nettverksgrensesnittene til systemet ditt slik du trenger det.

Lenker og referanser

  • [1] Silver Moon: 18 kommandoer for å overvåke nettverksbåndbredde på Linux-server, https: // www.binær tidevann.no / linux-kommandoer-skjerm-nettverk /
  • [2] Python-stikkontaktbibliotek, https: // docs.python.org / 3 / bibliotek / stikkontakt.html
  • [3] python-nmap, https: // pypi.org / prosjekt / python3-nmap /
  • [4] dpkt, https: // pypi.org / prosjekt / dpkt /
  • [5] PyShark, https: // pypi.org / prosjekt / pyshark /
  • [6] scapy, https: // pypi.org / prosjekt / scapy /
  • [7] Tcpdump og libpcap, http: // www.tcpdump.org /
  • [8] PyShark, prosjektnettsted, http: // kiminewt.github.io / pyshark /
  • [9] Libpcap-filformat, Wireshark Wiki, https: // gitlab.no / wireshark / wireshark / - / wikis / Utvikling / LibpcapFileFormat
  • [10] Tshark, https: // www.wireshark.org / docs / man-pages / tshark.html
  • [11] Apache Spark, https: // gnist.apache.org /
  • [12] BPF-filter, https: // wiki.wireshark.org / CaptureFilters
Kamp for Wesnoth 1.1. 3.6 Utvikling utgitt
Kamp for Wesnoth 1.1. 3.6 utgitt i forrige måned, er den sjette utgivelsen i 1.1. 3.x-serien, og den leverer en rekke forbedringer, spesielt til bruke...
Slik installerer du League Of Legends på Ubuntu 14.04
Hvis du er fan av League of Legends, er dette en mulighet for deg å prøvekjør League of Legends. Merk at LOL støttes på PlayOnLinux hvis du er en linu...
Installer det siste OpenRA-strategispillet på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spillmotor som gjenskaper de tidlige Westwood-spillene som den klassiske Command & Conquer: Red Alert. Di...