Krajta

Vytváření vlastního Network Monitoru s PyShark

Vytváření vlastního Network Monitoru s PyShark

Stávající nástroje

Mnoho nástrojů pro síťovou analýzu existuje již nějakou dobu. Pod Linuxem jsou to například Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack a také rychloměr a ettercap. Podrobný popis najdete v porovnání Silver Moon [1].

Proč tedy nepoužít existující nástroj a místo toho napsat vlastní? Důvody, které vidím, jsou lepší porozumění síťovým protokolům TCP / IP, naučení se správného kódování nebo implementace pouze konkrétní funkce, kterou potřebujete pro váš případ použití, protože stávající nástroje vám nedávají to, co skutečně potřebujete. Vylepšení rychlosti a zatížení vaší aplikace / systému mohou také hrát roli, která vás motivuje k tomu, abyste se více pohybovali tímto směrem.

Ve volné přírodě existuje poměrně mnoho knihoven Pythonu pro síťové zpracování a analýzu. Pro programování na nízké úrovni je klíčem knihovna soketů [2]. Knihovny na vysoké úrovni založené na protokolech jsou httplib, ftplib, imaplib a smtplib. Aby bylo možné sledovat síťové porty a konkurenční kandidáty na paketový proud, používají se python-nmap [3], dpkt [4] a PyShark [5]. Pro monitorování a změnu toku paketů se široce používá scapy knihovna [6].

V tomto článku se podíváme na knihovnu PyShark a budeme sledovat, které balíčky přicházejí na konkrétní síťové rozhraní. Jak uvidíte níže, práce s PySharkem je přímočará. Dokumentace na webových stránkách projektu vám pomůže v prvních krocích - s ní velmi rychle dosáhnete použitelného výsledku. Pokud však jde o hloupost, je zapotřebí více znalostí.

PyShark dokáže mnohem víc, než se na první pohled zdá, a bohužel v době psaní tohoto článku to stávající dokumentace v plném rozsahu nepokrývá. To zbytečně ztěžuje a poskytuje dobrý důvod podívat se hlouběji pod kapotu.

O společnosti PyShark

PyShark [8] je obálka Pythonu pro Tshark [10]. Jednoduše využívá svou schopnost exportovat data XML pomocí své analýzy. Samotný Tshark je verze Wireshark z příkazového řádku. Tshark i PyShark závisí na knihovně Pcap, která ve skutečnosti zachycuje síťové balíčky a je udržována pod kapotou Tcpdump [7]. PyShark vyvíjí a neustále udržuje Dan (na Twitteru používá název KimiNewt).

Aby se zabránilo možné záměně, existuje podobně znějící nástroj Apache Spark [11], který je jednotným analytickým nástrojem pro zpracování rozsáhlých dat. Název PySpark se používá pro rozhraní Pythonu k Apache Spark, o kterém zde nebudeme diskutovat.

Instalace PyShark

PyShark vyžaduje, aby byla nainstalována jak knihovna Pcap, tak Tshark. Odpovídající balíčky pro Debian GNU / Linux 10 a Ubuntu jsou pojmenovány libpcap0.8 a tshark a lze je nastavit pomocí apt-get takto:

Výpis 1: Instalace knihovny Pcap a Tshark

# pip3 nainstalujte python-pyshark

Pokud ještě nejsou nainstalovány, je nutné přidat také Python3 a Pip. Odpovídající balíčky pro Debian GNU / Linux 10 a Ubuntu jsou pojmenovány python3 a python3-pip a lze je nainstalovat následujícím způsobem pomocí apt-get:

Výpis 2: Nainstalujte Python 3 a PIP pro Python 3

# apt-get install python3 python3-pip

Nyní je čas přidat PyShark. Na základě našeho výzkumu není PyShark zatím zabalen pro žádnou významnou distribuci Linuxu. Instalace se provádí pomocí instalačního programu balíku Pythonu pip3 (pip pro Python 3) jako celosystémového balíčku, a to následovně:

