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 install 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
захват = pyshark.LiveCapture (интерфейс = 'wlan0')

С помощью предыдущих операторов захваченные сетевые пакеты хранятся в памяти. Доступная память может быть ограничена, однако альтернативой является сохранение захваченных пакетов в локальном файле. Используется формат файла Pcap [9]. Это позволяет обрабатывать и интерпретировать захваченные данные другими инструментами, которые также связаны с библиотекой Pcap.

Листинг 6. Используйте PyShark для хранения захваченных пакетов в локальном файле

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

Запустив листинги 5 и 6, у вас еще не будет вывода. Следующий шаг - сузить количество пакетов, которые нужно собрать, более точно на основе ваших желаемых критериев.

Выбор пакетов

Ранее введенный объект захвата устанавливает соединение с желаемым интерфейсом. Затем два метода sniff () и sniff_continuously () объекта захвата собирают сетевые пакеты. sniff () возвращается к вызывающему, как только все запрошенные пакеты будут собраны. Напротив, sniff_continuously () доставляет один пакет вызывающей стороне, как только он был собран. Это позволяет транслировать сетевой трафик в реальном времени.

Кроме того, эти два метода позволяют указать различные ограничения и механизм фильтрации пакетов, например, количество пакетов с помощью параметра packet_count и период, в течение которого пакеты должны быть собраны с помощью параметра timeout. В листинге 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, и распечатать тип пакета. Информация хранится в атрибуте пакета high_layer.

Листинг 8: Только сбор пакетов TCP

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

Сохраните листинг 8 как файл tcp-sniff.py и запустите скрипт Python. Результат выглядит следующим образом:

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

# python3 tcp-sniff.ру

TCP
TCP
TCP
OCSP
TCP
#

Распаковка захваченных пакетов

Захваченный объект работает как русская кукла Матроска - слой за слоем, он содержит содержимое соответствующего сетевого пакета. Распаковка немного похожа на Рождество - вы никогда не узнаете, какую информацию найдете внутри, пока не откроете ее. В листинге 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) "% (местное время, src_addr, src_port, dst_addr, dst_port, протокол))
кроме AttributeError как e:
# игнорировать пакеты, отличные от TCP, UDP и IPv4
проходить
Распечатать (" ")

Сценарий генерирует вывод, как показано на рисунке 2, по одной строке на каждый полученный пакет. Каждая строка начинается с отметки времени, за которой следуют IP-адрес и порт источника, затем IP-адрес и порт назначения и, наконец, тип сетевого протокола.


Рисунок 2: Источник и место назначения для захваченных пакетов

Заключение

Создание собственного сетевого сканера еще никогда не было таким простым. PyShark, основанный на принципах Wireshark, предлагает вам комплексную и стабильную структуру для мониторинга сетевых интерфейсов вашей системы в соответствии с вашими требованиями.

Ссылки и ссылки

  • [1] Silver Moon: 18 команд для мониторинга пропускной способности сети на сервере Linux, https: // www.двоичные.ком / Linux-команды-монитор-сеть /
  • [2] Библиотека сокетов Python, https: // docs.питон.org / 3 / библиотека / сокет.html
  • [3] python-nmap, https: // pypi.организация / проект / 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.org /
  • [8] PyShark, веб-сайт проекта, http: // kiminewt.github.io / pyshark /
  • [9] Формат файла Libpcap, Wireshark Wiki, https: // gitlab.com / wirehark / wirehark / - / вики / разработка / LibpcapFileFormat
  • [10] Царк, https: // www.WireShark.org / docs / man-страницы / tshark.html
  • [11] Apache Spark, https: // искра.апач.org /
  • [12] Фильтр BPF, https: // wiki.WireShark.org / CaptureFilters
Учебник OpenTTD
OpenTTD - одна из самых популярных бизнес-симуляторов. В этой игре вам нужно создать замечательный транспортный бизнес. Тем не менее, вы начнете в нач...
SuperTuxKart для Linux
SuperTuxKart - отличная игра, созданная для того, чтобы бесплатно познакомить вас с Mario Kart в вашей системе Linux. Играть в нее довольно сложно и в...
Учебник Battle for Wesnoth
Битва за Веснот - одна из самых популярных стратегических игр с открытым исходным кодом, в которую вы можете играть сейчас. Эта игра не только очень д...