ToB企服应用市场:ToB评测及商务社交产业平台

标题: 流量特性提取工具NFStream [打印本页]

作者: 张春    时间: 2024-5-19 19:41
标题: 流量特性提取工具NFStream
目录

前言

之前介绍了关于stratum协议挖矿流量的一些内容,今天来介绍一下一款好用的流量特性提取工具 NFStream,它可以很好的资助我们从更深层次的角度来分析流量特性。
flowcontainer
再介绍NFStream之前,先来介绍一下flowcontainer,它也是基于python开发的一款网络流量基本信息提取库。
flowcontainer默认提取流的:源IP,源端口,目标IP,目标端口,IP包长序列,IP包到达时间序列,流到达时间戳、流结束时间戳、载荷长度序列,载荷到达时间序列。
flowcontainer的安装环境:
python3
numpy>=18.1
系统安装好tshark的最新版本,并将tshark所在的目录添加到系统的环境目录
具体使用文档参考:https://github.com/jmhIcoding/flowcontainer/blob/master/README.md
flowcontainer是一个很好用的库,面临一些流量基本的特性提取是完全够用的,但是想要提取更多维的特性就显得力不从心了,而且不支持深度包检测技能。
下面我就着重介绍一下NFStream这个工具库,NFStream是国外开发的一款基于Python编写的网络流量分析工具,功能更增强盛一些。但国内用的人不多,相关文章也很少。
NFStream

NFStream的主要特点:
安装
  1. pip3 install nfstream # pip3命令安装
  2. git clone https://github.com/aouinizied/nfstream.git #将项目源码克隆至本地
复制代码
NFStreamer

创建一个NFStreamer:
  1. from nfstream import NFStreamer
  2. my_streamer = NFStreamer(source="facebook.pcap", # or network interface
  3.                          decode_tunnels=True,
  4.                          bpf_filter=None,
  5.                          promiscuous_mode=True,
  6.                          snapshot_length=1536,
  7.                          idle_timeout=120,
  8.                          active_timeout=1800,
  9.                          accounting_mode=0,
  10.                          udps=None,
  11.                          n_dissections=20,
  12.                          statistical_analysis=False,
  13.                          splt_analysis=0,
  14.                          n_meters=0,
  15.                          max_nflows=0,
  16.                          performance_report=0,
  17.                          system_visibility_mode=0,
  18.                          system_visibility_poll_ms=100)
  19. # 基本的使用方式就是循环遍历NFStreamer(分组)
  20. for flow in my_streamer:
  21.    print(flow) # or whatever
复制代码
NFStreamer的各个属性及含义
属性(默认)描述source="facebook.pcap"pcap文件路径或网络接口名称decode_tunnels=True开启/关闭GTP/CAPWAP/TZSP隧道解码bpf_filter=None指定一个BPF filter过滤器,用于过滤选定的流量promiscuous_mode=True启用/禁用混杂捕获模式snapshot_length=1536控制包切片大小(截断),以字节为单位idle_timeout=120空闲流(没有收到数据包)凌驾该值(秒)即逾期active_timeout=1800活动时间凌驾该值(秒)的流将逾期accounting_mode=0指定一个模式陈诉字节相关特性(0:链路层,1:IP层,2:传输层,3:有效载荷)udps=None指定用户定义的用于扩展NFStreamer的NFPluginsn_dissections=20要为L7可见性特性分析的每个流分组数,当设置为0时,禁用L7可见性特性statistical_analysis=False启用/禁用事后流统计分析splt_analysis=0指定第一个分组的长度序列,用于早期的统计分析,当设置为0时,禁用splt_analysisn_meters=0指定返回前要捕获的最大流数,当便是0时不设置max_nflows=0指定并行计量过程的数量当,设置为0时,NFStreamer将自动根据运行主机上可用的物理核心对计量举行扩展performance_report=0性能陈诉隔断时间,单位为秒,当设置为0时禁用,忽略离线捕获system_visibility_mode=0通过探测主机来启用系统进程映射system_visibility_poll_ms=100设置系统进程映射特性的轮询隔断,单位为毫秒(0是最大可达速率)NFLow
NFlow是NFStream中的流体现情势。它包罗了根据NFStreamer设置计算的全部流特性。
Nflow核心特性包括:
特性数据类型描述idint流标识符expiration_idint流逾期触发器的标识符,0体现idle_timeout,1体现active_timeout,-1体现自定义逾期src_ipstr源IP地址字符串src_macstr源MAC地址字符串src_ouistr源组织唯一标识符字符串src_portint传输层源端口dst_ipstr目标IP地址字符串dst_macstr目标MAC地址字符串dst_ouistr目标组织唯一标识符字符串dst_portint传输层目标端口protocolint传输层协议ip_versionintIP版本vlan_idint假造局域网标识符bidirectional_first_seen_msint第一个双向分组的时间戳,单位为毫秒bidirectional_last_seen_msint最后一个双向分组的时间戳,单位为毫秒bidirectional_duration_msint双向流持续时间,单位为毫秒bidirectional_packetsint流量双向数据包累加器bidirectional_bytesint双向字节累加器(依赖accounting_mode)src2dst_first_seen_msint第一个src2dst分组上的时间戳,单位为毫秒src2dst_last_seen_msint最后一个src2dst分组上的时间戳,单位为毫秒src2dst_duration_msintsrc2dst持续时间,单位为毫秒src2dst_packetsintsrc2dst数据包累加器src2dst_bytesintsrc2dst字节累加器(取决于accounting_mode)dst2src_first_seen_msint第一个dst2src分组上的时间戳,单位为毫秒dst2src_last_seen_msint最后一个dst2src分组上的时间戳,单位为毫秒dst2src_duration_msintdst2src持续时间,单位为毫秒dst2src_packetsintdst2src数据包累加器dst2src_bytesintdst2src字节累加器(取决于accounting_mode)还有一些其他特性值包括:
详细参考:https://www.nfstream.org/docs/api
Pandas Dataframe转换

