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-pysharkOm 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-pipNu ä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-pysharkNu ä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 pysharkMetoder 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 pysharkfå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 pysharkfå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 pysharkfå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 pysharkfå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.pyTCP
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 pysharkimporttid
# 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