测试环境做过一次ARP风暴模拟,目的是验证接入交换机的风暴抑制配置是否生效。用Scapy构造ARP请求包,源MAC和源IP每次都变,交换机会把这些包广播到整个VLAN,效果很明显。
构造ARP请求包的要点:op=1表示ARP请求,pdst填目标IP,psrc可以用随机的私有地址。以下是核心代码:
from scapy.all import ARP, Ether, sendpimport randompkt = Ether(dst=”ff:ff:ff:ff:ff:ff”) / ARP(op=1, pdst=”192.168.1.1”)sendp(pkt, iface=”eth0”, count=1000, inter=0.001)
这里inter=0.001是包间隔,压到1毫秒发1000个包,测试环境里能瞬间把接入交换机CPU打上去。如果是生产环境千万别这么干,哪怕是测试也要确认广播域是隔离的,我就吃过亏,有一次忘了限定VLAN,ARP包跑到了核心交换机上,整个楼层的网络都受到了影响。
检测端我用了一个简单的脚本实时监控ARP包速率。用sniff抓包,用time.time()计算每秒收到的ARP包数量,超过阈值就告警。
from scapy.all import sniffimport timestart = time.time(); cnt = 0def cb(pkt): global cnt; cnt += 1 if cnt % 100 == 0: print(”ARP rate:”, cnt / (time.time() - start))sniff(filter=”arp”, prn=cb, store=0)
阈值设多少合适?正常局域网里ARP流量很低,每秒几个包算是正常。我一般把阈值设在50pps,超过这个值就要警惕了。如果是有人私接设备发起ARP攻击,速率能到几千pps,交换机的风暴抑制如果能生效,应该在接口上看到drop计数增长。
测试完记得把脚本停掉,别让自己的测试流量把网络搞挂了。
ARP风暴相关参数和注意事项汇总一下:
| | |
|---|
| | |
| | |
| | |
| | |
| storm-control broadcast min-rate 1000 | |