NFStream原生支持Pandas作为导出接口:
  1. my_dataframe = my_streamer.to_pandas(columns_to_anonymize=[])
复制代码
参数:columns_to_anonymize 要匿名的列名列表 (一般不消)
示例:
  1. from nfstream import NFStreamer
  2. my_dataframe = NFStreamer(source=path_pcap).to_pandas()[["src_ip",  # 需要导出的特征列表
  3.                                                          "src_port",
  4.                                                          "dst_ip",
  5.                                                          "dst_port",
  6.                                                          "protocol",
  7.                                                          "bidirectional_packets",
  8.                                                          "bidirectional_bytes",
  9.                                                          "application_name"]]
  10. my_dataframe.head(5)
复制代码

CSV文件转换

NFStream原生支持CSV文件格式作为导出接口:
  1. total_flows_count = my_streamer.to_csv(path=None, columns_to_anonymize=[], flows_per_file=0, rotate_files=0)
复制代码
参数:
示例:

默认输出文件,是再原pcap文件名后面加上.csv, 如a.pacp.csv

NFStream特性提取

NFStream相比于flowcontainer的几大优点:
事后统计流特性提取

只需在NFStreamer函数参数设置 statistical_analysis=True即可开启事后统计流特性提取。
示例:
  1. from nfstream import NFStreamer
  2. my_streamer = NFStreamer(source=pcap,
  3.                          n_dissections=0,  # 第 7 层数据不可见
  4.                          statistical_analysis=True)
  5. for flow in my_streamer:
  6.     print(flow)
复制代码

NFStream支持48个事后流统计特性提取:
  1.       bidirectional_min_ps=84,
  2.       bidirectional_mean_ps=92.0,
  3.       bidirectional_stddev_ps=11.313708498984761,
  4.       bidirectional_max_ps=100,
  5.       src2dst_min_ps=84,
  6.       src2dst_mean_ps=84.0,
  7.       src2dst_stddev_ps=0.0,
  8.       src2dst_max_ps=84,
  9.       dst2src_min_ps=100,
  10.       dst2src_mean_ps=100.0,
  11.       dst2src_stddev_ps=0.0,
  12.       dst2src_max_ps=100,
  13.       bidirectional_min_piat_ms=0,
  14.       bidirectional_mean_piat_ms=0.0,
  15.       bidirectional_stddev_piat_ms=0.0,
  16.       bidirectional_max_piat_ms=0,
  17.       src2dst_min_piat_ms=0,
  18.       src2dst_mean_piat_ms=0.0,
  19.       src2dst_stddev_piat_ms=0.0,
  20.       src2dst_max_piat_ms=0,
  21.       dst2src_min_piat_ms=0,
  22.       dst2src_mean_piat_ms=0.0,
  23.       dst2src_stddev_piat_ms=0.0,
  24.       dst2src_max_piat_ms=0,
  25.       bidirectional_syn_packets=0,
  26.       bidirectional_cwr_packets=0,
  27.       bidirectional_ece_packets=0,
  28.       bidirectional_urg_packets=0,
  29.       bidirectional_ack_packets=0,
  30.       bidirectional_psh_packets=0,
  31.       bidirectional_rst_packets=0,
  32.       bidirectional_fin_packets=0,
  33.       src2dst_syn_packets=0,
  34.       src2dst_cwr_packets=0,
  35.       src2dst_ece_packets=0,
  36.       src2dst_urg_packets=0,
  37.       src2dst_ack_packets=0,
  38.       src2dst_psh_packets=0,
  39.       src2dst_rst_packets=0,
  40.       src2dst_fin_packets=0,
  41.       dst2src_syn_packets=0,
  42.       dst2src_cwr_packets=0,
  43.       dst2src_ece_packets=0,
  44.       dst2src_urg_packets=0,
  45.       dst2src_ack_packets=0,
  46.       dst2src_psh_packets=0,
  47.       dst2src_rst_packets=0,
  48.       dst2src_fin_packets=0
