python统计IP段 (基础实现版)

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里,也是蛮头疼的。

  至于有没有细测,哈哈哈,我抽了几个去检查,好像是没问题的。。。

  先洗洗睡

 

posted @ 2022-08-08 22:24  windysai  阅读(358)  评论(0编辑  收藏  举报