Pytonorm

Bygg din egen nätverksmonitor med PyShark

Bygg din egen nätverksmonitor med PyShark

Befintliga verktyg

Många verktyg för nätverksanalys har funnits under ganska lång tid. Under Linux är dessa till exempel Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack samt hastighetsmätare och ettercap. För en detaljerad beskrivning av dem kan du ta en titt på Silver Moon's jämförelse [1].

Så varför inte använda ett befintligt verktyg och skriva ditt eget istället? Anledningar som jag ser är en bättre förståelse för TCP / IP-nätverksprotokoll, att lära sig att koda ordentligt eller implementera bara den specifika funktionen du behöver för ditt användningsfall eftersom de befintliga verktygen inte ger dig vad du faktiskt behöver. Dessutom kan hastighets- och belastningsförbättringar i din applikation / system också spela en roll som motiverar dig att gå mer i den här riktningen.

I naturen finns det många Python-bibliotek för nätverksbehandling och analys. För lågnivåprogrammering är uttagsbiblioteket [2] nyckeln. Protokollbaserade bibliotek på hög nivå är httplib, ftplib, imaplib och smtplib. För att övervaka nätverksportar och konkurrenskandidater för paketströmmen används python-nmap [3], dpkt [4] och PyShark [5]. För både övervakning och ändring av paketströmmen används scapy-biblioteket [6] i stor utsträckning.

I den här artikeln kommer vi att titta på PyShark-biblioteket och övervaka vilka paket som kommer till ett specifikt nätverksgränssnitt. Som du kommer att se nedan är det enkelt att arbeta med PyShark. Dokumentationen på projektwebbplatsen hjälper dig för de första stegen - med det kommer du att uppnå ett användbart resultat mycket snabbt. Men när det gäller nitty-gritty är mer kunskap nödvändig.

PyShark kan göra mycket mer än det verkar vid första anblicken, och tyvärr, när detta skrivs, täcker den befintliga dokumentationen inte det i sin helhet. Detta gör det onödigt svårt och ger en god anledning att titta djupare under motorhuven.

Om PyShark

PyShark [8] är ett Python-omslag för Tshark [10]. Den använder helt enkelt sin förmåga att exportera XML-data genom att analysera den. Tshark själv är kommandoradsversionen av Wireshark. Både Tshark och PyShark är beroende av Pcap-biblioteket som faktiskt fångar nätverkspaket och underhålls under huven på Tcpdump [7]. PyShark utvecklas och underhålls kontinuerligt av Dan (han använder namnet KimiNewt på Twitter).

För att förhindra förvirring finns ett liknande ljudverktyg, Apache Spark [11], som är en enhetlig analysmotor för storskalig databehandling. Namnet PySpark används för Python-gränssnittet till Apache Spark, vilket vi inte diskuterar här.

Installerar PyShark

PyShark kräver att både Pcap-biblioteket och Tshark är installerade. Motsvarande paket för Debian GNU / Linux 10 och Ubuntu heter libpcap0.8 och tshark och kan ställas in enligt följande med apt-get:

Listning 1: Installera Pcap-biblioteket och Tshark

# pip3 installera python-pyshark

Om den inte är installerad ännu måste Python3 och Pip läggas till. Motsvarande paket för Debian GNU / Linux 10 och Ubuntu heter python3 och python3-pip och kan installeras enligt följande med apt-get:

Listing 2: Installera Python 3 och PIP för Python 3

# apt-get install python3 python3-pip

Nu är det dags att lägga till PyShark. Baserat på vår forskning är PyShark inte förpackad för någon större Linux-distribution än. Installationen av den görs med Python-paketinstallatören pip3 (pip för Python 3) som ett systemomfattande paket enligt följande:

Listing 3: Installera PyShark med PIP

# pip3 installera python-pyshark

Nu är PyShark redo att användas i Python-skript på ditt Linux-system. Observera att du kör Python-skript nedan som administrativ användare, till exempel med sudo eftersom Pcap-biblioteket inte tillåter dig att leta efter paket som en vanlig användare.

Följande uttalande lägger till innehållet i PyShark-modulen i namnområdet för ditt Python-skript:

Lista 4: Importera PyShark-modulen

importera pyshark

Metoder för att fånga paket

Utanför lådan kommer PyShark med två olika lägen som den erbjuder att samla paket från det observerade nätverksgränssnittet. För kontinuerlig insamling, använd LiveCapture () -metoden, och för att spara till en lokal fil, använd FileCapture () -metoden från PyShark-modulen. Resultatet är en paketlista (Python iterator-objekt) som låter dig gå igenom det fångade datapaketet per paket. Listorna nedan visar hur man använder de två metoderna.

Listning 5: Använd PyShark för att fånga från det första Wifi-gränssnittet wlan0

importera pyshark
fånga = pyshark.LiveCapture (gränssnitt = 'wlan0')

Med de tidigare uttalandena sparas de fångade nätverkspaketen i minnet. Det tillgängliga minnet kan vara begränsat, men det är ett alternativ att lagra de fångade paketen i en lokal fil. Pcap-filformatet används [9]. Detta gör att du kan bearbeta och tolka den fångade informationen med andra verktyg som är länkade till Pcap-biblioteket.

Listning 6: Använd PyShark för att lagra de fångade paketen i en lokal fil

importera pyshark
fånga = pyshark.FileCapture ('/ tmp / nätverkspaket.keps')

Om du kör listorna 5 och 6 kommer du inte att ha någon utdata än. Nästa steg är att begränsa paketen som ska samlas in mer exakt baserat på önskade kriterier.

Välja paket

