3、流量采集技术:NetFlow、sFlow、IPFIX、SNMP协议原理与配置

说到PTN网络的运维,流量采集是绕不开的话题。你想想看,没有数据,你怎么知道网络哪里堵了?哪个业务占带宽?谁在偷偷跑大流量?

我个人习惯把流量采集比作网络的「听诊器」。没有它,你就是在盲修。今天咱们就把NetFlow、sFlow、IPFIX、SNMP这四兄弟掰开揉碎了讲清楚。

3.1 为什么需要多种采集技术?

很多刚入行的朋友会问:一个SNMP不就够了吗?干嘛搞这么多种?

嗯,这里要注意。SNMP是「问」出来的数据,你问一次,设备答一次。但流量是实时的、海量的。你想想看,每秒几百万个报文,你一个个去问?设备早累趴了。

所以,不同的场景需要不同的技术:

  • 想看整体流量趋势 → SNMP(简单、轻量)
  • 想看谁在通信、用了什么协议 → NetFlow / IPFIX(详细、灵活)
  • 想看全量报文采样 → sFlow(采样、高性能)

我在项目中遇到过好几次,客户只部署了SNMP,结果出了故障根本查不出原因。后来加了NetFlow,五分钟就定位到是某台服务器在疯狂发包。

3.2 NetFlow:思科的看家本领

NetFlow最早是思科搞出来的。说白了,它就是把网络流量「打包」成一条条记录。每条记录包含:源IP、目的IP、源端口、目的端口、协议类型、时间戳、字节数等等。

我个人习惯把NetFlow比作「快递单」。每个流就像一单快递,记录了谁寄的、谁收的、寄了什么、多重、什么时候寄的。

3.2.1 NetFlow工作原理

NetFlow的工作流程其实不复杂:

  1. 设备收到报文,检查是否属于已有流。
  2. 如果是新流,创建一条流记录。
  3. 流结束后(或超时),将记录导出到采集器。
  4. 采集器汇总、分析、展示。

这里有个关键点:NetFlow是「有状态」的。设备需要维护一张流表。流表满了怎么办?老流会被强制导出,腾出空间给新流。

我曾经在某个省干网上遇到过,流表设得太小,导致大量流被提前导出,分析出来的数据全是碎片。后来把流表从64K调到256K,问题才解决。

3.2.2 NetFlow配置示例(思科设备)

! 定义流记录
ip flow-record FLOW-RECORD-1
 match ipv4 source address
 match ipv4 destination address
 match ipv4 protocol
 match transport source-port
 match transport destination-port
 collect counter bytes
 collect counter packets
 collect timestamp sys-uptime first
 collect timestamp sys-uptime last

! 定义流导出器
ip flow-exporter EXPORTER-1
 destination 192.168.1.100
 source Loopback0
 transport udp 2055
 template data timeout 60

! 应用流监控
ip flow monitor FLOW-MONITOR-1
 exporter EXPORTER-1
 record FLOW-RECORD-1

interface GigabitEthernet0/1
 ip flow monitor FLOW-MONITOR-1 input
 ip flow monitor FLOW-MONITOR-1 output

这段配置我建议你直接保存下来。每次新开局域网项目,我都是拿这个模板改改就用。

3.3 sFlow:采样为王

NetFlow虽然好,但有个硬伤:它要维护流状态。在超高速链路上(比如100G),设备根本扛不住。

sFlow的思路完全不同。它不做流状态跟踪,而是直接对报文进行「随机采样」。采到哪个算哪个,然后立刻打包发出去。

你想想看,这就像人口普查。NetFlow是挨家挨户登记,sFlow是随机抽几户问问。效率当然高得多。

3.3.1 sFlow的采样机制

sFlow有两种采样方式:

  • 报文采样:每N个报文中采1个。N可以设成1024、2048等。
  • 时间采样:每秒钟采几次。比如每秒采10次。

我个人习惯用报文采样。因为时间采样在高带宽下可能采到重复的报文,反而浪费资源。

我记得有一次帮一个数据中心做流量分析,他们用的是10G链路,NetFlow直接让CPU飙到80%。换成sFlow后,CPU降到5%,数据准确度也够用。

3.3.2 sFlow配置示例(华为设备)

# 使能sFlow
sflow enable

# 配置采样器
sflow sampler SAMPLER-1
 mode random
 packet-interval 1024

# 配置采集器
sflow collector COLLECTOR-1
 ip 192.168.1.200
 port 6343
 source-ip 10.0.0.1

# 接口应用
interface GigabitEthernet0/1/1
 sflow sampler SAMPLER-1 inbound
 sflow sampler SAMPLER-1 outbound
 sflow collector COLLECTOR-1

注意这里的packet-interval 1024,意思是每1024个报文采1个。这个值设得越小,数据越准,但CPU开销也越大。我一般建议从1024开始调。

