乐趣区

关于网络传输协议:网络流协议Netflow与IPFIX详解与使用采集

流的定义

流是一系列通过网络中某一观察点的具备雷同属性的数据包,属性包含

  • 端点:流的终点和起点
  • 方向:单向或双向
  • 工夫粒度:数据包的发送起始工夫和终止工夫
  • 协定档次:包含网络各层协定

NetFlow/IPFIX协定介绍与关系

  • Netflow: 于 1996 年由思科公司创造,于同年 5 月注册为美国专利。首先用于网络设备对数据交换进行减速,并同步实现对高速转发的 IP 数据流进行测量和统计,通过多年的技术演进,NetFlow原来用于数据交换减速的性能曾经逐渐由网络设备中的专用 ASIC 芯片实现,而对IP 数据流进行测量和统计的性能也已更加成熟,造成了一种专用流替换技术,NetFlow已集成到大多数厂商的路由器和交换机内成为流量监测的事实标准,广泛应用于网络管理
  • IPFIX:全称 IP Flow Information Export,即IP 流信息输入,在 2003 年,Netflow V9IETF 组织从 5 个候选计划中确定为 IPFIX规范,作为 IP 网络中的流信息测量的标准协议,是网络流量监测的国际标准,是一种针对数据流特征分析、基于模板的格局输入的协定,因而具备很强的可扩展性

协定毛病

  • netflow:

    • 耗费路由器的 CPU 和存储资源,对设施的转发性能有影响
    • 流记录的数据量依然很大,非独立设施,解决能力有余,因而,个别采纳 100~1000:1 采样比,监测粒度较粗,损失流量
      的细节信息
    • 设施自身提供的数据内容有局限性,策略和定制能力绝对较差。NetFlow性能集成在设施内,软件实现性能差、硬件实现灵活性差,对于大量已部署运行的路由器降级板卡费用高
    • NetFlow业务和利用辨认次要依赖于 TCP/UDP 端口号,无奈辨认突飞猛进的业务

协定零碎组成

  • Exporter/ 探测器:用于监听网络数据
  • Collector/ 采集器:用于收集从 Exporter 输入的网络数据
  • Analysis/ 剖析报告零碎:用于剖析从 Collector 收集到的网络数据,并产生报告

netflow数据字段

数据流

  • IP
  • 目标IP
  • 协定
  • 端口

流量统计数据

  • 数据流时戳
  • IP 地址
  • 目标 IP 地址
  • 源端口号
  • 目标端口号
  • 输出接口号和输入接口号
  • 下一跳 IP 地址
  • 信息流中的总字节数
  • 信息流中的数据包数量
  • 信息流中的第一个和最初一个数据包时戳 源 AS 和目标 AS
  • 前置掩码
  • 数据包序号

IPFIX数据字段

为了较完整的输入数据,IPFIX 缺省应用网络设备的七个要害域来示意每股网络流量,如果不同的 IP 报文中所有的七个要害域都匹配,那么这些 IP 报文都将被视为属于同一股流量

通过记录网络中这些流量的特色,如流量持续时间、流量中报文均匀长度等,咱们能够理解到以后网络的利用状况,并依据这些信息对网络进行优化,平安检测,流量计费

  • IP 地址
  • 目标IP 地址
  • TCP/UDP 源端口
  • TCP/UDP 目标端口
  • 三层协定类型
  • 服务类型 Type-of-service 字节
  • 输出逻辑接口

协定收集器collector

依赖开源我的项目 goflow2(golang 我的项目)

https://github.com/netsampler/goflow2

构建

$ git clone https://github.com/netsampler/goflow2.git
$ cd goflow2
$ make build

会产生一个 dist 文件夹,外面蕴含一个可执行文件dist/goflow2- 版本 -git-commit- 架构

把可执行文件重命名为goflow2

执行监听,能够看到该程序同时反对 netflow/sflow 协定采集,监听 udp2055 端口收集netflow 协定数据包,放弃这个终端不敞开,接下去开始执行协定探测程序

$ ./dist/goflow2 
INFO[0000] starting GoFlow2                             
INFO[0000] starting collection                           count=1 hostname= port=6343 scheme=sflow
INFO[0000] starting collection                           count=1 hostname= port=2055 scheme=netflow

协定探测exporter

依赖开源我的项目 softflowdc 语言我的项目)作为流量探测器,能够探测 linux 主机物理网口的网卡流量信息,并且依照 netflow/ipfix 协定定义封装流量包发送到指定的采集器

https://github.com/irino/softflowd

构建,如下操作会生成可执行文件softflowd

$ git clone https://github.com/irino/softflowd.git
$ cd softflowd
$ autoreconf -if
$ ./configure
$ make

装置到/usr/bin(这一步能够省略)

$ sudo make install

执行 netflow 采集

$ sudo ./softflowd -v 5 -i enp3s0 -t maxlife=1 -n 127.0.0.1:2055 -P udp -D
# 或者
$ sudo ./softflowd -v 9 -i enp3s0 -t maxlife=1 -n 127.0.0.1:2055 -P udp -D

执行 ipfix 采集

$ sudo ./softflowd -v 10 -i enp3s0 -t maxlife=1 -n 127.0.0.1:2055 -P udp -D

