在网络运维里, 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 进行字段的解析。
如果你从 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) ...