NFStream — это мультиплатформенная среда Python, обеспечивающая быстрые, гибкие и выразительные структуры данных, предназначенные для того, чтобы сделать работу с онлайн- или офлайн- сетевыми данными простой и интуитивно понятной. Он призван стать фундаментальным строительным блоком высокого уровня Python для практического анализа реальных сетевых потоков данных. Кроме того, перед ним стоит более широкая цель — стать объединяющей средой сетевого анализа данных для исследователей, обеспечивающей воспроизводимость данных в ходе экспериментов.
Живой блокнот | |
Сайт проекта | |
Дискуссионный канал | |
Последний выпуск | |
Поддерживаемые версии | |
Лицензия проекта | |
Непрерывная интеграция | |
Качество кода |
Основные характеристики
Как это получить?
Как его использовать?
Обучение модели
Стример на базе машинного обучения с живым трафиком
Зашифрованная идентификация приложений и извлечение метаданных
Видимость системы
Посмертное извлечение статистических характеристик потока
Раннее извлечение статистических характеристик потока
Интерфейс экспорта Pandas
Интерфейс экспорта CSV
Расширение NFStream
Обучение и развертывание моделей машинного обучения
Сборка из исходников
Содействие
Этика
Кредиты
Цитирование
Авторы
Поддерживающие организации
Публикации, использующие NFStream
Лицензия
Производительность: NFStream спроектирован так, чтобы быть быстрым: AF_PACKET_V3/FANOUT в Linux, многопроцессорность, собственный вычислительный механизм на основе CFFI и полная поддержка PyPy .
Видимость зашифрованного уровня 7: глубокая проверка пакетов NFStream основана на nDPI . Это позволяет NFStream выполнять надежную идентификацию зашифрованных приложений и снимать отпечатки метаданных (например, TLS, SSH, DHCP, HTTP).
Видимость системы: NFStream исследует ядро отслеживаемой системы для получения информации об открытых интернет-сокетах и собирает гарантированную основную информацию (имя процесса, PID и т. д.) на уровне приложения.
Извлечение статистических признаков: NFStream обеспечивает современное извлечение статистических признаков на основе потоков. Он включает в себя посмертные статистические характеристики (например, минимум, среднее значение, стандартное отклонение и максимум размера пакета и времени между поступлениями) и ранние характеристики потока (например, последовательность размеров первых n пакетов, время между поступлениями и направления).
Гибкость: NFStream легко расширяется с помощью NFPlugins . Это позволяет создать новую функцию потока в нескольких строках Python.
Ориентация на машинное обучение: NFStream стремится сделать подходы машинного обучения для управления сетевым трафиком воспроизводимыми и пригодными для развертывания. Используя NFStream в качестве общей платформы, исследователи гарантируют, что модели обучаются с использованием одной и той же логики вычисления функций, и, таким образом, становится возможным справедливое сравнение. Более того, обученные модели можно развертывать и оценивать в действующих сетях с помощью NFPlugins .
Бинарные установщики последней выпущенной версии доступны на Pypi.
pip установить nfstream
Примечания для Windows : NFStream не включает драйверы захвата для Windows (лицензионные ограничения). Перед установкой NFStream необходимо установить драйверы Npcap. Если Wireshark уже установлен в Windows, то драйверы Npcap уже установлены, и никаких дополнительных действий выполнять не нужно.
Имеете дело с большим файлом PCAP и хотите объединить его в помеченные сетевые потоки? NFStream упрощает этот путь в несколько строк:
from nfstream import NFStreamer# Мы отображаем все параметры стримера со значениями по умолчанию.# Подробную информацию о каждом параметре см. в документации.# https://www.nfstream.org/docs/api#nfstreamermy_streamer = NFStreamer(source="facebook.pcap) ", # или работающий сетевой интерфейс decode_tunnels=True, bpf_filter=None, promiscous_mode=True, snapshot_length=1536, Idle_timeout=120, active_timeout=1800,accounting_mode=0, udps=None, n_dissections=20, статистический_анализ=False, splt_anaанализ=0, n_meters=0, max_nflows=0, Performance_report=0, system_visibility_mode=0, system_visibility_poll_ms=100) для потока в my_streamer:print(flow) # распечатайте его.
# Подробное описание каждой функции смотрите в документации.# https://www.nfstream.org/docs/api#nflowNFlow(id=0, expiration_id=0, src_ip='192.168.43.18', src_mac='30:52:cb :6c:9c:1b', src_oui='30:52:cb', src_port=52066, dst_ip='66.220.156.68', dst_mac='98:0c:82:d3:3c:7c', dst_oui='98:0c:82', dst_port=443, протокол=6, ip_version=4, vlan_id=0, туннель_id=0, двунаправленный_first_seen_ms = 1472393122365, двунаправленный_last_seen_ms = 1472393123665, двунаправленный_длительность_мс = 1300, двунаправленные_пакеты = 19, двунаправленные_байты = 5745, src2dst_first_seen_ms = 1472393122365, src2dst_last_seen_ms=1472393123408, src2dst_duration_ms=1043, src2dst_packets=9, src2dst_bytes=1345, dst2src_first_seen_ms=1472393122668, dst2src_last_seen_ms=1472393123665, dst2src_duration_ms=997, dst2src_packets=10, dst2src_bytes=4400, application_name='TLS.Facebook', application_category_name='SocialNetwork', application_is_guessed=0, application_confidence=4, Request_server_name='facebook.com', client_fingerprint='bfcc1a3891601edb4f137ab7ab25b840', server_fingerprint='2d1eb5817ece335c24904f516ad5da12', user_agent='', content_type='')
NFStream исследует ядро отслеживаемой системы для получения информации об открытых интернет-сокетах и собирает гарантированную основную информацию (имя процесса, PID и т. д.) на уровне приложения.
from nfstream import NFStreamermy_streamer = NFStreamer(source="Intel(R) Wi-Fi 6 AX200 160MHz", # Режим захвата в реальном времени. # Отключить рассечение L7 только для удобства чтения. n_dissections=0, system_visibility_poll_ms=100, system_visibility_mode=1) для потока в my_streamer:print(flow) # распечатайте его.
# Подробное описание каждой функции смотрите в документации.# https://www.nfstream.org/docs/api#nflowNFlow(id=0, expiration_id=0, src_ip='192.168.43.18', src_mac='30:52:cb :6c:9c:1b', src_oui='30:52:cb', src_port=59339, dst_ip='184.73.244.37', dst_mac='98:0c:82:d3:3c:7c', dst_oui='98:0c:82', dst_port=443, протокол=6, ip_version=4, vlan_id=0, туннель_id=0, двунаправленный_first_seen_ms = 1638966705265, двунаправленный_last_seen_ms = 1638966706999, двунаправленный_длительность_мс = 1734, двунаправленные_пакеты = 98, двунаправленные_байты = 424464, src2dst_first_seen_ms = 1638966705265, src2dst_last_seen_ms=1638966706999, src2dst_duration_ms=1734, src2dst_packets=22, src2dst_bytes=2478, dst2src_first_seen_ms=1638966705345, dst2src_last_seen_ms=1638966706999, dst2src_duration_ms=1654, dst2src_packets=76, dst2src_bytes=421986, # Процесс, сгенерировавший этот отчетный поток system_process_pid=14596, system_process_name = 'FortniteClient-Win64-Shipping.exe')
NFStream выполняет 48 посмертных статистических характеристик потока, которые включают подробный анализ флагов TCP, минимальное, среднее, максимальное и стандартное отклонение как размера пакета, так и времени между поступлениями в каждом направлении.
from nfstream import NFStreamermy_streamer = NFStreamer(source="facebook.pcap", # Отключить рассечение L7 для удобства чтения. n_dissections=0, статистический_анализ = True) для потока в my_streamer:print(flow)
# Подробное описание каждой функции смотрите в документации.# https://www.nfstream.org/docs/api#nflowNFlow(id=0, expiration_id=0, src_ip='192.168.43.18', src_mac='30:52:cb :6c:9c:1b', src_oui='30:52:cb', src_port=52066, dst_ip='66.220.156.68', dst_mac='98:0c:82:d3:3c:7c', dst_oui='98:0c:82', dst_port=443, протокол=6, ip_version=4, vlan_id=0, туннель_id=0, двунаправленный_first_seen_ms = 1472393122365, двунаправленный_last_seen_ms = 1472393123665, двунаправленный_длительность_мс = 1300, двунаправленные_пакеты = 19, двунаправленные_байты = 5745, src2dst_first_seen_ms = 1472393122365, src2dst_last_seen_ms=1472393123408, src2dst_duration_ms=1043, src2dst_packets=9, src2dst_bytes=1345, dst2src_first_seen_ms=1472393122668, dst2src_last_seen_ms=1472393123665, dst2src_duration_ms=997, dst2src_packets=10, dst2src_bytes=4400, двунаправленный_min_ps=66, двунаправленный_mean_ps=302.36842105263156, двунаправленный_stddev_ps=425.53315715259754, двунаправленный_max_ps=1454, src2dst_min_ps=66, src2dst_mean_ps=149.44444444444446, src2dst_stddev_ps=132.20354676701294, src2dst_max_ps=449, dst2src_min_ps=66, dst2src_mean_ps=440,0, dst2src_stddev_ps=549,7164925870628, dst2src_max_ps=1454, двунаправленный_min_piat_ms=0, двунаправленный_mean_piat_ms=72.22222222222223, двунаправленный_stddev_piat_ms=137,34994188549086, двунаправленный_max_piat_ms=398, src2dst_min_piat_ms=0, src2dst_mean_piat_ms=130,375, src2dst_stddev_piat_ms=179.72036811192467, src2dst_max_piat_ms=415, dst2src_min_piat_ms=0, dst2src_mean_piat_ms=110.77777777777777, dst2src_stddev_piat_ms=169.51458475436397, dst2src_max_piat_ms=409, bidirect_syn_packets=2, bidirect_cwr_packets=0, bidirected_ece_packets=0, bidirected_urg_packets=0, bidirected_ack_packets=18, bidirect_psh_packets=9, bidirected_rst_packets=0, bidirect_fin_packets=0, src2dst_syn_packets=1, src2dst_cwr_packets=0, src2dst_ece_packets=0, src2dst_urg_packets=0, src2dst_ack_packets=8, src2dst_psh_packets=4, src2dst_rst_packets=0, src2dst_fin_packets=0, dst2src_syn_packets=1, dst2src_cwr_packets=0, dst2src_ece_packets=0, dst2src_urg_packets=0, dst2src_ack_packets=10, dst2src_psh_packets=5, dst2src_rst_packets=0, dst2src_fin_packets=0)
NFStream выполняет раннее (до 255 пакетов) извлечение статистических характеристик потока (в литературе это называется SPLT-анализом). Он суммируется как последовательность направлений, размеров и времени прибытия этих пакетов.
from nfstream import NFStreamermy_streamer = NFStreamer(source="facebook.pcap", # Мы отключаем рассечение l7 для удобства чтения. n_dissections=0, splt_anaанализ=10)для потока в my_streamer:print(flow)
# Подробное описание каждой функции смотрите в документации.# https://www.nfstream.org/docs/api#nflowNFlow(id=0, expiration_id=0, src_ip='192.168.43.18', src_mac='30:52:cb :6c:9c:1b', src_oui='30:52:cb', src_port=52066, dst_ip='66.220.156.68', dst_mac='98:0c:82:d3:3c:7c', dst_oui='98:0c:82', dst_port=443, протокол=6, ip_version=4, vlan_id=0, туннель_id=0, двунаправленный_first_seen_ms = 1472393122365, двунаправленный_last_seen_ms = 1472393123665, двунаправленный_длительность_мс = 1300, двунаправленные_пакеты = 19, двунаправленные_байты = 5745, src2dst_first_seen_ms = 1472393122365, src2dst_last_seen_ms=1472393123408, src2dst_duration_ms=1043, src2dst_packets=9, src2dst_bytes=1345, dst2src_first_seen_ms=1472393122668, dst2src_last_seen_ms=1472393123665, dst2src_duration_ms=997, dst2src_packets=10, dst2src_bytes=4400, # Последовательность из 10 направлений первого пакета, размера и времени поступления. splt_direction=[0, 1, 0, 0, 1, 1, 0, 1, 0, 1], splt_ps=[74, 74, 66, 262, 66, 1454, 66, 1454, 66, 463], splt_piat_ms= [0, 303, 0, 0, 313, 0, 0, 0, 0, 1])
NFStream изначально поддерживает Pandas в качестве интерфейса экспорта.
# Дополнительную информацию см. в документации.# https://www.nfstream.org/docs/api#pandas-dataframe-conversionfrom nfstream import NFStreamermy_dataframe = NFStreamer(source='teams.pcap').to_pandas()[["src_ip" ,"src_port","dst_ip", "dst_port", "протокол", "двунаправленные_пакеты", "двунаправленные_байты", "имя_приложения"]]my_dataframe.head(5)
NFStream изначально поддерживает формат файлов CSV в качестве интерфейса экспорта.
# Дополнительную информацию смотрите в документации.# https://www.nfstream.org/docs/api#csv-file-conversionflows_count = NFStreamer(source='facebook.pcap').to_csv(path=None,columns_to_anonymize=(), flows_per_file=0,rotate_files=0)
Не нашли конкретной особенности потока? добавьте плагин в NFStream в несколько строк:
from nfstream import NFPluginclass MyCustomPktSizeFeature(NFPlugin):def on_init(self, package, flow):# создание потока с первым пакетомif package.raw_size == self.custom_size:flow.udps.packet_with_custom_size = 1else:flow.udps.packet_with_custom_size = 0 def on_update(self, package, flow):# обновление потока с каждым пакетом, принадлежащим потоку, если package.raw_size == self.custom_size:flow.udps.packet_with_custom_size += 1extended_streamer = NFStreamer(source='facebook.pcap', udps=MyCustomPktSizeFeature(custom_size=555)) для потока в расширенном_стримере:# посмотрите свою динамически созданную метрику в сгенерированных потокахprint(flow.udps.packet_with_custom_size)
Следующий упрощенный пример демонстрирует, как обучить и развернуть подход машинного обучения для категоризации транспортных потоков. Мы хотим запустить классификацию потоков категорий социальных сетей на основе двунаправленных_пакетов и двунаправленных_байтов в качестве входных функций. Для краткости мы решили прогнозировать только на этапе истечения потока.
из nfstream import NFPlugin, NFStreamerimport numpyfrom sklearn.ensemble import RandomForestClassifierdf = NFStreamer(source="training_traffic.pcap").to_pandas()X = df[["biнаправленные_пакеты", "двунаправленные_байты"]]y = df["имя_категории_приложения"]. применить (лямбда x: 1, если «SocialNetwork» в x еще 0)модель = RandomForestClassifier()model.fit(X, y)
class ModelPrediction(NFPlugin):def on_init(self, package, flow):flow.udps.model_prediction = 0def on_expire(self, flow):# Вы можете сделать то же самое в точке входа on_update и принудительно истечь с пользовательским идентификатором. to_predict = numpy.array([flow.bidirection_packets,flow.bidirect_bytes]).reshape((1,-1))flow.udps.model_prediction = self.my_model.predict(to_predict)ml_streamer = NFStreamer(source="eth0", udps=ModelPrediction(my_model=model)) для потока в ml_streamer:print(flow.udps.model_prediction)
Больше примеров и подробностей NFPlugin представлено в официальной документации . Вы также можете протестировать NFStream без установки, используя наш демо-блокнот .
Чтобы собрать NFStream из исходников, прочтите руководство по установке, представленное в официальной документации.
Подробную информацию о нашем кодексе поведения и процессе отправки нам запросов на внесение изменений см. в разделе «Вклад» .
NFStream предназначен для исследования сетевых данных и криминалистики. Исследователи и специалисты по сетевым данным могут использовать эту платформу для создания надежных наборов данных, а также обучения и оценки сетевых моделей машинного обучения. Как и любой другой инструмент мониторинга пакетов, NFStream может быть использован не по назначению. Не запускайте его в сети, которой вы не владеете и не администрируете .
Статья NFStream опубликована в журнале Computer Networks (COMNET) . Если вы используете NFStream в научной публикации, мы будем признательны за ссылки на следующую статью:
@article{AOUINI2022108719, title = {NFStream: гибкая система анализа сетевых данных}, автор = {Ауини, Зид и Пекар, Адриан}, дои = {10.1016/j.comnet.2021.108719}, иссн = {1389-1286}, журнал = {Компьютерные сети}, страницы = {108719}, год = {2022}, издатель = {Эльзевир}, объем = {204}, URL = {https://www.sciencedirect.com/science/article/pii/S1389128621005739} }
Следующие люди внесли свой вклад в NFStream:
Зиед Ауини : Создатель и основной разработчик.
Адриан Пекар : Генерация и хранение наборов данных.
Ромен Пикард : реализация плагинов MDNS и DHCP.
Радион Бикмухамедов : Начальная работа по анализу SPLT NFPlugin.
Следующие организации поддержали NFStream:
SoftAtHome : Сторонник разработки NFStream.
Технический университет Кошице : Оборудование и инфраструктура для создания и хранения наборов данных.
ntop : Техническая поддержка интеграции nDPI .
Проект Nmap : Техническая поддержка интеграции Npcap (установщик NPCAP OEM в Windows CI).
Google OSS Fuzz : постоянная поддержка фаззингового тестирования проекта NFStream.
Иерархическая архитектура и вероятностная стратегия для совместного обнаружения вторжений.
Платформа с открытым исходным кодом для зашифрованного Интернета и классификации вредоносного трафика
ConFlow: контраст сетевого потока, улучшающий несбалансированное обучение при обнаружении сетевых вторжений
Постоянное обучение обнаружению сетевых вторжений на основе аномалий
Самобезопасная система на основе программно-определяемой сети.
Надежные вариационные автоэнкодеры и нормализующие потоки для неконтролируемого обнаружения сетевых аномалий
RADON: надежный автоэнкодер для неконтролируемого обнаружения аномалий
Общий подход машинного обучения для идентификации устройств Интернета вещей
Ранжирование сетевых устройств по приоритетности сигналов тревоги: практический пример обнаружения вторжений
Обнаружение вредоносных программ на основе сетевых потоков с использованием комбинированного подхода сканирования и глубокого обучения
Обнаружение сетевых вторжений на основе распределенного надежного искусственного интеллекта
Генеративный преобразователь для генерации и классификации сетевого трафика
Генераторы и классификаторы многоклассового сетевого трафика на основе нейронных сетей
Использование встроенного выбора функций и CNN для классификации в CCD-INID-V1: новый набор данных Интернета вещей
Подход, основанный на сетях, определяемых знаниями, для идентификации потоков потокового видео в сетях 5G
Открытие знаний: может ли оно пролить новый свет на определение порога для обнаружения сильных нападающих?
Сбор и анализ трафика выходного узла Tor
Анализ и сбор данных из IP-сети
Этот проект лицензируется по лицензии LGPLv3 — подробности см. в файле лицензии .