3.4 IPFIX:NetFlow的标准化版本

NetFlow是思科私有的。其他厂商不服气:凭什么只能用你的?于是IETF搞了个标准——IPFIX。

说白了,IPFIX就是NetFlow的「普通话」版本。它基于NetFlow v9,但更灵活、更开放。

3.4.1 IPFIX的核心优势

  • 模板化:你可以自定义要采集哪些字段。不像NetFlow,字段是固定的。
  • 可变长字段:比如应用名称、URL,这些NetFlow搞不定。
  • 厂商无关:华为、中兴、Juniper都支持。

我在做跨厂商项目时,IPFIX是首选。思科和华为的设备混用,两边都配IPFIX,采集器统一收,省心多了。

3.4.2 IPFIX配置示例(华为设备)

# 定义流记录
flow record FLOW-RECORD-IPFIX
 match ipv4 source-address
 match ipv4 destination-address
 match ip protocol
 match transport source-port
 match transport destination-port
 collect counter bytes
 collect counter packets
 collect application name

# 定义流导出器
flow exporter EXPORTER-IPFIX
 destination 192.168.1.100
 source-address 10.0.0.1
 transport protocol udp
 port 4739
 template interval 60

# 定义流监控
flow monitor MONITOR-IPFIX
 record FLOW-RECORD-IPFIX
 exporter EXPORTER-IPFIX

# 接口应用
interface GigabitEthernet0/1/1
 flow monitor MONITOR-IPFIX inbound
 flow monitor MONITOR-IPFIX outbound

注意端口号:IPFIX默认用4739,NetFlow用2055。别搞混了,否则采集器收不到数据。

3.5 SNMP:老当益壮

SNMP是这里面最老的。1988年就有了,到现在还在用。为什么?因为它简单、稳定、通用。

SNMP主要用来采集设备的「状态」数据,比如:

  • 接口流量(ifInOctets、ifOutOctets)
  • CPU利用率
  • 内存使用率
  • 接口状态(up/down)

但它有个致命弱点:精度不够。SNMP是轮询机制,你设成5分钟轮询一次,那5分钟内的流量波动你就看不到。

我曾经遇到过一个案例,客户说网络不卡,但SNMP显示带宽利用率只有30%。结果一查,是SNMP轮询周期太长,把峰值给平滑掉了。后来加了NetFlow,才发现每秒钟都有突发冲到90%。

3.5.1 SNMP配置示例

! 思科设备
snmp-server community public RO
snmp-server community private RW
snmp-server location Beijing
snmp-server contact admin@example.com
snmp-server enable traps
snmp-server host 192.168.1.100 version 2c public
# 华为设备
snmp-agent
snmp-agent community read cipher public
snmp-agent community write cipher private
snmp-agent sys-info location Beijing
snmp-agent sys-info contact admin@example.com
snmp-agent trap enable
snmp-agent target-host trap address udp-domain 192.168.1.100 params securityname public

这里有个安全提醒:生产环境千万别用publicprivate。我见过太多人图省事,结果被扫出来,整个网络拓扑都暴露了。

3.6 四种技术对比

特性 NetFlow sFlow IPFIX SNMP
标准化 思科私有 RFC 3176 RFC 7011 RFC 1157
采集方式 流状态跟踪 随机采样 流状态跟踪 轮询
数据粒度 细(每条流) 粗(采样) 细(可自定义) 粗(接口级)
设备开销 中高
典型场景 流量分析、安全审计 高速链路、数据中心 多厂商环境、应用识别 基础监控、告警
默认端口 2055 6343 4739 161/162

核心建议:

我个人习惯的部署方案是:SNMP做基础监控 + NetFlow/IPFIX做流量分析 + sFlow做高速链路采样。三者互补,基本能覆盖所有场景。

小技巧:

如果你用的是开源采集器(比如ntopng、ElasticFlow),记得先确认它支持哪些协议。有些采集器只支持NetFlow v5,不支持v9和IPFIX。我踩过这个坑,配了半天发现采集器不认。

避坑指南:

我曾经在某个项目里,把NetFlow的导出间隔设成了1秒。结果采集器每秒收到几万条流记录,直接崩溃。后来改成30秒导出一次,配合模板缓存,才稳定下来。

记住:导出间隔不是越短越好。要根据你的流数量和采集器性能来调。

3.7 选型建议

最后,我给大家一个简单的选型思路:

  • 如果你只有10G以下的链路,且设备是思科 → 用NetFlow v9,够用。
  • 如果你有40G/100G链路 → 用sFlow,别犹豫。
  • 如果你是多厂商混合组网 → 用IPFIX,统一标准。
  • 如果你只需要看接口流量和告警 → SNMP v2c就够了,别折腾。

嗯,流量采集这块就讲到这里。下一章咱们聊聊采集到的数据怎么存、怎么查、怎么出报表。那才是真正考验功夫的地方。