参数解释

  • -v:示意发送 netflow 协定版本号,个别是 5/9 版本,根据 ./softflowd --help 输入信息,如下示意,当版本是 10 的时候,会探测并封装为 ipfix

      -v 1|5|9|10|psamp       NetFlow export packet version
                              10 means IPFIX and psamp means PSAMP (packet sampling)
  • -i enp3s0: 示意探测以后主机网口 enp3s0 的网卡流量,主机网卡能够通过 ip a 命令获取
  • -t maxlife=3: 示意每 3 秒发送一次 netflow 流包,目前 softflowd 1.1.0 版本 help 命令输入参数是 -t timeout=time Specify named timeout,前期如果maxlife 有效,能够尝试批改为-t timeout=1
  • -n 127.0.0.1:2055:示意把探测到的流量数据封装并发送给目标地址为 127.0.0.1:2055collector
  • -P udp: 指定发送给 exporter 的传输层协定类型,个别是udp
  • -D: debug模式,放弃前端运行并输入日志信息

exporter程序打印数据

softflowd-v参数变动时,goflow2 exporter监听程序打印输出的数据会动静输入不同的类型

-v 5

{
  "type": "NETFLOW_V5",
  "time_received_ns": 0,
  "sequence_num": 4,
  "sampling_rate": 0,
  "sampler_address": "127.0.0.1",
  "time_flow_start_ns": 1692162613180684000,
  "time_flow_end_ns": 1692166704180684000,
  "bytes": 642,
  "packets": 6,
  "src_addr": "10.30.2.174",
  "dst_addr": "239.192.152.143",
  "etype": "IPv4",
  "proto": "UDP",
  "src_port": 7000,
  "dst_port": 7000,
  "in_if": 0,
  "out_if": 0,
  "src_mac": "00:00:00:00:00:00",
  "dst_mac": "00:00:00:00:00:00",
  "src_vlan": 0,
  "dst_vlan": 0,
  "vlan_id": 0,
  "ip_tos": 0,
  "forwarding_status": 0,
  "ip_ttl": 0,
  "tcp_flags": 0,
  "icmp_type": 0,
  "icmp_code": 0,
  "ipv6_flow_label": 0,
  "fragment_id": 0,
  "fragment_offset": 0,
  "src_as": 0,
  "dst_as": 0,
  "next_hop": "0.0.0.0",
  "next_hop_as": 0,
  "src_net": "0.0.0.0/0",
  "dst_net": "0.0.0.0/0",
  "bgp_next_hop": "","bgp_communities": [],"as_path": [],"mpls_ttl": [],"mpls_label": [],"mpls_ip": [],"observation_domain_id": 0,"observation_point_id": 0}

-v 9

{
  "type": "NETFLOW_V9",
  "time_received_ns": 1692168027637104030,
  "sequence_num": 1,
  "sampling_rate": 0,
  "sampler_address": "127.0.0.1",
  "time_flow_start_ns": 1692162288000000000,
  "time_flow_end_ns": 1692167289000000000,
  "bytes": 276,
  "packets": 6,
  "src_addr": "10.30.7.161",
  "dst_addr": "224.0.0.18",
  "etype": "IPv4",
  "proto": "","src_port": 0,"dst_port": 0,"in_if": 0,"out_if": 0,"src_mac":"00:00:00:00:00:00","dst_mac":"00:00:00:00:00:00","src_vlan": 0,"dst_vlan": 0,"vlan_id": 0,"ip_tos": 192,"forwarding_status": 0,"ip_ttl": 0,"tcp_flags": 0,"icmp_type": 0,"icmp_code": 0,"ipv6_flow_label": 0,"fragment_id": 0,"fragment_offset": 0,"src_as": 0,"dst_as": 0,"next_hop":"",
  "next_hop_as": 0,
  "src_net": "0.0.0.0/0",
  "dst_net": "0.0.0.0/0",
  "bgp_next_hop": "","bgp_communities": [],"as_path": [],"mpls_ttl": [],"mpls_label": [],"mpls_ip": [],"observation_domain_id": 0,"observation_point_id": 0}

-v 10

{
  "type": "IPFIX",
  "time_received_ns": 1692168053184893251,
  "sequence_num": 25,
  "sampling_rate": 0,
  "sampler_address": "127.0.0.1",
  "time_flow_start_ns": 1692168053000000000,
  "time_flow_end_ns": 1692168053000000000,
  "bytes": 68,
  "packets": 1,
  "src_addr": "10.30.6.69",
  "dst_addr": "255.255.255.255",
  "etype": "IPv4",
  "proto": "UDP",
  "src_port": 40408,
  "dst_port": 60006,
  "in_if": 0,
  "out_if": 0,
  "src_mac": "00:00:00:00:00:00",
  "dst_mac": "00:00:00:00:00:00",
  "src_vlan": 0,
  "dst_vlan": 0,
  "vlan_id": 0,
  "ip_tos": 0,
  "forwarding_status": 0,
  "ip_ttl": 0,
  "tcp_flags": 0,
  "icmp_type": 0,
  "icmp_code": 0,
  "ipv6_flow_label": 0,
  "fragment_id": 0,
  "fragment_offset": 0,
  "src_as": 0,
  "dst_as": 0,
  "next_hop": "","next_hop_as": 0,"src_net":"0.0.0.0/0","dst_net":"0.0.0.0/0","bgp_next_hop":"",
  "bgp_communities": [],
  "as_path": [],
  "mpls_ttl": [],
  "mpls_label": [],
  "mpls_ip": [],
  "observation_domain_id": 0,
  "observation_point_id": 0
}

浏览参考

Linux主机装置 NetFlow 采集器并应用 Graylog 进行网络流量剖析

Netflow/IPFIX 流量收集与剖析

退出移动版