流的定义
流是一系列通过网络中某一观察点的具备雷同属性的数据包,属性包含
- 端点:流的终点和起点
- 方向:单向或双向
- 工夫粒度:数据包的发送起始工夫和终止工夫
- 协定档次:包含网络各层协定
NetFlow/IPFIX
协定介绍与关系
Netflow
: 于 1996 年由思科公司创造,于同年 5 月注册为美国专利。首先用于网络设备对数据交换进行减速,并同步实现对高速转发的IP
数据流进行测量和统计,通过多年的技术演进,NetFlow
原来用于数据交换减速的性能曾经逐渐由网络设备中的专用ASIC
芯片实现,而对IP
数据流进行测量和统计的性能也已更加成熟,造成了一种专用流替换技术,NetFlow
已集成到大多数厂商的路由器和交换机内成为流量监测的事实标准,广泛应用于网络管理IPFIX
:全称IP Flow Information Export
,即IP
流信息输入,在 2003 年,Netflow V9
被IETF
组织从 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
协定采集,监听 udp
2055 端口收集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
依赖开源我的项目 softflowd
(c
语言我的项目)作为流量探测器,能够探测 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:2055
的collector
-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
流量收集与剖析