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

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

      先洗洗睡

  • 相关阅读:
    MySQL5.7安装教程(压缩版)
    ASP.Net 添加 Interop for Word, excel 插件
    OpenLayers-加载地图数据(Google Map)
    OpenLayers学习方法
    OpenLayers 项目分析——(二)源代码总体结构分析{感谢原作者对于大家的贡献!}
    OpenLayers项目分析——(一)项目介绍{感谢原作者为大家的贡献!}
    OpenLayers 项目分析——(三)BaseTypes {感谢原文作者对于大家的贡献!!!}
    GeoServer安装及配置过程(配置shapefile)
    如何查询postgreSQL 里面某个数据库中所有用户定义的数据表的名字
    WebGIS(PostgreSQL+GeoServer+OpenLayers)之三 OpenLayers客户端数据显示
  • 原文地址:https://www.cnblogs.com/windysai/p/16564236.html
Copyright © 2020-2023  润新知