3、被动监测技术:SNMP、NetFlow、sFlow 的部署与数据采集

聊到远程通信链路的监测,很多人第一反应就是主动发包去测。但说实话,在大型网络里,你不可能每时每刻都发探测流量。这时候,被动监测技术就派上用场了。它不产生额外流量,而是“偷听”网络设备自己的“悄悄话”。

我个人习惯把被动监测比作“搭便车”。你不需要自己开车,只需要坐在设备这辆“车”上,看它仪表盘上显示什么。今天我们就聊聊三种最主流的“搭便车”方式:SNMP、NetFlow 和 sFlow。

3.1 SNMP:最基础的“体检报告”

SNMP,全称简单网络管理协议。名字里带“简单”,但别小看它。它是网络设备的“体温计”和“血压计”。

SNMP 的核心机制

说白了,就是管理站(NMS)去问设备(Agent):“你咋样了?”设备回答:“我CPU 80%了,接口流量快满了。” 就这么一问一答。

它主要靠两个东西:

  • MIB(管理信息库):这是设备的“病历本”。里面定义了你能问什么。比如接口的输入字节数,对应的是 ifInOctets 这个 OID。
  • OID(对象标识符):这是“病历本”上的页码。比如 1.3.6.1.2.1.2.2.1.10 就是 ifInOctets 的地址。
我的经验: 刚入行时,我总记不住这些 OID。后来我学乖了,直接用 MIB 浏览器。你想想看,手动敲 OID 多容易出错。用工具加载设备的 MIB 文件,直接点选参数名,它自动帮你翻译成 OID。

SNMP 的部署要点

部署 SNMP 其实不复杂,但有几个坑要注意。

  1. 版本选择:现在基本都用 SNMPv2c 或 v3。v1 太老了,别用了。v2c 用 community string(团体名)做密码,相当于“芝麻开门”。v3 支持加密和认证,更安全。
  2. Community String 设置:千万别用 publicprivate。我在项目中遇到过,某客户全网设备都用 public,结果被内部员工扫了一遍,所有配置都暴露了。建议用复杂点的字符串,比如 MyN3tw0rk@2024
  3. 采集频率:别太频繁。一般 5 分钟一次就够了。你设成 30 秒一次,设备 CPU 会报警的。

数据采集示例

假设我们要采集一台路由器的接口流量。用 Linux 下的 snmpwalk 命令:

# 采集接口描述信息
snmpwalk -v2c -c MyCommunity 192.168.1.1 1.3.6.1.2.1.2.2.1.2

# 采集接口输入字节数
snmpwalk -v2c -c MyCommunity 192.168.1.1 1.3.6.1.2.1.2.2.1.10

# 采集接口输出字节数
snmpwalk -v2c -c MyCommunity 192.168.1.1 1.3.6.1.2.1.2.2.1.16

返回的数据长这样:

IF-MIB::ifDescr.1 = STRING: GigabitEthernet0/0/0
IF-MIB::ifDescr.2 = STRING: GigabitEthernet0/0/1
IF-MIB::ifInOctets.1 = Counter32: 1234567890
IF-MIB::ifOutOctets.1 = Counter32: 987654321

嗯,这里要注意:Counter32 到 4.29G 后会归零。如果你链路带宽超过 1Gbps,建议用 Counter64 的 OID。

3.2 NetFlow:流量分析的“透视镜”

SNMP 能告诉你“流量有多大”,但 NetFlow 能告诉你“谁在跟谁说话,说了什么”。它就像网络流量的“通话记录”。

NetFlow 的工作原理

NetFlow 是 Cisco 发明的。它把网络流量抽象成“流”(Flow)。一个流就是一组具有相同五元组(源IP、目的IP、源端口、目的端口、协议)的数据包。

设备会缓存这些流信息,然后定期打包发给采集器。采集器收到后,就能分析出:

  • 谁在访问谁?
  • 用了什么协议?
  • 传了多少数据?
  • 会话持续了多久?
