首页 > 其他分享 >动态IP黑白名单过滤的设计与实现(上篇设计思想)

动态IP黑白名单过滤的设计与实现(上篇设计思想)

时间:2024-11-19 22:15:10浏览次数:3  
标签:IP 误判 黑名单 Filter 过滤 哈希 设计 Bloom

文章目录

需求分析

一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源,导致资源占用过高。因此我们需要一定的手段实时阻止可疑或恶意的用户,减少攻击风险。

通过 IP 封禁,可以有效拉黑攻击者,防止资源被滥用,保障合法用户的正常访问。

对于我们的需求,不让拉进黑名单的 IP 访问任何接口。

方案设计

1、设计过程

其实前面讲到的 Sentinel 本身就支持请求来源的 黑白名单判断,但默认是对应用级别进行判断,需要改造来源的获取方式为获取请求客户端的 IP,可参考 这篇文章 自定义来源。

但其实引入 Sentinel 是需要一定成本的,本节主要分享更轻量的动态 IP 黑白名单过滤的常用设计和实现方法。

想要自主实现动态 IP 黑名单,主要考虑以下几点:

  1. IP 黑名单存储在哪里?
  2. 如何便捷地动态修改 IP 黑名单?
  3. 黑白名单的判断逻辑应在哪里处理?
  4. 使用何种数据结构保存黑名单?如何快速匹配用户请求的 IP 是否在黑名单中?

下面分别设计:

1)IP 黑名单存储在哪里?

最简单的方式就是存储在内存中,但一般 IP 黑名单是动态增加的、需要持久化保存。常见的持久化方式包括数据库、配置文件或分布式存储系统(如 Redis),可以根据需要选择。

2)如何便捷地动态修改 IP 黑名单?

为了方便动态修改 IP 黑名单,通常会提供一个管理页面,供管理员进行增删改查操作。

许多企业会将配置统一放入 配置中心,通过配置中心的管理页面,开发人员可以便捷地动态修改黑名单规则。Java 项目中,常用的配置中心是 Nacos。

3)黑白名单的判断逻辑应在哪里处理?

黑白名单逻辑通常部署在高性能的网关或 CDN 上,能够更早地拦截非法请求,减轻后端压力。在小型项目中,也可以直接在应用程序的过滤器中处理。

4)使用何种结构保存黑名单?如何快速匹配?

为了高效判断每个用户请求的 IP 是否在黑名单中,首先建议将 IP 黑名单从持久化存储同步到本地缓存中,避免频繁查询远程数据源。对于黑名单数据较小的场景,可以使用简单的 Set 数据结构存储。而对于大规模黑名单,推荐使用 布隆过滤器或 DFA 来存储和过滤黑名单,可以节约内存空间、提高检测效率。

2、最终方案

总结一下最终方案:

1)使用 Nacos 配置中心存储和管理 IP 黑名单

2)后端服务利用 Web 过滤器判断每个用户请求的 IP

3)后端服务利用布隆过滤器过滤 IP 黑名单

3、扩展知识 - 布隆过滤器

Bloom Filter 是一种高效的、基于概率的数据结构,用于判断一个元素是否存在于集合中。

原理是利用多个哈希函数将元素映射到固定的点位上(位数组中),因此面对海量数据它占据的空间也非常小。

例如某个 key 通过 hash-1 和 hash-2 两个哈希函数,定位到数组中的值都为 1,则说明它存在。

如果布隆过滤器判断一个元素不存在集合中,那么这个元素一定不在集合中,如果判断元素存在集合中则不一定是真的,因为哈希可能会存在冲突。因此布隆过滤器 有误判的概率

而且它不好删除元素,只能新增,如果想要删除,只能重建。

显然,它的主要特点包括:

  1. 空间效率高:相比于传统的数据结构(如哈希表),Bloom Filter 能用较少的空间存储大量的数据。
  2. 时间复杂度低:查询操作非常快速,通常是常数时间复杂度 O(1)
  3. 允许误判:Bloom Filter 允许假阳性,即有时候会错误地判断某个元素在集合中,而实际该元素并不在集合中。不过,它不允许假阴性,也就是说,如果 Bloom Filter 判断某个元素不存在,那么它一定是不存在的。比如对于我们的需求,Bloom Filter 可能错误地判断一个不在黑名单中的元素为在黑名单中,导致误封。

Bloom Filter 的误判率与以下因素有关:

  • 位数组的大小:位数组越大,误判率越低,但空间开销会增大。(值会更离散)
  • 哈希函数的个数:哈希函数越多,误判率越低,但计算成本会增加。(Hash 一次冲突,那我就多 Hash 几次,减少冲突概率)
  • 元素数量:存入的元素越多,误判率会增加。

通过 合理设计位数组的大小和哈希函数的个数,可以控制 Bloom Filter 的误判率在一个可接受的范围内。例如,在很多实际场景中,可以将误判率控制在 1% 或更低。

  • 假设场景 1:存储 1000 个元素,位数组大小为 10000 位,哈希函数数量为 7。误判率大约为 0.8%。
  • 假设场景 2:存储 100000 个元素,位数组大小为 1,000,000 位,哈希函数数量为 7。误判率大约为 1%。
  • 假设场景 3:存储 1,000,000 个元素,位数组大小为 10,000,000 位,哈希函数数量为 7。误判率大约为 1%。

