lua + redis 实现动态封禁

一)需求背景

为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。 对于黑名单之内的 IP ,拒绝提供服务。

二)设计方案

实现 IP 黑名单的功能有很多途径:

  • 1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求;

  • 2、在 Web Server 层面,通过 Nginx 自身的 deny 选项 或者 lua 插件 配置 IP 黑名单;

  • 3、在应用层面,在请求服务之前检查一遍客户端 IP 是否在黑名单。

为了方便管理和共享,通过 Nginx+Lua+Redis 的架构实现 IP 黑名单的功能

配置nginx.conf

在http部分,配置本地缓存,来缓存redis中的数据,避免每次都请求redis

  • 1分之内不去redis取。

  • 超过1分钟,重新拉取放入本地全局变量中。

用户redis客户端手动设置测试 sadd limit:ip:blacklist 192.168.40.110

当然这个过程可以动态自动设置,当访问频率控制时,一个ip总是在固定的时间内访问次数限制,则自动加入到黑名单中,这样每次过来只、直接不让访问其,不需要再让期判断访问频率控制逻辑。

Last updated

Was this helpful?