避坑指南: 我曾经在一条 10Gbps 的链路上开启了 NetFlow v5。结果设备 CPU 直接飙到 90%。为什么?因为 NetFlow v5 是固定采样,所有流量都要处理。后来我换成了 NetFlow v9,配合采样功能,CPU 才降下来。

NetFlow 的部署配置

以 Cisco 设备为例,配置 NetFlow 导出:

! 定义流记录
flow record MY-RECORD
 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

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

! 定义流监视器
flow monitor MY-MONITOR
 record MY-RECORD
 exporter MY-EXPORTER
 cache timeout active 60

! 应用到接口
interface GigabitEthernet0/0/0
 ip flow monitor MY-MONITOR input

配置完成后,采集器(比如 nfdump)就能收到数据了。查看采集到的流:

nfdump -r nfcapd.202401011200 -o extended

输出示例:

Date flow start          Duration Proto      Src IP Addr:Port          Dst IP Addr:Port   Packets    Bytes
2024-01-01 12:00:00.000    10.000 TCP       192.168.1.100:44321       10.10.10.1:80          120    15000
2024-01-01 12:00:10.000     5.000 UDP       10.10.10.2:12345          8.8.8.8:53              3      300

3.3 sFlow:高性能场景的“抽样调查”

sFlow 和 NetFlow 有点像,但思路完全不同。NetFlow 是“全量统计”,sFlow 是“抽样统计”。

为什么需要 sFlow?

你想想看,在 100Gbps 的链路上,如果做全量 NetFlow,设备得累死。sFlow 的做法是:每 N 个包抽一个样本,然后把这个样本发出去。这样设备负载极低,适合高速链路。

sFlow 的采样机制有两个层面:

  • 数据包采样:随机抽取数据包,把包头信息发出去。
  • 计数器采样:定期采集接口的统计计数器(类似 SNMP)。
注意: sFlow 是采样,不是全量。采样率设得太低,会漏掉小流量。比如采样率 1:10000,一个只有 10 个包的流,基本就看不到了。我建议在核心链路上用 1:1000,在接入层可以用 1:100。

sFlow 的部署配置

以华为设备为例:

# 配置 sFlow 采样
sflow agent ip 192.168.1.1
sflow collector 1 ip 10.10.10.100
sflow collector 1 port 6343

# 在接口上启用采样
interface GigabitEthernet0/0/0
 sflow sampling-rate 1000
 sflow counter-interval 30
 sflow flow-counter collector 1

采集端可以用 sflowtool 来接收:

sflowtool -p 6343 -l

输出示例:

sflow_v5: agent 192.168.1.1, seq 12345, uptime 3600000
  sample_type 1 (packet sample)
    src_ip 10.10.10.2, dst_ip 8.8.8.8
    src_port 12345, dst_port 53
    protocol 17 (UDP)
    frame_length 128

3.4 三种技术的对比与选择

说了这么多,到底该用哪个?我整理了一张表,方便你对比:

特性 SNMP NetFlow sFlow
数据粒度 接口级(粗) 流级(细) 包级(最细)
设备负载 中-高
是否采样 否(全量) 可配置采样 是(必须采样)
适用场景 基础监控、告警 流量分析、安全审计 高速链路、实时监控
标准程度 IETF 标准 Cisco 主导 IETF 标准
采集协议 UDP 161/162 UDP 2055 UDP 6343

我的建议是:

  • 如果你只想看链路带宽利用率,SNMP 就够了。
  • 如果你想做流量分析,比如谁在占带宽,用 NetFlow。
  • 如果你在 10Gbps 以上的链路上,或者需要实时抓包分析,用 sFlow。
一个小技巧: 很多网络团队会把 SNMP 和 NetFlow/sFlow 结合起来用。SNMP 负责告警(比如接口 down 了),NetFlow/sFlow 负责事后分析(比如看看是谁导致链路拥塞)。这样既省资源,又全面。

好了,关于被动监测技术的部署与数据采集,就聊到这里。这三种技术各有千秋,没有绝对的好坏。关键是根据你的网络规模、链路带宽和监控需求来选。下次遇到链路问题,别急着发探测包,先看看设备自己说了什么。