Výpis 3: Nainstalujte PyShark pomocí PIP

# pip3 nainstalujte python-pyshark

Nyní je PyShark připraven k použití ve skriptech Pythonu ve vašem systému Linux. Nezapomeňte spustit níže uvedené skripty Pythonu jako administrativní uživatel, například pomocí sudo, protože knihovna Pcap vám neumožňuje hledat balíčky jako běžný uživatel.

Následující příkaz přidá obsah modulu PyShark do oboru názvů skriptu Python:

Výpis 4: Importujte modul PyShark

importovat pyshark

Způsoby získávání balíků

Okamžitě PyShark přichází se dvěma různými režimy, ve kterých nabízí shromažďování paketů ze sledovaného síťového rozhraní. Pro nepřetržitý sběr použijte metodu LiveCapture () a pro uložení do místního souboru použijte metodu FileCapture () z modulu PyShark. Výsledkem je seznam balíčků (objekt iterátoru Pythonu), který vám umožní procházet zachycená data po jednotlivých balíčcích. Výpisy níže ukazují, jak používat tyto dvě metody.

Výpis 5: Použijte PyShark k zachycení z prvního rozhraní WLAN wlan0

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

U předchozích příkazů jsou zachycené síťové balíčky uloženy v paměti. Dostupná paměť může být omezená, ale alternativou je ukládání zachycených balíčků do místního souboru. Používá se formát souboru Pcap [9]. To vám umožní zpracovat a interpretovat zachycená data pomocí dalších nástrojů, které jsou také propojeny s knihovnou Pcap.

Výpis 6: Použijte PyShark k uložení zachycených balíčků do místního souboru

importovat pyshark
capture = pyshark.FileCapture ('/ tmp / networkpackages.víčko')

Po spuštění výpisů 5 a 6 ještě nebudete mít žádný výstup. Dalším krokem je zúžení balíčků, které mají být shromažďovány přesněji na základě požadovaných kritérií.

Výběr paketů

Dříve zavedený objekt zachycení naváže připojení k požadovanému rozhraní. Dále dvě metody sniff () a sniff_continuously () objektu zachycení shromažďují síťové pakety. sniff () se vrátí volajícímu, jakmile budou shromážděny všechny požadované pakety. Naproti tomu sniff_continuously () doručí volajícímu jeden paket, jakmile je vyzvednut. To umožňuje přímý přenos síťového provozu.

Tyto dvě metody vám dále umožňují určit různá omezení a mechanismus filtrování balíčků, například počet balíčků pomocí parametru packet_count a období, během kterého mají být balíčky shromažďovány pomocí parametru timeout. Výpis 7 ukazuje, jak pomocí metody sniff_continuously () shromáždit 50 síťových balíčků pouze jako živý přenos,.

Výpis 7: Nasbírejte 50 síťových balíčků z wlan0

importovat pyshark
capture = pyshark.LiveCapture (interface = 'wlan0')
pro zachycení paketu.sniff_continuously (packet_count = 5):
tisk (balíček)

Různé podrobnosti paketu jsou viditelné pomocí příkazu print (packet) (viz obrázek 1).

Obrázek 1: obsah balíčku

V seznamu 7 jste shromáždili všechny druhy síťových paketů bez ohledu na to, jaký protokol nebo port služby. PyShark vám umožňuje provádět pokročilé filtrování pomocí takzvaného BPF filtru [12]. Výpis 8 ukazuje, jak shromáždit 5 balíčků TCP přicházejících přes port 80 a tisknout typ paketu. Informace jsou uloženy v atributu paketu nejvyšší_hráč.

Výpis 8: Pouze shromažďování balíčků TCP

importovat pyshark
capture = pyshark.LiveCapture (interface = 'wlan0', bpf_filter = 'TCP port 80')
zajmout.čichat (packet_count = 5)
tisknout (zachytit)
pro zachycení paketu:
tisk (paket.nejvyšší_hráč)

