NFStream es un marco Python multiplataforma que proporciona estructuras de datos rápidas, flexibles y expresivas diseñadas para que trabajar con datos de red en línea o fuera de línea sea fácil e intuitivo. Su objetivo es ser el componente fundamental de alto nivel de Python para realizar análisis prácticos de datos de flujo de red en el mundo real . Además, tiene el objetivo más amplio de convertirse en un marco unificador de análisis de datos de red para investigadores que proporcione reproducibilidad de datos en todos los experimentos.
Cuaderno en vivo | |
Sitio web del proyecto | |
Canal de discusión | |
Última versión | |
Versiones compatibles | |
Licencia de proyecto | |
Integración Continua | |
Calidad del código |
Características principales
¿Cómo conseguirlo?
¿Cómo usarlo?
Entrenando el modelo
Streamer impulsado por ML en tráfico en vivo
Identificación de aplicaciones cifradas y extracción de metadatos
Visibilidad del sistema
Extracción de características de flujo estadístico post-mortem
Extracción temprana de características de flujo estadístico
Interfaz de exportación de pandas
Interfaz de exportación CSV
Ampliando NFStream
Entrenamiento e implementación de modelos de aprendizaje automático
Construyendo a partir de fuentes
Contribuyendo
Ética
Créditos
Citación
Autores
Organizaciones de apoyo
Publicaciones que utilizan NFStream
Licencia
Rendimiento: NFStream está diseñado para ser rápido: AF_PACKET_V3/FANOUT en Linux, multiprocesamiento, motor de cálculo nativo basado en CFFI y soporte completo para PyPy .
Visibilidad cifrada de capa 7: la inspección profunda de paquetes NFStream se basa en nDPI . Permite que NFStream realice una identificación confiable de aplicaciones cifradas y toma de huellas digitales de metadatos (por ejemplo, TLS, SSH, DHCP, HTTP).
Visibilidad del sistema: NFStream sondea el núcleo del sistema monitoreado para obtener información sobre sockets abiertos de Internet y recopila la verdad sobre el terreno garantizada (nombre del proceso, PID, etc.) a nivel de aplicación.
Extracción de características estadísticas: NFStream proporciona lo último en extracción de características estadísticas basada en flujo. Incluye características estadísticas post-mortem (por ejemplo, mínimo, media, desviación estándar y máximo del tamaño de paquete y tiempo entre llegadas) y características de flujo temprano (por ejemplo, secuencia de los primeros n tamaños de paquetes, tiempos entre llegadas y direcciones).
Flexibilidad: NFStream es fácilmente extensible usando NFPlugins . Permite la creación de una nueva función de flujo en unas pocas líneas de Python.
Orientado al aprendizaje automático: NFStream tiene como objetivo hacer que los enfoques de aprendizaje automático para la gestión del tráfico de red sean reproducibles e implementables. Al utilizar NFStream como marco común, los investigadores se aseguran de que los modelos se entrenen utilizando la misma lógica de cálculo de características y, por lo tanto, sea posible una comparación justa. Además, los modelos entrenados se pueden implementar y evaluar en redes en vivo utilizando NFPlugins .
Los instaladores binarios para la última versión lanzada están disponibles en Pypi.
pip instalar nfstream
Notas de Windows : NFStream no incluye controladores de captura en Windows (restricciones de licencia). Es necesario instalar los controladores Npcap antes de instalar NFStream. Si Wireshark ya está instalado en Windows, entonces los controladores Npcap ya están instalados y no es necesario realizar ninguna acción adicional.
¿Está tratando con un archivo pcap grande y desea agregarlo en flujos de red etiquetados? NFStream facilita este camino en unas pocas líneas:
from nfstream import NFStreamer# Mostramos todos los parámetros del streamer con sus valores predeterminados.# Consulte la documentación para obtener información detallada sobre cada parámetro.# https://www.nfstream.org/docs/api#nfstreamermy_streamer = NFStreamer(source="facebook.pcap ", # o interfaz de red en vivo decode_tunnels=True, bpf_filter=Ninguno, promiscuous_mode=True, snapshot_length=1536, idle_timeout=120, active_timeout=1800, account_mode=0, udps=Ninguno, n_dissections=20, stats_analysis=False, splt_analysis=0, n_meters=0, max_nflows=0, performance_report=0, system_visibility_mode=0, system_visibility_poll_ms=100) para flujo en my_streamer:print(flow) # imprimirlo.
# Consulte la documentación para conocer la descripción detallada de cada característica.# 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, protocolo=6, ip_version=4, vlan_id=0, túnel_id=0, bidireccional_first_seen_ms=1472393122365, bidireccional_last_seen_ms=1472393123665, bidireccional_duration_ms=1300, bidireccional_packets=19, bidireccional_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, nombre_aplicación='TLS.Facebook', nombre_categoría_aplicación='Red Social', aplicación_is_guessed=0, application_confidence=4, request_server_name='facebook.com', client_fingerprint='bfcc1a3891601edb4f137ab7ab25b840', server_fingerprint='2d1eb5817ece335c24904f516ad5da12', user_agent='', content_type='')
NFStream sondea el núcleo del sistema monitoreado para obtener información sobre sockets abiertos de Internet y recopila la verdad sobre el terreno garantizada (nombre del proceso, PID, etc.) a nivel de aplicación.
from nfstream import NFStreamermy_streamer = NFStreamer(source="Intel(R) Wi-Fi 6 AX200 160MHz", # Modo de captura en vivo. # Deshabilite la disección L7 solo para fines de legibilidad. n_dissections=0, system_visibility_poll_ms=100, system_visibility_mode=1) para flujo en my_streamer:print(flow) # imprimirlo.
# Consulte la documentación para conocer la descripción detallada de cada característica.# 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, protocolo=6, ip_version=4, vlan_id=0, túnel_id=0, bidireccional_first_seen_ms=1638966705265, bidireccional_last_seen_ms=1638966706999, bidireccional_duration_ms=1734, bidireccional_packets=98, bidireccional_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, # El proceso que generó este flujo informado system_process_pid=14596. system_process_name='FortniteClient-Win64-Shipping.exe')
NFStream realiza 48 extracciones de características estadísticas de flujo post-mortem, que incluyen análisis detallados de indicadores TCP, desviación mínima, media, máxima y estándar tanto del tamaño del paquete como del tiempo entre llegadas en cada dirección.
from nfstream import NFStreamermy_streamer = NFStreamer(source="facebook.pcap", # Desactiva la disección L7 para facilitar la lectura. n_dissections=0, análisis_estadístico=True)para flujo en my_streamer:print(flujo)
# Consulte la documentación para conocer la descripción detallada de cada característica.# 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, protocolo=6, ip_version=4, vlan_id=0, túnel_id=0, bidireccional_first_seen_ms=1472393122365, bidireccional_last_seen_ms=1472393123665, bidireccional_duration_ms=1300, bidireccional_packets=19, bidireccional_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, bidireccional_min_ps=66, bidireccional_mean_ps=302.36842105263156, bidireccional_stddev_ps=425.53315715259754, bidireccional_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, bidireccional_min_piat_ms=0, bidireccional_mean_piat_ms=72.22222222222223, bidireccional_stddev_piat_ms=137.34994188549086, bidireccional_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, bidireccional_syn_packets=2, bidireccional_cwr_packets=0, bidireccional_ece_packets=0, bidireccional_urg_packets=0, bidireccional_ack_packets=18, bidireccional_psh_packets=9, bidireccional_rst_packets=0, bidireccional_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 realiza una extracción temprana de características estadísticas de flujo (hasta 255 paquetes) (denominado análisis SPLT en la literatura). Se resume como una secuencia de las direcciones, tamaños y tiempos entre llegadas de estos paquetes.
from nfstream import NFStreamermy_streamer = NFStreamer(source="facebook.pcap", # Desactivamos la disección l7 para facilitar la lectura. n_dissections=0, splt_analysis=10)para el flujo en my_streamer:print(flow)
# Consulte la documentación para conocer la descripción detallada de cada característica.# 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, protocolo=6, ip_version=4, vlan_id=0, túnel_id=0, bidireccional_first_seen_ms=1472393122365, bidireccional_last_seen_ms=1472393123665, bidireccional_duration_ms=1300, bidireccional_packets=19, bidireccional_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, # La secuencia de los 10 primeros paquetes en dirección, tamaño y tiempo entre llegadas. 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 admite de forma nativa Pandas como interfaz de exportación.
# Consulte la documentación para obtener más detalles.# 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", "protocolo","bidireccional_paquetes","bidireccional_bytes","nombre_aplicación"]]my_dataframe.head(5)
NFStream admite de forma nativa el formato de archivo CSV como interfaz de exportación.
# Consulte la documentación para obtener más detalles.# https://www.nfstream.org/docs/api#csv-file-conversionflows_count = NFStreamer(source='facebook.pcap').to_csv(path=None,columns_to_anonymize=(), flujos_por_archivo=0,rotar_archivos=0)
¿No encontraste una característica de flujo específica? agregue un complemento a NFStream en unas pocas líneas:
from nfstream import NFPluginclass MyCustomPktSizeFeature(NFPlugin):def on_init(self, paquete, flujo):# creación de flujo con el primer paqueteif paquete.raw_size == self.custom_size:flow.udps.packet_with_custom_size = 1else:flow.udps.packet_with_custom_size = 0 def on_update(self, paquete, flujo):# actualización del flujo con cada paquete que pertenece al flujo if paquete.raw_size == self.custom_size:flow.udps.packet_with_custom_size += 1extended_streamer = NFStreamer(source='facebook.pcap', udps=MyCustomPktSizeFeature(custom_size=555))para flujo en extended_streamer:# vea su métrica creada dinámicamente en flujos generadosprint(flow.udps.packet_with_custom_size)
El siguiente ejemplo simplista demuestra cómo entrenar e implementar un enfoque de aprendizaje automático para la categorización del flujo de tráfico. Queremos ejecutar una clasificación de flujos de categorías de redes sociales basada en paquetes_bidireccionales y bytes_bidireccionales como características de entrada. En aras de la brevedad, decidimos predecir solo en la etapa de vencimiento del flujo.
from nfstream import NFPlugin, NFStreamerimport numpyfrom sklearn.ensemble import RandomForestClassifierdf = NFStreamer(source="training_traffic.pcap").to_pandas()X = df[["bidireccional_packets", "bidireccional_bytes"]]y = df["application_category_name"]. aplicar (lambda x: 1 si 'Red social' en x más 0)modelo = RandomForestClassifier()model.fit(X, y)
clase ModelPrediction(NFPlugin):def on_init(self, paquete, flujo):flow.udps.model_prediction = 0def on_expire(self, flujo):# Puede hacer lo mismo en el punto de entrada on_update y forzar la caducidad con una identificación personalizada. to_predict = numpy.array([flow.bidireccional_packets, flow.bidireccional_bytes]).reshape((1,-1))flow.udps.model_prediction = self.my_model.predict(to_predict)ml_streamer = NFStreamer(source="eth0", udps=ModelPrediction(my_model=model))para el flujo en ml_streamer:imprimir(flow.udps.model_prediction)
Se proporcionan más ejemplos y detalles de NFPlugin en la documentación oficial. También puede probar NFStream sin instalación utilizando nuestro cuaderno de demostración en vivo .
Para compilar NFStream a partir de fuentes, lea la guía de instalación proporcionada en la documentación oficial.
Lea Contribuir para obtener detalles sobre nuestro código de conducta y el proceso para enviarnos solicitudes de extracción.
NFStream está destinado a la investigación forense y de datos de redes. Los investigadores y científicos de datos de redes pueden utilizar este marco para crear conjuntos de datos confiables y entrenar y evaluar modelos de aprendizaje automático aplicados en la red. Como ocurre con cualquier herramienta de monitoreo de paquetes, NFStream podría usarse indebidamente. No lo ejecute en ninguna red que no sea de su propiedad o que no administre .
El artículo de NFStream se publica en Computer Networks (COMNET) . Si utiliza NFStream en una publicación científica, le agradeceríamos que citara el siguiente artículo:
@artículo{AOUINI2022108719, título = {NFStream: un marco flexible de análisis de datos de red}, autor = {Aouini, Zied y Pekar, Adrian}, doi = {10.1016/j.comnet.2021.108719}, issn = {1389-1286}, diario = {Redes de computadoras}, páginas = {108719}, año = {2022}, editor = {Elsevier}, volumen = {204}, URL = {https://www.sciencedirect.com/science/article/pii/S1389128621005739} }
Las siguientes personas contribuyeron a NFStream:
Zied Aouini : creador y desarrollador principal.
Adrian Pekar : Generación y almacenamiento de conjuntos de datos.
Romain Picard : implementación de los complementos MDNS y DHCP.
Radion Bikmukhamedov : Trabajo inicial sobre el análisis SPLT NFPlugin.
Las siguientes organizaciones apoyaron a NFStream:
SoftAtHome : Partidario del desarrollo de NFStream.
Universidad Técnica de Košice : Hardware e infraestructura para la generación y almacenamiento de conjuntos de datos.
ntop : Soporte técnico de integración nDPI .
El Proyecto Nmap : Soporte técnico de la integración de Npcap (instalador OEM de NPCAP en Windows CI).
Google OSS Fuzz : soporte continuo de pruebas de fuzzing del proyecto NFStream.
Una arquitectura jerárquica y una estrategia probabilística para la detección colaborativa de intrusiones
Marco de código abierto para Internet cifrado y clasificación de tráfico malicioso
ConFlow: contraste del flujo de red que mejora el aprendizaje desequilibrado de clases en la detección de intrusiones en la red
Aprendizaje continuo para la detección de intrusiones en la red basada en anomalías
Un sistema autoseguro basado en una red definida por software
Robustos codificadores automáticos variacionales y normalización de flujos para la detección de anomalías en la red no supervisada
RADON: codificador automático robusto para la detección de anomalías no supervisadas
Un enfoque genérico de aprendizaje automático para la identificación de dispositivos IoT
Clasificación de dispositivos de red para priorización de alarmas: estudio de caso de detección de intrusiones
Detección de malware basada en flujos de red mediante un enfoque combinado de rastreo y aprendizaje profundo
Detección de intrusiones en la red basada en inteligencia artificial distribuida confiable
Marco de transformador generativo para generación y clasificación de tráfico de red
Generadores y clasificadores de tráfico de red multiclase basados en redes neuronales
Uso de la selección de funciones integradas y CNN para la clasificación en CCD-INID-V1, un nuevo conjunto de datos de IoT
Un enfoque basado en redes definidas por el conocimiento para identificar flujos de transmisión de video en redes 5G
Descubrimiento de conocimientos: ¿puede arrojar nueva luz sobre la definición del umbral para la detección de pesos pesados?
Recopilar y analizar el tráfico del nodo de salida de Tor
Análisis y recopilación de datos de la red IP.
Este proyecto tiene la licencia LGPLv3; consulte el archivo de licencia para obtener más detalles.