Skip to main content

使用nfdump采集存储Netflow数据

·2 mins
Netflow
Table of Contents

在网络运维里, SNMP 通常被用来采集接口流量速率, 除此之外还有一个可以反映接口速率的 feature-Netflow.

但在日常使用的时候, 经常出现 SNMP / Netflow 得到的接口速率出入很大的情况。

SNMP 得到的接口速率是通过 get 一段时间间隔的 ifHCInOctets 和 IfHCOutOctets 两个 OID, 然后除以时间间隔就可以得到接口速率。 这里有一小点需要注意的是, ifHCInOctets 和 IfHCOutOctets OID 拿到的字节包含了数据帧的 FCS (4 字节)。

Netflow 是如何计算一个接口的速率呢, 在为接口配置 ingress/egress 的 netflow 后, netflow 按照采样比记录流字节大小。 这个字节大小不包含 FCS, 也不包含二层帧头 (4+14 = 18 字节) 。另外 netflow 是基于采样比进行采集, 所以其精确度远远比不上 SNMP 拿到的数据。

当 Server 拿到采集的 flow 会根据设备发送的 flow template 进行字段的解析。

alt text

如果你从 server 上抓了一段时间的数据包,比如 5 分钟,如何手动的计算某个接口的 ingress/egress 流量呢?

以 ingress 接口流量为例:

  • Wirshark 将 pcap 转换成 json 格式
  • 使用 grep / awk 命令过滤其中的字段, 如下显示从 inputint 1265 (snmp ifindex)入向 netflow 采集到的 flow(0 代表 ingress,1 代表 egress)
  "cflow.octets": "93976"
  "cflow.inputint": "1265"
  "cflow.direction": "0"
  • 将所有 inputint 和 direction 一样的 flow 对应的 octets 值加起来, 则 Rate = Sum(octets) * 8 * 采样比/抓包时间

在研究 Netflow 计算接口 rate 时候, 我发现了一个开源的工具 nfdump, 可以作为 netflow server, 收集存储和查询 Netflow 数据.

而且, 如果我们在另外一台 netflow server 抓包生成一个 pcap 文件, 我们可以使用使用 tcprewrite 重写包头,并用 tcpreply 重放给 nfdump, 后续就可以通过 nfdump 查询分析采集到的 pcap 文件.

以下是 nfdump 安装使用过程:

安装编译 nfdump 所需要的依赖
#

sudo apt update
sudo apt install -y gcc make autoconf automake libtool pkg-config \
    libbz2-dev liblz4-dev libzstd-dev libpcap-dev \
    libmaxminddb-dev
sudo apt install -y flex bison

下载源码并编译
#

git clone https://github.com/phaag/nfdump
cd nfdump

./autogen.sh
./configure --enable-nfpcapd --enable-maxmind --enable-sflow

make -j$(nproc)
sudo make install

配置动态链接库
#

编译安装后的库文件通常会安装到 /usr/local/lib 下。为确保系统能够找到 nfdump 库,需要配置 ld.so:

sudo find /usr/local -name "libnfdump*.so*"

echo '/usr/local/lib' | sudo tee /etc/ld.so.conf.d/nfdump.conf
echo '/usr/local/lib64' | sudo tee -a /etc/ld.so.conf.d/nfdump.conf

sudo ldconfig

确认库已经被系统识别, 并确认 nfdump 版本

ldconfig -p | grep nfdump
nfdump -V

启动采集服务
#

创建存储目录,并启动监听服务

mkdir /var/log/nfdump/

sudo nfcapd -D -p 2055 -w /var/log/nfdump -s 1000

-     -D:后台运行
-     -p 2055:监听端口
-     -w:写入文件目录
-     -s 1000 采样比

流量查询示例
#

假设采集到的文件为 nfcapd.202510122220,可以用以下命令查看输入接口流量排名:

cd /var/log/nfdump/
nfdump -r nfcapd.202510122220 -s inif -o extended

	-r:读取指定文件
	-s inif:按照输入接口统计
	-o extended:输出详细格式

输出示例:

Date first seen          Duration Proto  In IF  Out IF  Flows(%)  Packets(%)  Bytes(%)    pps   bps   bpp
2025-10-12 22:20:01.123  00:00.120 any   1265   any     1015(100)  539087(100) 745.0 M(100) ...



Comments