python统计IP段(基础实现版)
今天有点困,生气更加耗损精气神= =。。。早点写完早点睡
这个需求源于业主方隔三差五发一个压缩文件夹过来,里面主要有png、txt文件,是一些疑似恶意攻击IP,
txt文件: png图片:
一开始我以为要我去nginx封禁,后来我叫WAF那边处理,他们封其实更合理些。因为过滤到nginx这边的流量基本是正常流量来的了。。。把这些ip整理汇总有点烦,为了以后方便WAF人员,减轻他们工作量,我觉得如果能封IP段,岂不更好?
于是在整理汇总这些IP后,好奇之下,想整理一个IP中前3位,次数超过3次,则默认是IP段过来攻击。
老实说,我觉得代码有很多需要改进的地方,仅仅是一个简单实现的开端,是我昨晚以及今天上班抽空花了点时间去写的。。。
1、准备工作
要人手做,准备一个EXCEL表格,把整理好的IP放进去,去重排序好:
我公司电脑用的是WPS,删除重复项可以这样做:
选中列 ——》数据 ——》 删除重复项
2、脚本思路:
很容易发现这些IP,以“.” 为分隔符,每一段不一定为3位,所以一开始要补前导0,
因为我们需要拿IP前三段进行统计(变量:newip),超过3次,则认为是IP段过来攻击。
超过3次:用的是字符串的比较,两个for循环,cnt计数器是为了优化的,表示下一次循环移动的下标位置
用python的集合去输出结果,是为了去除最终结果的重复项,因为
if cnt >= 3: 这里是有bug的,会多次写入
# -*- coding: utf-8 -*- # @Time : 2022/8/7 21:22 # @Author : ljy # @File : deltexcel.py import netaddr import sys import xlrd book = xlrd.open_workbook("test1.xlsx") # 获取工作簿对象 table = book.sheet_by_index(0) rows = table.nrows arr = [] for i in range(rows): ip = table.cell_value(i,0) tip1 = str(ip.split('.')[0]) #不够3位,补前导0 ip1 = tip1.zfill(3) tip2 = str(ip.split('.')[1]) ip2 = tip2.zfill(3) tip3 = str(ip.split('.')[2]) ip3 = tip3.zfill(3) # newip = print('%s.%s.%s' % (str(ip1), str(ip2), str(ip3))) ## 拿到ip前三段,最后1段假设为0,方便后面去除前导0 newip = str(ip1) + '.' + str(ip2) + '.' + str(ip3) # print(newip) arr.append(newip) # for i in range(rows): # print(arr[i]) # 计数器:cnt # 集合保存最终结果 result = set() for i in range(rows): cnt = 1 for j in range(i+1, rows): while 1: if j >= rows: break; if arr[i] == arr[j]: cnt = cnt + 1 j = j + 1 else: break; if cnt >= 3: aa = arr[i] + '.' + '000' #IP最后一段默认补0,方便后面去除前导0 #去除前导0 no_zero_ip = netaddr.IPAddress(aa, flags=netaddr.ZEROFILL).ipv4() bb = str(no_zero_ip) + '/' + '24' result.add(bb) # print(arr[i]) i = cnt + i - 1; break; sortres = sorted(result) for item in sortres: print(item, end='\n')
最后输出结果是这样的:
优化:能同步写回到excel最好啦,代码有些冗余,人为手动处理那部分希望能python自动处理下会更加好咯,因为复制黏贴到excel里,也是蛮头疼的。
至于有没有细测,哈哈哈,我抽了几个去检查,好像是没问题的。。。
先洗洗睡