复制代码
事后流统计特性主要包括:TCP标志位分析,数据包大小和每个方向的到达隔断时间的最小、均值、最大值和标准差。
字段详细信息参照官方API文档:https://www.nfstream.org/docs/api
早期统计流特性提取

在NFStreamer函数参数设置 splt_analysis=N(N>0)即可开启早期统计流特性提取。
示例:
  1. from nfstream import NFStreamer
  2. my_streamer = NFStreamer(source=pcap,
  3.                          n_dissections=0,  # 第 7 层数据不可见
  4.                          splt_analysis=10)
  5. for flow in my_streamer:
  6.     print(flow)
复制代码

这个早期统计流特性提取,和Wireshark的流追踪功能类似,针对同一个TCP会话的数据流方向,数据包大小,到达时间隔断举行了统计。最多统计255个包,当 N>255 时步调报错。
这三个列表的列表长度均为N(splt_analysis=N):
应用层可见性特性提取

在NFStreamer函数中设置 n_dissection>0即可开启7层可见性特性。
示例:
  1. from nfstream import NFStreamer
  2. my_streamer = NFStreamer(source=pcap, n_dissections=20)
  3. for flow in my_streamer:
  4.     print(flow)
复制代码

支持9个7层可见性特性:
  1. application_name=SSH,  # 应用程序名称
  2. application_category_name=RemoteAccess,  # 应用类别名称
  3. application_is_guessed=1,  # 表示检测结果是基于纯解析还是基于猜测启发式
  4. application_confidence=1,  # 底层检测方法(O:未知分类,1:仅通过4层端口得到的分类,3:基于部分/不完全DPI信息的分类结果,4:基于部分/不完全DPI信息的LRU缓存的分类结果,5:基于部分LRU缓存的分类结果(即会话之间的相关性),6:深度包检测)
  5. requested_server_name=,  # 请求的服务器名称(SSL/TLS、DNS、HTTP)
  6. client_fingerprint=,  # 客户端指纹
  7. server_fingerprint=,  # 服务器指纹
  8. user_agent=,  # 提取的用户代理为HTTP或用户代理标识符为QUIC
  9. content_type=  # 提取的HTTP内容类型
复制代码
深度数据包检测引擎基于nDPI实现,支持这几种应用:TLS, QUIC, TOR, HTTP, SSH, DNS
系统的可见性

在NFStreamer函数参数设置 system_visibility_mode=1即可开启系统的可见性。
  1. from nfstream import NFStreamer
  2. my_streamer = NFStreamer(source=pcap,
  3.                          n_dissections=0,  # 第 7 层数据不可见
  4.                          splt_analysis=10)
  5. for flow in my_streamer:
  6.     print(flow)
复制代码
开启以后可以获取关于这个分组的通信进程的信息,包括进程名称(process_name)和进程ID(process_pid)。

我本地运行步调运行报错。
还有一个隧道解码特性,个人感觉用处也不大。
NFPlugin扩展
NFPlugin不外多介绍了,前面介绍的内容在绝大数情况下都充足使用了。
NFPlugin是扩展NFStream的主要类,可以创建一组新的NFlow特性,可以来满足自定义需求。在使用之前需要导入NFPlugin模块 from nfstream import NFPlugin
关于更多关于NFPlugin更多内容,参照官方文档:https://www.nfstream.org/docs/api
*本文的大部分内容来自官方文档的英文机翻,如有不准确的部分请谅解。
参考文章:
https://pypi.org/project/nfstream/
https://github.com/nfstream/nfstream/blob/master/examples/flow_printer.py
https://github.com/jmhIcoding/flowcontainer/blob/master/README.md
若有错误,欢迎指正!o( ̄▽ ̄)ブ

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4