NFStream é uma estrutura Python multiplataforma que fornece estruturas de dados rápidas, flexíveis e expressivas, projetadas para tornar o trabalho com dados de rede online ou offline fácil e intuitivo. Seu objetivo é ser o alicerce fundamental de alto nível do Python para fazer análises práticas e reais de dados de fluxo de rede. Além disso, tem o objetivo mais amplo de se tornar uma estrutura unificadora de análise de dados de rede para pesquisadores, fornecendo reprodutibilidade de dados em experimentos.
Caderno ao vivo | |
Site do projeto | |
Canal de discussão | |
Último lançamento | |
Versões suportadas | |
Licença do Projeto | |
Integração Contínua | |
Qualidade do código |
Principais recursos
Como conseguir isso?
Como usar?
Treinando o modelo
Streamer com tecnologia ML no tráfego ao vivo
Identificação criptografada de aplicativos e extração de metadados
Visibilidade do sistema
Extração de características de fluxo estatístico post-mortem
Extração inicial de recursos de fluxo estatístico
Interface de exportação do Pandas
Interface de exportação CSV
Estendendo o NFStream
Treinamento e implantação de modelos de aprendizado de máquina
Construindo a partir de fontes
Contribuindo
Ética
Créditos
Citação
Autores
Organizações de apoio
Publicações que usam NFStream
Licença
Desempenho: NFStream foi projetado para ser rápido: AF_PACKET_V3/FANOUT no Linux, multiprocessamento, mecanismo de computação nativo baseado em CFFI e suporte completo a PyPy .
Visibilidade criptografada da camada 7: a inspeção profunda de pacotes NFStream é baseada em nDPI . Ele permite que o NFStream execute identificação confiável de aplicativos criptografados e impressão digital de metadados (por exemplo, TLS, SSH, DHCP, HTTP).
Visibilidade do sistema: o NFStream investiga o kernel do sistema monitorado para obter informações sobre soquetes abertos da Internet e coleta informações garantidas (nome do processo, PID, etc.) no nível do aplicativo.
Extração de recursos estatísticos: NFStream fornece o que há de mais moderno em extração de recursos estatísticos baseada em fluxo. Inclui recursos estatísticos post-mortem (por exemplo, mínimo, média, desvio padrão e máximo de tamanho de pacote e tempo entre chegadas) e recursos de fluxo antecipado (por exemplo, sequência dos primeiros n tamanhos de pacotes, tempos entre chegadas e direções).
Flexibilidade: NFStream é facilmente extensível usando NFPlugins . Ele permite a criação de um novo recurso de fluxo em poucas linhas de Python.
Orientado para aprendizado de máquina: o NFStream visa tornar as abordagens de aprendizado de máquina para gerenciamento de tráfego de rede reproduzíveis e implantáveis. Ao usar o NFStream como uma estrutura comum, os pesquisadores garantem que os modelos sejam treinados usando a mesma lógica de computação de recursos e, portanto, uma comparação justa é possível. Além disso, modelos treinados podem ser implantados e avaliados em redes ativas usando NFPlugins .
Instaladores binários para a versão mais recente estão disponíveis no Pypi.
pip instalar nfstream
Notas do Windows : O NFStream não inclui drivers de captura no Windows (restrições de licença). É necessário instalar os drivers Npcap antes de instalar o NFStream. Se o Wireshark já estiver instalado no Windows, os drivers Npcap já estão instalados e você não precisa realizar nenhuma ação adicional.
Lidando com um grande arquivo pcap e deseja agregar em fluxos de rede rotulados? O NFStream facilita esse caminho em algumas linhas:
from nfstream import NFStreamer# Exibimos todos os parâmetros do streamer com seus valores padrão.# Consulte a documentação para obter informações detalhadas sobre cada parâmetro.# https://www.nfstream.org/docs/api#nfstreamermy_streamer = NFStreamer(source="facebook.pcap ", # ou interface de rede ativa decode_tunnels=True, bpf_filter=None, promiscuous_mode=True, snapshot_length=1536, idle_timeout = 120, active_timeout = 1800, contabilidade_mode = 0, udps = Nenhum, n_dissections = 20, estatística_análise = Falso, splt_análise = 0, n_meters = 0, max_nflows = 0, performance_report = 0, system_visibility_mode = 0, system_visibility_poll_ms = 100) for flow in my_streamer:print(flow) # imprime.
# Consulte a documentação para a descrição detalhada de cada recurso.# 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, bidirecional_first_seen_ms=1472393122365, bidirecional_last_seen_ms=1472393123665, bidirecional_duration_ms=1300, bidirecional_packets=19, bidirecional_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='Rede Social', application_is_guessed=0, application_confidence=4, request_server_name='facebook.com', client_fingerprint='bfcc1a3891601edb4f137ab7ab25b840', server_fingerprint='2d1eb5817ece335c24904f516ad5da12', user_agent='', content_type='')
O NFStream investiga o kernel do sistema monitorado para obter informações sobre soquetes abertos da Internet e coleta informações garantidas (nome do processo, PID, etc.) no nível do aplicativo.
from nfstream import NFStreamermy_streamer = NFStreamer(source="Intel(R) Wi-Fi 6 AX200 160MHz", # Modo de captura ao vivo. # Desative a dissecção L7 apenas para fins de legibilidade. n_dissections=0, system_visibility_poll_ms=100, system_visibility_mode=1) for flow in my_streamer:print(flow) # imprime.
# Consulte a documentação para a descrição detalhada de cada recurso.# 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, bidirecional_first_seen_ms=1638966705265, bidirecional_last_seen_ms=1638966706999, bidirecional_duration_ms=1734, bidirecional_packets=98, bidirecional_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, # O processo que gerou este fluxo relatado system_process_pid=14596, system_process_name='FortniteClient-Win64-Shipping.exe')
O NFStream executa 48 extração de recursos estatísticos de fluxo post-mortem, que inclui análise detalhada de sinalizadores TCP, mínimo, média, máximo e desvio padrão do tamanho do pacote e do tempo entre chegadas em cada direção.
from nfstream import NFStreamermy_streamer = NFStreamer(source="facebook.pcap", # Desative a dissecção L7 para fins de legibilidade. n_dissections=0, estatística_análise=True)para fluxo em my_streamer:print(fluxo)
# Consulte a documentação para a descrição detalhada de cada recurso.# 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, bidirecional_first_seen_ms=1472393122365, bidirecional_last_seen_ms=1472393123665, bidirecional_duration_ms=1300, bidirecional_packets=19, bidirecional_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, bidirecional_min_ps=66, bidirecional_mean_ps=302.36842105263156, bidirecional_stddev_ps=425.53315715259754, bidirecional_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, bidirecional_min_piat_ms = 0, bidirecional_mean_piat_ms = 72,22222222222223, bidirecional_stddev_piat_ms = 137,34994188549086, bidirecional_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, bidirecional_syn_packets=2, bidirecional_cwr_packets=0, bidirecional_ece_packets=0, bidirecional_urg_packets=0, bidirecional_ack_packets=18, bidirecional_psh_packets=9, bidirecional_rst_packets=0, bidirecional_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)
O NFStream realiza a extração antecipada de recursos estatísticos de fluxo (até 255 pacotes) (referida como análise SPLT na literatura). Ele é resumido como uma sequência de direções, tamanhos e tempos entre chegadas desses pacotes.
from nfstream import NFStreamermy_streamer = NFStreamer(source="facebook.pcap", # Desativamos a dissecção l7 para fins de legibilidade. n_dissections=0, splt_análise=10)para fluxo em my_streamer:print(flow)
# Consulte a documentação para a descrição detalhada de cada recurso.# 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, bidirecional_first_seen_ms=1472393122365, bidirecional_last_seen_ms=1472393123665, bidirecional_duration_ms=1300, bidirecional_packets=19, bidirecional_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, # A sequência dos 10 primeiros pacotes, direção, tamanho e tempo de chegada entre eles. 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 oferece suporte nativo ao Pandas como interface de exportação.
# Consulte a documentação para obter mais detalhes.# 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","pacotes_bidirecionais","bytes_bidirecionais","nome_aplicativo"]]meu_dataframe.head(5)
O NFStream oferece suporte nativo ao formato de arquivo CSV como interface de exportação.
# Consulte a documentação para obter mais detalhes.# https://www.nfstream.org/docs/api#csv-file-conversionflows_count = NFStreamer(source='facebook.pcap').to_csv(path=None,columns_to_anonymize=(), fluxos_per_file=0,rotate_files=0)
Não encontrou um recurso de fluxo específico? adicione um plugin ao NFStream em algumas linhas:
from nfstream import NFPluginclass MyCustomPktSizeFeature(NFPlugin):def on_init(self, packet, flow):# criação de fluxo com o primeiro pacoteif 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):# atualização de fluxo com cada pacote pertencente ao fluxo if packet.raw_size == self.custom_size:flow.udps.packet_with_custom_size += 1extended_streamer = NFStreamer(source='facebook.pcap', udps=MyCustomPktSizeFeature(custom_size=555))para fluxo em Extended_streamer:# veja sua métrica criada dinamicamente em fluxos geradosprint(flow.udps.packet_with_custom_size)
O exemplo simplista a seguir demonstra como treinar e implantar uma abordagem de aprendizado de máquina para categorização de fluxo de tráfego. Queremos executar uma classificação de fluxos de categorias de redes sociais com base em bidirecional_packets e bidirecional_bytes como recursos de entrada. Por uma questão de brevidade, decidimos prever apenas na fase de expiração do fluxo.
de nfstream import NFPlugin, NFStreamerimport numpyfrom sklearn.ensemble import RandomForestClassifierdf = NFStreamer(source="training_traffic.pcap").to_pandas()X = df[["bidirecional_packets", "bidirecional_bytes"]]y = df["application_category_name"]. apply(lambda x: 1 se 'Rede Social' em x senão 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):# Você pode fazer o mesmo no ponto de entrada on_update e forçar a expiração com um ID personalizado. to_predict = numpy.array([flow.bidirecional_packets, flow.bidirecional_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 fluxo em ml_streamer:print(flow.udps.model_prediction)
Mais exemplos e detalhes do NFPlugin são fornecidos na documentação oficial. Você também pode testar o NFStream sem instalação usando nosso notebook de demonstração ao vivo .
Para construir o NFStream a partir dos fontes, leia o guia de instalação fornecido na documentação oficial.
Leia Contribuindo para obter detalhes sobre nosso código de conduta e o processo de envio de pull requests para nós.
O NFStream é destinado à pesquisa forense e de dados de rede. Pesquisadores e cientistas de dados de rede podem usar essa estrutura para construir conjuntos de dados confiáveis e treinar e avaliar modelos de aprendizado de máquina aplicados em rede. Como acontece com qualquer ferramenta de monitoramento de pacotes, o NFStream pode ser mal utilizado. Não o execute em nenhuma rede que não seja de sua propriedade ou administração .
O artigo NFStream é publicado em Computer Networks (COMNET) . Se você usar o NFStream em uma publicação científica, agradeceríamos citações do seguinte artigo:
@artigo{AOUINI2022108719, title = {NFStream: uma estrutura flexível de análise de dados de rede}, autor = {Aouini, Zied e Pekar, Adrian}, doi = {10.1016/j.comnet.2021.108719}, issn = {1389-1286}, diário = {Redes de Computadores}, páginas = {108719}, ano = {2022}, editora = {Elsevier}, volume = {204}, url = {https://www.sciencedirect.com/science/article/pii/S1389128621005739} }
As seguintes pessoas contribuíram para o NFStream:
Zied Aouini : Criador e desenvolvedor principal.
Adrian Pekar : Geração e armazenamento de conjuntos de dados.
Romain Picard : Implementação de plug-ins MDNS e DHCP.
Radion Bikmukhamedov : Trabalho inicial na análise SPLT NFPlugin.
As seguintes organizações apoiaram o NFStream:
SoftAtHome : Apoiador do desenvolvimento NFStream.
Universidade Técnica de Košice : Hardware e infraestrutura para geração e armazenamento de conjuntos de dados.
ntop : Suporte técnico de integração nDPI .
O Projeto Nmap : Suporte técnico de integração Npcap (instalador NPCAP OEM no Windows CI).
Google OSS Fuzz : suporte a testes contínuos de difusão do projeto NFStream.
Uma arquitetura hierárquica e estratégia probabilística para detecção colaborativa de intrusões
Estrutura de código aberto para Internet criptografada e classificação de tráfego malicioso
ConFlow: fluxo de rede de contraste melhorando o aprendizado desequilibrado de classe na detecção de intrusão de rede
Aprendizado contínuo para detecção de intrusão de rede baseada em anomalias
Um sistema autoseguro baseado em rede definida por software
Autoencoders variacionais robustos e fluxos de normalização para detecção de anomalias de rede não supervisionadas
RADON: Autoencoder robusto para detecção de anomalias não supervisionadas
Uma abordagem genérica de aprendizado de máquina para identificação de dispositivos IoT
Classificação de dispositivos de rede para priorização de alarmes: estudo de caso de detecção de intrusão
Detecção de malware baseada em fluxos de rede usando uma abordagem combinada de rastreamento e aprendizado profundo
Detecção de intrusão de rede baseada em inteligência artificial distribuída e confiável
Estrutura de transformador generativo para geração e classificação de tráfego de rede
Geradores e classificadores de tráfego de rede multiclasse baseados em redes neurais
Usando seleção de recursos incorporados e CNN para classificação em CCD-INID-V1, um novo conjunto de dados IoT
Uma abordagem baseada em redes definidas por conhecimento para identificar fluxos de streaming de vídeo em redes 5G
Descoberta de conhecimento: ela pode lançar uma nova luz sobre a definição de limites para detecção de rebatedores pesados?
Coletando e analisando o tráfego do nó de saída do Tor
Análise e Coleta de Dados da Rede IP
Este projeto está licenciado sob a licença LGPLv3 - consulte o arquivo de licença para obter detalhes