Python

Изграждане на собствен мрежов монитор с PyShark

Изграждане на собствен мрежов монитор с PyShark

Съществуващи инструменти

Много инструменти за мрежов анализ съществуват от доста време. Например под Linux това са Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack, както и скоростомер и ettercap. За подробно описание на тях можете да разгледате сравнението на Silver Moon [1].

Така че, защо да не използвате съществуващ инструмент и вместо това да напишете свой собствен? Причините, които виждам, са по-добро разбиране на TCP / IP мрежовите протоколи, научаване как правилно да се кодира или прилагане само на специфичната функция, от която се нуждаете за вашия случай на употреба, тъй като съществуващите инструменти не ви дават това, което всъщност имате. Освен това подобренията на скоростта и натоварването на вашето приложение / система също могат да играят роля, която ви мотивира да се движите повече в тази посока.

В дивата природа съществуват доста няколко библиотеки на Python за мрежова обработка и анализ. За програмиране на ниско ниво ключовата функция е библиотеката на сокети [2]. Библиотеките, базирани на протокол на високо ниво, са httplib, ftplib, imaplib и smtplib. За да се наблюдават мрежовите портове и конкурентните кандидати за пакетния поток, се използват python-nmap [3], dpkt [4] и PyShark [5]. Както за наблюдение, така и за промяна на пакетния поток, scapy библиотеката [6] е широко използвана.

В тази статия ще разгледаме библиотеката на PyShark и ще наблюдаваме кои пакети пристигат в определен мрежов интерфейс. Както ще видите по-долу, работата с PyShark е лесна. Документацията на уебсайта на проекта ще ви помогне за първите стъпки - с нея много бързо ще постигнете използваем резултат. Въпреки това, когато става въпрос за глупаво, са необходими повече знания.

PyShark може да направи много повече, отколкото изглежда на пръв поглед, и за съжаление, по време на това писане, съществуващата документация не покрива това изцяло. Това затруднява ненужно и дава основателна причина да погледнете по-дълбоко под капака.

За PyShark

PyShark [8] е обвивка на Python за Tshark [10]. Той просто използва способността си да експортира XML данни, използвайки синтактичния анализ. Самият Tshark е версията на Wireshark от командния ред. Както Tshark, така и PyShark зависят от библиотеката Pcap, която всъщност улавя мрежови пакети и се поддържа под капака на Tcpdump [7]. PyShark се разработва и поддържа непрекъснато от Дан (той използва името KimiNewt в Twitter).

За да се предотврати евентуално объркване, съществува подобен звучащ инструмент, Apache Spark [11], който е унифициран механизъм за анализ за мащабна обработка на данни. Името PySpark се използва за интерфейса на Python към Apache Spark, което не обсъждаме тук.

Инсталиране на PyShark

PyShark изисква както Pcap библиотеката, така и Tshark да бъдат инсталирани. Съответните пакети за Debian GNU / Linux 10 и Ubuntu се наричат ​​libpcap0.8 и tshark и може да се настрои по следния начин с помощта на apt-get:

Листинг 1: Инсталиране на библиотеката Pcap и Tshark

# pip3 инсталирайте python-pyshark

Ако все още не са инсталирани, трябва да се добавят и Python3 и Pip. Съответните пакети за Debian GNU / Linux 10 и Ubuntu се наричат ​​python3 и python3-pip и могат да бъдат инсталирани по следния начин с помощта на apt-get:

Листинг 2: Инсталирайте Python 3 и PIP за Python 3

# apt-get инсталиране на python3 python3-pip

Сега е време да добавите PyShark. Въз основа на нашето проучване PyShark все още не е пакетиран за голяма дистрибуция на Linux. Инсталирането му се извършва с помощта на инсталатора на пакети Python pip3 (pip за Python 3) като общосистемен пакет, както следва:

Листинг 3: Инсталирайте PyShark с помощта на PIP

# pip3 инсталирайте python-pyshark

Сега PyShark е готов да се използва в Python скриптове на вашата Linux система. Моля, обърнете внимание, за да изпълнявате скриптовете на Python по-долу като административен потребител, например, като използвате sudo, защото библиотеката Pcap не ви позволява да търсите пакети като обикновен потребител.

Следното изявление добавя съдържанието на модула PyShark към пространството от имена на вашия Python скрипт:

Листинг 4: Импортирайте модула PyShark

внос pyshark

Методи за улавяне на пакети

Извън кутията PyShark се предлага с два различни режима, с които предлага да събира пакети от наблюдавания мрежов интерфейс. За непрекъснато събиране използвайте метода LiveCapture (), а за запазване в локален файл използвайте метода FileCapture () от модула PyShark. Резултатът е списък с пакети (обект на итератор на Python), който ви позволява да преминете през заловения пакет данни по пакет. Списъкът по-долу показва как да използвате двата метода.

Листинг 5: Използвайте PyShark за заснемане от първия Wifi интерфейс wlan0

внос pyshark
улавяне = pyshark.LiveCapture (интерфейс = 'wlan0')

С предишните изявления заловените мрежови пакети се запазват в паметта. Наличната памет може да е ограничена, но съхраняването на уловените пакети в локален файл е алтернатива. Използва се файловият формат Pcap [9]. Това ви позволява да обработвате и интерпретирате уловените данни от други инструменти, които също са свързани с библиотеката Pcap.

Листинг 6: Използвайте PyShark, за да съхранявате уловените пакети в локален файл

внос pyshark
улавяне = pyshark.FileCapture ('/ tmp / networkpackages.шапка с козирка')

Изпълнявайки списъци 5 и 6, все още няма да имате изход. Следващата стъпка е да стесните пакетите, за да бъдат събрани по-точно въз основа на желаните критерии.

