检测短时流量突发的可靠方法

网络工程 思科 snmp
2021-07-20 19:05:24

我有一台服务器连接到 Cisco WS-C3560G-24TS交换机 GigE 端口。我需要检查服务器是否创建了几秒钟 >500Mbps 的流量突发。服务器不在我的管理之下。

起初,我制作了一个简单的脚本,它将接口入口字节存储到一个变量 ( bps1) 中,休眠一秒钟,将入口字节存储到另一个变量 ( bps2) 中,计算接收到的比特数,将其存储在名为 的变量中delta,并打印一个如果delta大于 500Mbps,则记录消息

while :; do
  for i in {1..2}; do
    declare bps"$i"=$(snmpwalk -Ov -v 2c -c public switch ifHCInOctets.10101 | sed 's/^.* //');
    sleep 1;
  done;
  delta=$(( (bps2 - bps1)*8 ));
  echo "$bps1" "$bps2" "$delta";
  (( delta > 500000000 )) && printf '%s\n' "$(date -u "+%d.%m.%y %H:%M:%S") UTC ingress traffic from customer was "$delta" bps";
done | tee -a bps.log

echo "$bps1" "$bps2" "$delta";上面行仅用于故障排除目的。Cisco IOSifHCInOctets以 1ts 间隔更新计数器。

然而,由于一个 while 循环需要比一秒钟更长的时间才能完成,因此脚本偶尔会报告两个间隔的 bps。例如:

155268562689729 155268611695817 392048704
155268714010296 155268764441853 403452456
155268862787657 155268910277237 379916640
155269008492724 155269103039983 756378072
14.05.15 14:59:19 UTC ingress traffic from customer was 756378072
155269148645940 155269195558201 375298088
155269295068336 155269395399778 802651536
14.05.15 14:59:26 UTC ingress traffic from customer was 802651536
155269492138530 155269538915854 374218592
155269631823265 155269679591240 382143800

我猜这种方法只适用于更长的轮询期?检测短时流量突发的其他可能性是什么?在交换机/路由器中带有计数器的监管器?其他一些聪明的方法?

3个回答

根据您希望所有这些的准确程度,并假设您想继续使用 SNMP 轮询方法,您可能希望通过每次轮询时获取系统时间戳并计算结果平均带宽来自己重新计算 bps 值在两个时间戳之间使用:

BW = (InOctets2 - InOctets1) / (timestamp2 - timestamp1)

这并不完全准确,因为时间戳是在您的机器上而不是在计算 InOctets 时的交换机上获取的,但至少您将删除对 while 循环持续时间的隐式依赖。

Cisco IOS嵌入式事件管理器 (EEM)可能对您有所帮助。例如,似乎交通警察可以检测到您描述的突发事件,然后 EEM 可以通过电子邮件发送给您?

您是否可以选择从此设备收集 NetFlow?NetFlow 时间戳是准确的,因此您将能够使用任意数量的流量收集器/分析器轻松获取峰值。