如果误判的代价较高,但仍想使用 Bloom Filter,可以采取一些补救措施:

  • 双层验证:在 Bloom Filter 判断元素在黑名单中后,进一步查验实际的黑名单(例如,查数据库中的黑名单详细记录)。
  • 结合其他数据结构:可以使用 Bloom Filter 进行初步筛选,如果 Bloom Filter 判断为在黑名单中,再用哈希表等精确的数据结构进行最终确认。

但这两种方式都无法处理攻击 IP 的大量请求,个人也不建议采用。

因此,布隆过滤器适用于对准确性要求不高的、大规模数据量匹配的场景,比如垃圾邮件过滤、爬虫 URL 去重、缓存穿透防护等。

标签:IP,误判,黑名单,Filter,过滤,哈希,设计,Bloom
From: https://blog.csdn.net/qq_57473444/article/details/143896857

相关文章

  • Luogu P9869 NOIp2023 三值逻辑 题解 [ 绿 ] [ 带权并查集 ]
    三值逻辑:有点坑并且细节较繁琐,但有点板子的并查集。修改操作发现对于每个点,只有对他的最后一次操作才是有用的,所以记录下最终的祖先即可。然而这里并不能用并查集来实现,因为并查集它具有的是传递性,无论你路不路径压缩,每次修改一个父节点时它的子节点一定会被修改,所以我们不能使......
  • Eclipse保姆级安装及汉化教程(附安装包)
    一、Eclipse介绍Eclipse是一个开放源代码的、基于Java的可扩展开发平台。目前许多开发者开发时仍会选择使用Eclipse,很多初学者刚开始接触Java也是从使用Eclipse开始的二、Eclipse下载安装包下载链接:https://pan.xunlei.com/s/VOC3f6oqiDVvI7iwOwIxD3OrA1#提取码:ms8n三......
  • 前端必知必会-JavaScript 迭代器
    文章目录JavaScript可迭代对象ForOf循环迭代对字符串进行迭代遍历数组遍历集合在Map上进行迭代JavaScript迭代器自制可迭代对象总结JavaScript可迭代对象可迭代对象是可迭代对象(如数组)。可以使用简单高效的代码访问可迭代对象。可以使用for…of循环对可......
  • 基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现一
    一、前言介绍:免费学习:猿来入此1.1项目摘要在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而,传统的本地存储方式存在诸多不便,如空间有限、......
  • 基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现二
    一、前言介绍:免费学习:猿来入此1.1项目摘要在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而,传统的本地存储方式存在诸多不便,如空间有限、......
  • genaiscript踩坑:设置proxyman抓包、兼容qwen72b funtion-call
    genaiscript有个很棒的日志系统,但是碰到接口报错就没用了,还是得抓包来看,为了设置proxy,得修改源码。genaiscript是通过npx运行的,包的执行优先顺序是本地依赖目录npminstallgenaiscript——npm全局依赖目录npminstall-ggenaiscript——npx缓存目录从没有安装过本地包,在Mac上对......
  • [赛记] 多校A层冲刺NOIP2024模拟赛24
    选取字符串60pts直接暴力60pts;这题难点在于读懂题把。。。考虑建出$KMP$树,然后在其中选出$k$个数,他们的$LCA$的深度的平方和就是这个答案,然后简单统计一下即可;具体地,把$KMP$树建出来,然后求每$k$个点的$LCA$的深度的平方和即可,最后乘上方案数(总的减去......
  • 多校A层冲刺NOIP2024模拟赛24
    选取字符串建出失配树以后直接dp就好了。但场上现推的kmp……点此查看代码#include<bits/stdc++.h>usingnamespacestd;#definerep(i,s,t,p)for(inti=s;i<=t;i+=p)#definedrep(i,s,t,p)for(inti=s;i>=t;i-=p)#ifdefLOCALFILE*InFile=freope......
  • 2025最新-计算机毕业设计Java基于kubenetes的OpenStack私有云平台部署
    一、项目介绍  基于K8S的opoenstack私有云平台的监测系统通过对Web应用服务器运行情况的分析统计系统的建设以实现服务器运行数据监控与分析功能。私有云平台是web应用正常运行的核心,为了确保这些网站的稳定运行,势必需要做好对网站服务器的监控。做好对服务器运行的各......
  • 241119 noip 模拟赛
    省流:\(100+50+45+32\)。rk8,喜提前十名中唯一没过t2的。T1题意:对于一棵树,记\(f(i)\)表示\(\sum_{1\leqj\leqn}dis(i,j)\),其中\(dis(i,j)\)表示树上\(i,j\)之间的距离。多测,每次给定一个\(x\),你需要找出最小的一个\(n\),使得存在一个\(n\)个点的树,其上存在......