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的地址。
SNMP 的部署要点
部署 SNMP 其实不复杂,但有几个坑要注意。
- 版本选择:现在基本都用 SNMPv2c 或 v3。v1 太老了,别用了。v2c 用 community string(团体名)做密码,相当于“芝麻开门”。v3 支持加密和认证,更安全。
- Community String 设置:千万别用
public和private。我在项目中遇到过,某客户全网设备都用public,结果被内部员工扫了一遍,所有配置都暴露了。建议用复杂点的字符串,比如MyN3tw0rk@2024。 - 采集频率:别太频繁。一般 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、源端口、目的端口、协议)的数据包。
设备会缓存这些流信息,然后定期打包发给采集器。采集器收到后,就能分析出:
- 谁在访问谁?
- 用了什么协议?
- 传了多少数据?
- 会话持续了多久?
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 的部署配置
以华为设备为例:
# 配置 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。
好了,关于被动监测技术的部署与数据采集,就聊到这里。这三种技术各有千秋,没有绝对的好坏。关键是根据你的网络规模、链路带宽和监控需求来选。下次遇到链路问题,别急着发探测包,先看看设备自己说了什么。