NFStream ist ein plattformübergreifendes Python-Framework, das schnelle, flexible und ausdrucksstarke Datenstrukturen bietet, die die Arbeit mit Online- oder Offline -Netzwerkdaten einfach und intuitiv machen sollen. Es soll Pythons grundlegender High-Level-Baustein für die Durchführung praktischer, realer Netzwerkflussdatenanalysen sein. Darüber hinaus verfolgt es das umfassendere Ziel, ein vereinheitlichendes Netzwerk-Datenanalyse-Framework für Forscher zu werden, das die Datenreproduzierbarkeit über Experimente hinweg gewährleistet.
Live-Notizbuch | |
Projekt-Website | |
Diskussionskanal | |
Neueste Version | |
Unterstützte Versionen | |
Projektlizenz | |
Kontinuierliche Integration | |
Codequalität |
Hauptmerkmale
Wie bekomme ich es?
Wie benutzt man es?
Trainieren des Modells
ML-basierter Streamer im Live-Verkehr
Verschlüsselte Anwendungsidentifikation und Metadatenextraktion
Systemsichtbarkeit
Extraktion statistischer Flussmerkmale nach dem Tod
Frühe Extraktion statistischer Flussmerkmale
Pandas-Exportschnittstelle
CSV-Exportschnittstelle
NFStream erweitern
Schulung und Bereitstellung von Modellen für maschinelles Lernen
Aus Quellen bauen
Mitwirken
Ethik
Credits
Zitat
Autoren
Unterstützende Organisationen
Veröffentlichungen, die NFStream verwenden
Lizenz
Leistung: NFStream ist auf Schnelligkeit ausgelegt: AF_PACKET_V3/FANOUT unter Linux, Multiprocessing, native CFFI-basierte Berechnungs-Engine und volle PyPy- Unterstützung.
Verschlüsselte Layer-7-Sichtbarkeit: NFStream Deep Packet Inspection basiert auf nDPI . Es ermöglicht NFStream die zuverlässige Identifizierung verschlüsselter Anwendungen und das Fingerprinting von Metadaten (z. B. TLS, SSH, DHCP, HTTP).
Systemsichtbarkeit: NFStream untersucht den Kernel des überwachten Systems, um Informationen über offene Internet-Sockets zu erhalten, und sammelt garantierte Grundwahrheiten (Prozessname, PID usw.) auf Anwendungsebene.
Extraktion statistischer Merkmale: NFStream bietet modernste flussbasierte Extraktion statistischer Merkmale. Es umfasst Post-Mortem-Statistikmerkmale (z. B. Minimum, Mittelwert, Standardabweichung und Maximum der Paketgröße und Zwischenankunftszeit) und frühe Flussmerkmale (z. B. Reihenfolge der ersten n Paketgrößen, Zwischenankunftszeiten und Richtungen).
Flexibilität: NFStream ist mit NFPlugins leicht erweiterbar. Es ermöglicht die Erstellung einer neuen Flow-Funktion innerhalb weniger Zeilen von Python.
Auf maschinelles Lernen ausgerichtet: NFStream zielt darauf ab, Ansätze des maschinellen Lernens für das Netzwerkverkehrsmanagement reproduzierbar und einsetzbar zu machen. Durch die Verwendung von NFStream als gemeinsames Framework stellen Forscher sicher, dass Modelle mit derselben Funktionsberechnungslogik trainiert werden und somit ein fairer Vergleich möglich ist. Darüber hinaus können trainierte Modelle mithilfe von NFPlugins in Live-Netzwerken bereitgestellt und ausgewertet werden.
Binäre Installationsprogramme für die neueste veröffentlichte Version sind auf Pypi verfügbar.
pip nfstream installieren
Windows-Hinweise : NFStream enthält keine Capture-Treiber unter Windows (Lizenzbeschränkungen). Es ist erforderlich, Npcap-Treiber vor der Installation von NFStream zu installieren. Wenn Wireshark bereits unter Windows installiert ist, sind die Npcap-Treiber bereits installiert und Sie müssen keine weiteren Aktionen ausführen.
Sie haben es mit einer großen PCAP-Datei zu tun und möchten diese in gekennzeichneten Netzwerkflüssen zusammenfassen? NFStream erleichtert diesen Weg in ein paar Zeilen:
from nfstream import NFStreamer# Wir zeigen alle Streamer-Parameter mit ihren Standardwerten an.# Detaillierte Informationen zu jedem Parameter finden Sie in der Dokumentation.# https://www.nfstream.org/docs/api#nfstreamermy_streamer = NFStreamer(source="facebook.pcap ", # oder Live-Netzwerkschnittstelle decode_tunnels=True, bpf_filter=None, promiscuous_mode=True, snapshot_length=1536, Idle_timeout=120, Active_Timeout=1800, Accounting_Mode=0, Udps=None, N_Dissections=20, Statistics_Analysis=False, Splt_Analysis=0, N_Meters=0, Max_nFlows=0, Performance_Report=0, System_Visibility_Mode=0, System_Visibility_poll_ms=100. für flow in my_streamer:print(flow) # drucke es aus.
# Siehe Dokumentation für jede detaillierte Beschreibung der Funktion.# 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, Protokoll=6, ip_version=4, vlan_id=0, tunnel_id=0, bidirektionale_first_seen_ms=1472393122365, bidirektionale_last_seen_ms=1472393123665, bidirektionale_duration_ms=1300, bidirektionale_pakete=19, bidirektionale_bytes=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 untersucht den Kernel des überwachten Systems, um Informationen über offene Internet-Sockets zu erhalten, und sammelt garantierte Grundwahrheiten (Prozessname, PID usw.) auf Anwendungsebene.
from nfstream import NFStreamermy_streamer = NFStreamer(source="Intel(R) Wi-Fi 6 AX200 160MHz", # Live-Capture-Modus. # L7-Dissektion nur aus Gründen der Lesbarkeit deaktivieren. n_dissections=0, system_visibility_poll_ms=100, system_visibility_mode=1) für flow in my_streamer:print(flow) # drucke es aus.
# Siehe Dokumentation für jede detaillierte Beschreibung der Funktion.# 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, Protokoll=6, ip_version=4, vlan_id=0, tunnel_id=0, bidirektionale_first_seen_ms=1638966705265, bidirektionale_last_seen_ms=1638966706999, bidirektionale_duration_ms=1734, bidirektionale_pakete=98, bidirektionale_bytes=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, # Der Prozess, der diesen gemeldeten Fluss generiert hat, system_process_pid=14596, system_process_name='FortniteClient-Win64-Shipping.exe')
NFStream führt die Extraktion von 48 Post-Mortem-Flow-Statistikmerkmalen durch, einschließlich einer detaillierten Analyse der TCP-Flags, Minimum, Mittelwert, Maximum und Standardabweichung sowohl der Paketgröße als auch der Ankunftszeit in jeder Richtung.
from nfstream import NFStreamermy_streamer = NFStreamer(source="facebook.pcap", # L7-Dissektion aus Gründen der Lesbarkeit deaktivieren. n_dissections=0, static_analysis=True)für den Fluss in my_streamer:print(flow)
# Siehe Dokumentation für jede detaillierte Beschreibung der Funktion.# 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, Protokoll=6, ip_version=4, vlan_id=0, tunnel_id=0, bidirektionale_first_seen_ms=1472393122365, bidirektionale_last_seen_ms=1472393123665, bidirektionale_duration_ms=1300, bidirektionale_pakete=19, bidirektionale_bytes=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, bidirektionale_min_ps=66, bidirektionale_mean_ps=302.36842105263156, bidirektional_stddev_ps=425.53315715259754, bidirektional_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, bidirektional_min_piat_ms=0, bidirektional_mean_piat_ms=72.22222222222223, bidirektional_stddev_piat_ms=137.34994188549086, bidirektional_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, bidirektionale_syn_packets=2, bidirektionale_cwr_packets=0, bidirektionale_ece_packets=0, bidirektionale_urg_packets=0, bidirektionale_ack_packets=18, bidirektionale_psh_packets=9, bidirektionale_rst_packets=0, bidirektionale_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 führt eine frühe (bis zu 255 Pakete) Extraktion statistischer Flussmerkmale durch (in der Literatur als SPLT-Analyse bezeichnet). Es wird als eine Abfolge der Richtungen, Größen und Ankunftszeiten dieser Pakete zusammengefasst.
from nfstream import NFStreamermy_streamer = NFStreamer(source="facebook.pcap", # Wir deaktivieren die l7-Dissektion aus Gründen der Lesbarkeit. n_dissections=0, splt_analysis=10)für den Fluss in my_streamer:print(flow)
# Siehe Dokumentation für jede detaillierte Beschreibung der Funktion.# 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, Protokoll=6, ip_version=4, vlan_id=0, tunnel_id=0, bidirektionale_first_seen_ms=1472393122365, bidirektionale_last_seen_ms=1472393123665, bidirektionale_duration_ms=1300, bidirektionale_pakete=19, bidirektionale_bytes=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, # Die Reihenfolge der ersten 10 Pakete Richtung, Größe und Zwischenankunftszeit. 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 unterstützt Pandas nativ als Exportschnittstelle.
# Weitere Details finden Sie in der Dokumentation.# 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“, „Protokoll“, „bidirektionale_Pakete“, „bidirektionale_Bytes“, „Anwendungsname“]]my_dataframe.head(5)
NFStream unterstützt nativ das CSV-Dateiformat als Exportschnittstelle.
# Weitere Details finden Sie in der Dokumentation.# https://www.nfstream.org/docs/api#csv-file-conversionflows_count = NFStreamer(source='facebook.pcap').to_csv(path=None,columns_to_anonymize=(), flow_per_file=0,rotate_files=0)
Haben Sie eine bestimmte Flow-Funktion nicht gefunden? Fügen Sie in wenigen Zeilen ein Plugin zu NFStream hinzu:
from nfstream import NFPluginclass MyCustomPktSizeFeature(NFPlugin):def on_init(self, packet, flow):# Flow-Erstellung mit dem ersten Paketif packet.raw_size == self.custom_size:flow.udps.packet_with_custom_size = 1else:flow.udps.packet_with_custom_size = 0 def on_update(self, packet, flow):# Flow-Update mit jedem Paket, das zum Flow gehört if packet.raw_size == self.custom_size:flow.udps.packet_with_custom_size += 1extended_streamer = NFStreamer(source='facebook.pcap', udps=MyCustomPktSizeFeature(custom_size=555))für Flow in Extended_streamer:# sehen Sie Ihre dynamisch erstellte Metrik in generierten Flowsprint(flow.udps.packet_with_custom_size)
Das folgende vereinfachte Beispiel zeigt, wie ein maschineller Lernansatz zur Kategorisierung des Verkehrsflusses trainiert und bereitgestellt wird. Wir möchten eine Klassifizierung der Kategorieflüsse sozialer Netzwerke basierend auf bidirektionalen Paketen und bidirektionalen Bytes als Eingabemerkmalen durchführen. Der Kürze halber entscheiden wir uns für eine Vorhersage nur im Stadium des Flussablaufs.
from nfstream import NFPlugin, NFStreamerimport numpyfrom sklearn.ensemble import RandomForestClassifierdf = NFStreamer(source="training_traffic.pcap").to_pandas()X = df[["bidirektionale_pakete", "bidirektionale_bytes"]]y = df["application_category_name"]. apply(lambda x: 1 if 'SocialNetwork' in x else 0)model = RandomForestClassifier()model.fit(X, y)
class ModelPrediction(NFPlugin):def on_init(self, packet, flow):flow.udps.model_prediction = 0def on_expire(self, flow):# Sie können dasselbe im on_update-Einstiegspunkt tun und den Ablauf mit einer benutzerdefinierten ID erzwingen. to_predict = numpy.array([flow.bidirektionale_packets, flow.bidirektionale_bytes]).reshape((1,-1))flow.udps.model_prediction = self.my_model.predict(to_predict)ml_streamer = NFStreamer(source="eth0", udps=ModelPrediction(my_model=model))für den Einlauf ml_streamer:print(flow.udps.model_prediction)
Weitere NFPlugin-Beispiele und Details finden Sie in der offiziellen Dokumentation . Sie können NFStream auch ohne Installation mit unserem Live-Demo-Notebook testen.
Um NFStream aus Quellen zu erstellen, lesen Sie bitte die Installationsanleitung in der offiziellen Dokumentation.
Weitere Informationen zu unserem Verhaltenskodex und dem Verfahren zur Übermittlung von Pull-Anfragen an uns finden Sie unter „Mitwirken“ .
NFStream ist für die Netzwerkdatenforschung und Forensik gedacht. Forscher und Netzwerkdatenwissenschaftler können dieses Framework verwenden, um zuverlässige Datensätze zu erstellen und netzwerkbasierte Modelle für maschinelles Lernen zu trainieren und zu bewerten. Wie jedes Paketüberwachungstool kann NFStream missbraucht werden. Führen Sie es nicht in einem Netzwerk aus, das Sie nicht besitzen oder verwalten .
Das NFStream-Papier wurde in Computer Networks (COMNET) veröffentlicht. Wenn Sie NFStream in einer wissenschaftlichen Veröffentlichung verwenden, würden wir uns über Zitate zum folgenden Artikel freuen:
@article{AOUINI2022108719, title = {NFStream: Ein flexibles Netzwerkdatenanalyse-Framework}, Autor = {Aouini, Zied und Pekar, Adrian}, doi = {10.1016/j.comnet.2021.108719}, issn = {1389-1286}, Journal = {Computernetzwerke}, Seiten = {108719}, Jahr = {2022}, Herausgeber = {Elsevier}, Volumen = {204}, URL = {https://www.sciencedirect.com/science/article/pii/S1389128621005739} }
Die folgenden Personen haben zu NFStream beigetragen:
Zied Aouini : Schöpfer und Kernentwickler.
Adrian Pekar : Generierung und Speicherung von Datensätzen.
Romain Picard : Implementierung von MDNS- und DHCP-Plugins.
Radion Bikmukhamedov : Erste Arbeiten zum SPLT-Analyse-NFPlugin.
Die folgenden Organisationen unterstützten NFStream:
SoftAtHome : Unterstützer der NFStream-Entwicklung.
Technische Universität Košice : Hardware und Infrastruktur für die Generierung und Speicherung von Datensätzen.
ntop : Technischer Support der nDPI- Integration.
Das Nmap-Projekt : Technische Unterstützung der Npcap- Integration (NPCAP OEM-Installationsprogramm auf Windows CI).
Google OSS Fuzz : Kontinuierliche Fuzzing-Testunterstützung des NFStream-Projekts.
Eine hierarchische Architektur und probabilistische Strategie zur kollaborativen Einbruchserkennung
Open-Source-Framework für die Klassifizierung von verschlüsseltem Internet und bösartigem Datenverkehr
ConFlow: Kontrast-Netzwerkfluss zur Verbesserung des klassenunausgeglichenen Lernens bei der Erkennung von Netzwerkeinbrüchen
Kontinuierliches Lernen zur anomaliebasierten Erkennung von Netzwerkeinbrüchen
Ein selbstsicheres System basierend auf einem softwaredefinierten Netzwerk
Robuste Variations-Autoencoder und normalisierende Flüsse für die unbeaufsichtigte Erkennung von Netzwerkanomalien
RADON: Robuster Autoencoder für die unbeaufsichtigte Anomalieerkennung
Ein generischer maschineller Lernansatz zur Identifizierung von IoT-Geräten
Ranking von Netzwerkgeräten für die Alarmpriorisierung: Fallstudie zur Einbruchserkennung
Auf Netzwerkflüssen basierende Malware-Erkennung mithilfe eines kombinierten Ansatzes aus Crawling und Deep Learning
Erkennung von Netzwerkeinbrüchen basierend auf verteilter, vertrauenswürdiger künstlicher Intelligenz
Generatives Transformer-Framework für die Generierung und Klassifizierung von Netzwerkverkehr
Mehrklassen-Netzwerkverkehrsgeneratoren und -klassifikatoren basierend auf neuronalen Netzen
Verwendung eingebetteter Funktionsauswahl und CNN zur Klassifizierung auf CCD-INID-V1, einem neuen IoT-Datensatz
Ein auf wissensbasierter Vernetzung basierender Ansatz zur Identifizierung von Video-Streaming-Flüssen in 5G-Netzwerken
Wissensermittlung: Kann sie ein neues Licht auf die Schwellenwertdefinition für die Erkennung schwerer Schläge werfen?
Sammeln und Analysieren des Tor-Exit-Knotenverkehrs
Analyse und Sammlung von Daten aus dem IP-Netzwerk
Dieses Projekt ist unter der LGPLv3-Lizenz lizenziert – Einzelheiten finden Sie in der Lizenzdatei