这里介绍的是,如何在 linux 环境下让IDP设备告警
这里linux下流量重放的工具是:tcpreplay
以下介绍的所有方式,都是基于播放的数据包能抵达IDP监听的网卡
方式1:直接调用tcpreplay播放当前目录下的所有数据包(以通配符*
实现这一目的)
方式2:编写shell脚本,遍历当前目录下的所有文件,把每次遍历的值作为变量交给 tcpreplay 重放
tcpreplay -i eth1 -M 1000 *.pcap # 方式1
for i in $(ls ./); do tcpreplay -i eth1 -M 1000 $i; done # 方式2
从下图可以看出,由于我攻击了两轮,因此告警重复了两次。
上面两种方法简单粗放,如果面对大量数据包,我就必须知道当前播放状态等信息,因此需要编写python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import time
# import commands #python2
import subprocess # python3
def fileNameGet(path):
for root, dirs, files in os.walk(path):
for file in files:
# print(os.path.join(root,file),type(os.path.join(root,file)))
if os.path.join(root, file).endswith('.pcap') or os.path.join(root, file).endswith('.pcapng') or os.path.join(root, file).endswith('.cap'):
packetname_path.append(os.path.join(root, file))
def tcpreplayALL():
a = 0
print('当前共计数据包:{}个'.format(len(packetname_path)))
while a < 1: # 设置数据包轮播次数
j = 1
print('当前进行数据回放的第{}轮'.format(a))
for i in packetname_path:
try:
# status = commands.getstatusoutput('tcpreplay -i eth1 -M 10000 "{}"'.format(i)) #python2
status = subprocess.getstatusoutput('tcpreplay -i eth1 -M 1000 "{}"'.format(i)) # python3
time.sleep(0.02)
print('tcpreplay -i eth1 -M 1000 "{}" 当前轮数为:第{}轮,此轮数据包剩余{}个。'.format(i, a, len(packetname_path) - j))
# print(status)
j += 1
except:
print(i + ' 此轮数据包剩余{}个'.format(len(packetname_path) - 1))
j += 1
pass
a += 1
if __name__ == "__main__":
packet_path = r'bps-new/' # 路径自己改
packetname_path = []
fileNameGet(packet_path)
tcpreplayALL()
运行效果如下,成功触发告警