# ip_blacklists **Repository Path**: lowmanisbusy/ip_blacklists ## Basic Information - **Project Name**: ip_blacklists - **Description**: redis + ipset + python 实现IP黑名单的动态添加及解封禁 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2019-09-05 - **Last Updated**: 2022-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 一.程序简介: 1.使用redis的string数据类型保存黑名单,通过设置key的过期时间,实现IP黑名单的实时解封禁 2.订阅redis事件消息的程序通过python编程语言进行封装: 1)往redis数据库添加数据时,redis发送key添加事件消息,添加IP黑名单 2)数据过期,redis发送expired事件消息,解封禁IP黑名单 3.通过python调用ipset工具,实现IP黑名单的动态添加或者删除 二.Redis的配置 在redis配置文件中,找到如下配置项: notify-keyspace-events "" 将其修改为: notify-keyspace-events "E$xe" E$xe: 启用键事件通知模式/k-v操作命令通知/过期事件通知/驱逐事件通知 关于redis的事件订阅的详细使用方式及原理,请自行了解 三.安装ipset工具 以ubuntu为例: sudo apt install ipset ipset: iptables 的拓展工具,请自行了解其详细的使用方式 四.打开服务器的防火墙功能 五.创建ipset 非必要步骤,如果没有手动创建ipset,程序将会根据配置项中的配置自动进行创建 六.创建iptables限制访问规则 非必要步骤,如果没有手动创建限制访问规则,程序默认创建的访问规则为: 禁止ipset中的IP访问 80 端口(端口号可在配置项进行修改) 七.往redis中添加黑名单的方式 1.添加IP黑名单一方所使用的数据库需要和本程序所使用的数据库保持一致 2.添加需要暂时性封禁的IP黑名单: 使用redis的string数据类型: key: IP value: 随意,直接给一个空字符串即可 通过设置key的过期时间,实现IP到期解封禁,需要封禁多少时间,过期时间就设置成多少 3.添加需要永久性封禁的ip黑名单: 使用redis的string数据类型: key: IP + "-" + "后缀名称" value: 随意,直接给一个空字符串即可 4.redis保存IP黑名单的数据库,不能与其他数据同时使用,如果该数据库确实需要同时保存其他数据,解决的思路就是: 在key中加入一个前缀或者后缀,然后修改源码,在接收到事件通知时,对key进行split,再判断是否是IP黑名单, 但是还是建议专门配置一个数据库用来保存IP黑名单 注意: redis 的事件通知 即发即弃, 如果发送消息时,接收方没有进行接收,那么将永远无法再次获取该消息, 这就导致一个问题就是: 如果是黑名单过期的消息没有接收到,那么ipset中对应的IP将会永久存在,导致该IP的用户永久无法访问, 这样的情况在订阅程序开启的情况,概率应该是很低的,再者,往redis添加黑名单这样的操作想必也不会存在太高的并发性. 建议: 1)停止应用时,先停止redis,再停止本程序, 2)开启应用时,先开启本程序,再启动redis(redis启动完成以后,添加IP黑名单一方才能连接redis完成添加操作), 3)每次重启应用后,清理掉ipset中存留的IP名单(建议将需要永久性封禁的 IP黑名单 单独保存在一个ipset中,可在配置项中进行配置), 4)创建一个定时任务,定时清空保存 暂时性封禁的IP黑名单 的ipset, 执行间隔可根据实际情况决定 (毕竟只是暂时性封禁,清空也无妨). 八.环境依赖 1.python版本: python 3+ 2.pip install -r requirements.txt 3.程序的配置项在main.py文件中 九.程序启动 需要使用root权限运行程序(程序中存在的网络交互仅为: 订阅 redis 事件消息, 不存在太大的安全问题): python main.py 十.本程序只是负责将redis中的IP黑名单动态添加到ipset中(或者解封禁),不完成IP黑名单原始数据的收集