Избор на пакети

Въведеният по-рано обект за улавяне установява връзка с желания интерфейс. След това двата метода sniff () и sniff_continuously () на обекта за улавяне събират мрежовите пакети. sniff () се връща към повикващия веднага щом бъдат събрани всички поискани пакети. За разлика от това, sniff_continuously () доставя един пакет на повикващия веднага след като е бил събран. Това позволява поток на живо от мрежовия трафик.

Освен това двата метода ви позволяват да зададете различни ограничения и механизъм за филтриране на пакети, например броя на пакетите, използващи параметъра packet_count, и периода, през който пакетите трябва да бъдат събрани, използвайки времето за изчакване на параметъра. Листинг 7 демонстрира как да се съберат 50 мрежови пакета само като поток на живо, използвайки метода sniff_continuously ().

Листинг 7: Съберете 50 мрежови пакета от wlan0

внос pyshark
улавяне = pyshark.LiveCapture (интерфейс = 'wlan0')
за пакет в улавяне.sniff_continuously (packet_count = 5):
печат (пакет)

Различни подробности за пакета се виждат с помощта на отпечатване на извлечение (пакет) (вижте фигура 1).

Фигура 1: съдържание на пакета

В списък 7 сте събрали всички видове мрежови пакети, без значение какъв протокол или порт за услуга. PyShark ви позволява да направите разширено филтриране, като използвате така наречения BPF филтър [12]. Листинг 8 показва как да се съберат 5 TCP пакета, които влизат през порт 80 и се отпечатва типът на пакета. Информацията се съхранява в атрибута на пакета най-висок_слой.

Листинг 8: Събиране само на TCP пакети

внос pyshark
улавяне = pyshark.LiveCapture (интерфейс = 'wlan0', bpf_filter = 'tcp порт 80')
улавяне.подуши (брой_пакети = 5)
печат (улавяне)
за пакет в улавяне:
печат (пакет.най-висок_слой)

Запазете списък 8 като файл tcp-sniff.py и стартирайте скрипта на Python. Резултатът е както следва:

Листинг 9: Резултатът от Листинг 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Разархивиране на заловените пакети

Уловеният обект работи като руска кукла Matroska - слой по слой, съдържа съдържанието на съответния мрежов пакет. Разопаковането е малко като Коледа - никога не знаеш каква информация намираш вътре, докато не я отвориш. Листинг 10 демонстрира улавяне на 10 мрежови пакета и разкриване на неговия тип протокол, както източника, така и адреса на местоназначение и адреса.

Листинг 10: Показване на източника и местоназначението на заловения пакет

внос pyshark
време за импортиране
# дефиниране на интерфейс
networkInterface = "enp0s3"
# дефиниране на обект за улавяне
улавяне = pyshark.LiveCapture (интерфейс = networkInterface)
print ("слушане на% s"% networkInterface)
за пакет в улавяне.sniff_continuously (packet_count = 10):
# коригиран изход
опитвам:
# вземете клеймо за време
localtime = време.asctime (време.местно време (време.време ()))
# получи пакетно съдържание
протокол = пакет.transport_layer # тип протокол
src_addr = пакет.ip.src # адрес на източника
src_port = пакет [протокол].srcport # порт за източник
dst_addr = пакет.ip.dst # адрес на местоназначение
dst_port = пакет [протокол].dstport # дестинация порт
# информация за изходния пакет
print ("% s IP% s:% s <-> % s:% s (% s) "% (localtime, src_addr, src_port, dst_addr, dst_port, протокол))
с изключение на AttributeError като e:
# игнорира пакети, различни от TCP, UDP и IPv4
мине
печат ("")

Скриптът генерира изход, както е показано на Фигура 2, по един ред на получен пакет. Всеки ред започва с клеймо за време, последвано от IP адреса и порта на източника, след това IP адреса и порта на местоназначение и, накрая, типа на мрежовия протокол.


Фигура 2: Източник и местоназначение за заловени пакети

Заключение

Изграждането на собствен мрежов скенер никога не е било по-лесно от това. Въз основа на основите на Wireshark, PyShark ви предлага изчерпателна и стабилна рамка за наблюдение на мрежовите интерфейси на вашата система по начина, по който ви е необходим.

Връзки и справки

  • [1] Silver Moon: 18 команди за наблюдение на мрежовата честотна лента на Linux сървър, https: // www.бинартиди.com / linux-command-monitor-network /
  • [2] Библиотека на сокети на Python, https: // docs.питон.org / 3 / библиотека / сокет.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 и libpcap, http: // www.tcpdump.организация /
  • [8] PyShark, уебсайт на проекта, http: // kiminewt.github.io / pyshark /
  • [9] Формат на файла Libpcap, Wireshark Wiki, https: // gitlab.com / wireshark / wireshark / - / wikis / Development / LibpcapFileFormat
  • [10] Tshark, https: // www.жична акула.org / docs / man-pages / tshark.html
  • [11] Apache Spark, https: // искра.апаш.организация /
  • [12] BPF филтър, https: // wiki.жична акула.org / CaptureFilters
Как да промените курсора на мишката и размера на курсора, цвета и схемата в Windows 10
Показалецът на мишката и курсорът в Windows 10 са много важни аспекти на операционната система. Това може да се каже и за други операционни системи, т...
Безплатни и игри с отворен код за разработване на Linux игри
Тази статия ще обхване списък с безплатни двигатели за игри с отворен код, които могат да се използват за разработване на 2D и 3D игри на Linux. Същес...
Урок Сянка на Tomb Raider за Linux
Shadow of the Tomb Raider е дванадесетото допълнение към поредицата Tomb Raider - франчайз за екшън-приключенска игра, създаден от Eidos Montreal. Игр...