Uložit výpis 8 jako soubor tcp-sniff.py a spusťte skript Pythonu. Výstup je následující:

Výpis 9: Výstup výpisu 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Rozbalení zachycených paketů

Zachycený objekt funguje jako ruská panenka Matroska - vrstvu po vrstvě, obsahuje obsah odpovídajícího síťového paketu. Unboxing vypadá trochu jako Vánoce - nikdy nevíte, jaké informace najdete uvnitř, dokud je neotevřete. Výpis 10 ukazuje zachycení 10 síťových paketů a odhalení jeho typu protokolu, zdrojového i cílového portu a adresy.

Výpis 10: Zobrazení zdroje a cíle zachyceného paketu

importovat pyshark
čas importu
# definovat rozhraní
networkInterface = "enp0s3"
# definovat zachycený objekt
capture = pyshark.LiveCapture (rozhraní = networkInterface)
tisk ("poslech na% s"% networkInterface)
pro zachycení paketu.sniff_continuously (packet_count = 10):
# upravený výstup
Snaž se:
# získejte časové razítko
localtime = čas.čas (čas.místní čas (čas.čas()))
# získejte obsah paketu
protokol = paket.transport_layer # typ protokolu
src_addr = paket.ip.src # zdrojová adresa
src_port = paket [protokol].srcport # zdrojový port
dst_addr = paket.ip.dst # cílová adresa
dst_port = paket [protokol].dstport # cílový port
# informace o výstupním paketu
print ("% s IP% s:% s <-> % s:% s (% s) "% (místní čas, src_addr, src_port, dst_addr, dst_port, protokol))
kromě AttributeError jako e:
# ignorovat jiné pakety než TCP, UDP a IPv4
složit
tisk (" ")

Skript generuje výstup, jak je znázorněno na obrázku 2, jeden řádek na přijatý paket. Každý řádek začíná časovým razítkem, následovaným zdrojovou IP adresou a portem, poté cílovou IP adresou a portem a nakonec typem síťového protokolu.


Obrázek 2: Zdroj a cíl pro zachycené balíčky

Závěr

Vytvoření vlastního síťového skeneru nebylo nikdy jednodušší. Na základě základů Wireshark vám PyShark nabízí komplexní a stabilní rámec pro monitorování síťových rozhraní vašeho systému způsobem, který požadujete.

Odkazy a reference

  • [1] Silver Moon: 18 příkazů ke sledování šířky pásma sítě na serveru Linux, https: // www.binární přílivy.com / linux-commands-monitor-network /
  • [2] Python socket library, https: // docs.krajta.org / 3 / knihovna / zásuvka.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 a libpcap, http: // www.tcpdump.org /
  • [8] PyShark, web projektu, http: // kiminewt.github.io / pyshark /
  • [9] Formát souboru Libpcap, Wireshark Wiki, https: // gitlab.com / Wireshark / Wireshark / - / wiki / Development / LibpcapFileFormat
  • [10] Tshark, https: // www.Wireshark.org / docs / man-pages / tshark.html
  • [11] Apache Spark, https: // spark.apache.org /
  • [12] Filtr BPF, https: // wiki.Wireshark.org / CaptureFilters
JAK INSTALOVAT MONO NA UBUNTU 20.04
Mono patří mezi open-source software, který pomáhá při vytváření více platforem pro výpočetní techniku. Lze jej považovat za software s otevřeným zdro...
Instalace a nastavení UFW v Ubuntu 20.04 LTS
UFW, neboli nekomplikovaný firewall, je uživatelsky přívětivý frontend pro linuxové iptables. UFW je napsán v Pythonu (podporuje Python 3.5 a výše) a ...
Získejte veřejnou IP z terminálu na Ubuntu 20.04
Pokud používáte internet, slyšeli jste o IP adrese, správně? V počítačových sítích je adresa IP (internetový protokol) číselný identifikátor k identif...