Det tidigare introducerade fångningsobjektet skapar en anslutning till önskat gränssnitt. Därefter samlar de två metoderna sniff () och sniff_continuously () för fångningsobjektet nätverkspaketen. sniff () återvänder till den som ringer så snart alla begärda paket har samlats in. Däremot levererar sniff_continuously () ett enda paket till den som ringer så snart det samlats in. Detta möjliggör en livestream av nätverkstrafiken.

Dessutom låter de två metoderna dig specificera olika begränsningar och filtreringsmekanismer för paket, till exempel antalet paket som använder parametern packet_count och den period under vilken paketen ska samlas in med hjälp av parametern timeout. Listning 7 visar hur man samlar in 50 nätverkspaket endast som en livestream med metoden sniff_continuously ().

Lista 7: Samla 50 nätverkspaket från wlan0

importera pyshark
fånga = pyshark.LiveCapture (gränssnitt = 'wlan0')
för paket i fångst.sniff_continuously (packet_count = 5):
tryck (paket)

Olika paketdetaljer är synliga med uttalandeutskrift (paket) (se figur 1).

Figur 1: paketinnehåll

I listan 7 samlade du alla typer av nätverkspaket oavsett vilket protokoll eller tjänstport. PyShark låter dig göra avancerad filtrering med det så kallade BPF-filtret [12]. Listning 8 visar hur man samlar in 5 TCP-paket som kommer in via port 80 och skriver ut pakettypen. Informationen lagras i paketattributet högsta_lager.

Lista 8: Samlar endast TCP-paket

importera pyshark
fånga = pyshark.LiveCapture (gränssnitt = 'wlan0', bpf_filter = 'TCP-port 80')
fånga.sniffa (packet_count = 5)
skriva ut (fånga)
för paket i fångst:
tryck (paket.högsta lagret)

Spara lista 8, som filen tcp-sniff.py och kör Python-skriptet. Utgången är som följer:

Listing 9: Output från Listing 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Unboxing de fångade paketen

Det fångade objektet fungerar som en rysk Matroska docka - lager för lager, det innehåller innehållet i motsvarande nätverkspaket. Unboxing känns lite som jul - du vet aldrig vilken information du hittar innan du öppnade den. Listning 10 visar fånga 10 nätverkspaket och avslöja dess protokolltyp, både käll- och destinationsport och adress.

Listning 10: Visar källa och destination för det fångade paketet

importera pyshark
importtid
# definiera gränssnitt
networkInterface = "enp0s3"
# definiera fångstobjekt
fånga = pyshark.LiveCapture (gränssnitt = nätverksgränssnitt)
skriv ut ("lyssnar på% s"% networkInterface)
för paket i fångst.sniff_ kontinuerligt (packet_count = 10):
# justerad effekt
Prova:
# få tidsstämpel
localtime = tid.asctime (tid.lokal tid (tid.tid()))
# få paketinnehåll
protokoll = paket.transport_layer # protokoll typ
src_addr = paket.ip.src # källadress
src_port = paket [protokoll].srcport # källport
dst_addr = paket.ip.dst # destinationsadress
dst_port = paket [protokoll].dstport # destinationsport
# utdata paketinformation
skriv ut ("% s IP% s:% s <-> % s:% s (% s) "% (localtime, src_addr, src_port, dst_addr, dst_port, protocol))
utom AttributeError som e:
# ignorera andra paket än TCP, UDP och IPv4
passera
skriva ut ("")

Skriptet genererar en utgång, som visas i figur 2, en enda rad per mottaget paket. Varje rad börjar med en tidsstämpel, följt av källans IP-adress och port, sedan destinations-IP-adressen och porten och slutligen typen av nätverksprotokoll.


Figur 2: Källa och destination för fångade paket

Slutsats

Att bygga din egen nätverksskanner har aldrig varit enklare än så. Baserat på grunden för Wireshark erbjuder PyShark dig ett omfattande och stabilt ramverk för att övervaka nätverksgränssnitten för ditt system på det sätt du behöver det.

Länkar och referenser

  • [1] Silver Moon: 18 kommandon för att övervaka nätverksbandbredd på Linux-server, https: // www.binära tidvatten.com / linux-kommandon-monitor-nätverk /
  • [2] Python-uttagsbibliotek, https: // docs.pytonorm.org / 3 / bibliotek / uttag.html
  • [3] python-nmap, https: // pypi.org / projekt / python3-nmap /
  • [4] dpkt, https: // pypi.org / projekt / dpkt /
  • [5] PyShark, https: // pypi.org / projekt / pyshark /
  • [6] scapy, https: // pypi.org / projekt / scapy /
  • [7] Tcpdump och libpcap, http: // www.tcpdump.org /
  • [8] PyShark, projektwebbplats, http: // kiminewt.github.io / pyshark /
  • [9] Libpcap-filformat, Wireshark Wiki, https: // gitlab.com / wireshark / wireshark / - / wikis / Development / LibpcapFileFormat
  • [10] Tshark, https: // www.wireshark.org / docs / man-pages / tshark.html
  • [11] Apache Spark, https: // gnista.apache.org /
  • [12] BPF-filter, https: // wiki.wireshark.org / CaptureFilters
Hur man installerar och spelar Doom på Linux
Introduktion till Doom Doom-serien har sitt ursprung på 90-talet efter att den ursprungliga Doom släpptes. Det blev en omedelbar hit och från den tide...
Vulkan för Linux-användare
Med varje ny generation grafikkort ser vi spelutvecklare driva gränserna för grafisk trohet och komma ett steg närmare fotorealism. Men trots all kred...
OpenTTD vs Simutrans
Att skapa din egen transportsimulering kan vara rolig, avkopplande och extremt lockande. Det är därför du måste se till att du testar så många spel so...