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 для захоплення з першого інтерфейсу Wi-Fi wlan0

імпорт pyshark
захоплення = пишарк.LiveCapture (інтерфейс = 'wlan0')

З попередніми операторами захоплені мережеві пакети зберігаються в пам'яті. Доступна пам’ять може бути обмежена, однак альтернативою є зберігання захоплених пакетів у локальному файлі. Використовується формат файлу Pcap [9]. Це дозволяє вам обробляти та інтерпретувати отримані дані за допомогою інших інструментів, які також пов'язані з бібліотекою Pcap.

Лістинг 6: Використовуйте PyShark для зберігання захоплених пакетів у локальному файлі

імпорт pyshark
захоплення = пишарк.FileCapture ('/ tmp / networkpackages.шапка ')

Запускаючи списки 5 та 6, ви ще не отримаєте жодного результату. Наступним кроком є ​​звуження пакетів, які потрібно збирати точніше, виходячи з бажаних критеріїв.

Вибір пакетів

Введений раніше об’єкт захоплення встановлює підключення до потрібного інтерфейсу. Далі два методи sniff () і sniff_continuily () об’єкта захоплення збирають мережеві пакети. sniff () повертається до абонента, як тільки всі запитувані пакети будуть зібрані. Натомість sniff_continuily () доставляє один пакет абоненту, як тільки його було зібрано. Це забезпечує прямий потік мережевого трафіку.

Крім того, два методи дозволяють вказати різні обмеження та механізм фільтрації пакетів, наприклад, кількість пакетів, що використовують параметр packet_count, і період, протягом якого пакети повинні бути зібрані, використовуючи параметр timeout. Лістинг 7 демонструє, як зібрати 50 мережевих пакетів лише як прямий ефір, використовуючи метод sniff_continuously ().

Лістинг 7: Зберіть 50 мережевих пакетів з wlan0

імпорт pyshark
захоплення = пишарк.LiveCapture (інтерфейс = 'wlan0')
для захоплення пакета.безперервно нюхати (кількість пакетів = 5):
друк (пакет)

Різні деталі пакета видно за допомогою друку виписки (пакета) (див. Рисунок 1).

Рисунок 1: вміст пакету

У списку 7 ви зібрали всі види мережевих пакетів, незалежно від протоколу чи порту обслуговування. PyShark дозволяє виконувати розширену фільтрацію, використовуючи так званий фільтр BPF [12]. У лістингу 8 показано, як зібрати 5 TCP-пакетів, що надходять через порт 80, та роздрукувати тип пакету. Інформація зберігається в атрибуті пакета найвищий_шар.

Лістинг 8: Збір лише пакетів TCP

імпорт pyshark
захоплення = пишарк.LiveCapture (інтерфейс = 'wlan0', bpf_filter = 'tcp порт 80')
захоплення.нюхати (кількість пакетів = 5)
друк (захоплення)
для захоплення пакета:
друк (пакет.найвищий_шар)

Збережіть перелік 8 як файл tcp-sniff.py та запустіть скрипт Python. Вихід такий:

Лістинг 9: Результати лістингу 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Розпакування захоплених пакетів

Захоплений об'єкт працює як російська лялька Матроска - шар за шаром, він містить вміст відповідного мережевого пакета. Розпакування трохи схоже на Різдво - ви ніколи не знаєте, яку інформацію знайдете всередині, поки не відкрили її. Лістинг 10 демонструє захоплення 10 мережевих пакетів та виявлення типу протоколу, як джерела, так і порту призначення та адреси.

Лістинг 10: Відображення джерела та місця призначення захопленого пакету

імпорт pyshark
час імпорту
# визначити інтерфейс
networkInterface = "enp0s3"
# визначити об'єкт захоплення
захоплення = пишарк.LiveCapture (інтерфейс = networkInterface)
print ("прослуховування на% s"% networkInterface)
для захоплення пакета.безперервно нюхати (кількість пакетів = 10):
# скоригований вихід
спробуйте:
# отримати мітку часу
localtime = час.asctime (час.localtime (час.час ()))
# отримати вміст пакета
протокол = пакет.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-commands-monitor-network /
  • [2] Бібліотека сокетів Python, https: // docs.пітон.org / 3 / library / socket.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] Царк, https: // www.дротовий акул.org / docs / man-pages / tshark.html
  • [11] Apache Spark, https: // іскра.апаш.орг /
  • [12] Фільтр BPF, https: // wiki.дротовий акул.org / CaptureFilters
Open Source Ports of Commercial Game Engines
Free, open source and cross-platform game engine recreations can be used to play old as well as some of the fairly recent game titles. This article wi...
Кращі ігри командного рядка для Linux
Командний рядок - це не просто ваш найбільший союзник при використанні Linux, він також може бути джерелом розваг, оскільки ви можете використовувати ...
Кращі програми для картографування геймпадів для Linux
Якщо ви любите грати в ігри на Linux із геймпадом замість типової системи введення клавіатури та миші, є кілька корисних програм для вас. Багато ігор ...