动态黑名单实时下发:无需 Reload 配置文件,通过 HTTP API 实时封禁攻击源

千敏小哥_8806

千敏小哥_8806

2026-04-26

271人浏览

原创

正确做法是在 init_by_lua_block 中初始化 Redis 连接池并复用,而非每次请求 new();须设超时、密码认证、真实 IP 多级解析、封禁接口三重校验,并在高并发时结合布隆过滤器与本地缓存降载。

动态黑名单实时下发:无需 reload 配置文件,通过 http api 实时封禁攻击源

access_by_lua_block 里不能直接 new Redis 实例

每次请求都 redis:new() 会快速耗尽连接数,还可能触发 Redis 的连接拒绝。OpenResty 官方明确建议复用连接池,而不是按需新建。

正确做法是在 init_by_lua_block 中初始化一次连接,并存入 ngx.ctx 或全局变量(注意线程安全);实际拦截时只复用它。

  • 必须调用 red:set_timeout(100),否则默认超时是 60000ms,长阻塞会拖垮整个 worker
  • 如果 Redis 启用了密码,red:auth("yourpass") 必须在 connect() 之后、任何命令之前执行
  • 连接失败时,red:connect() 返回 false, err,应记录日志并 fallback 到允许访问,避免因 Redis 不可用导致全站 500

真实 IP 获取必须绕过代理污染

直接读 ngx.var.remote_addr 在有 CDN 或反向代理时大概率拿到的是中间节点 IP,封错对象。

要按优先级顺序取值:先看 ngx.var.http_x_real_ip,再 fallback 到 ngx.var.http_x_forwarded_for 的第一个非私有地址,最后才是 remote_addr。

  • 确保 Nginx 编译时启用了 --with-http_realip_module,并在配置中设置 set_real_ip_from 指定可信代理段
  • X-Forwarded-For 可被客户端伪造,所以不能无条件信任,必须结合 real_ip_header X-Forwarded-For + real_ip_recursive on 做可信链解析
  • 私有地址段如 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 要跳过,否则可能把内网 IP 当成攻击源误封

HTTP API 封禁接口必须带 TTL 和校验

一个裸露的 POST /api/block?ip=1.2.3.4 接口等于给攻击者送了一把万能钥匙。

Pandas 配置文件报告生成器
Pandas 配置文件报告生成器

使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。

下载

至少要加三道防线:IP 格式校验、TTL 上限限制、调用方身份认证。

  • 用 string.match(ip, "^%d+%.%d+%.%d+%.%d+$") 做基础格式检查,再用 iputils:is_private()(需引入 Lua 库)排除非法段
  • TTL 必须限制最大值(比如 86400),防止长期封禁影响业务,命令统一走 SETEX blacklist:1.2.3.4 86400 "1"
  • 接口必须校验 Authorization: Bearer xxx 或签名 header,Token 存 Redis 并设过期,不能硬编码在代码里

高频误封时布隆过滤器不是银弹

当黑名单 IP 数量超过 10 万且 QPS 过万时,单纯靠 GET blacklist:xxx 会产生大量 Redis 请求,容易打满带宽或触发慢日志。

本地缓存 + 布隆过滤器(BloomFilter)可降载,但要注意它的假阳性特性。

  • 布隆过滤器只能回答“可能在黑名单中”或“绝对不在”,一旦返回“可能在”,仍需查 Redis 确认,不能直接 403
  • 不支持删除,如果要解封某个 IP,必须重建整个过滤器,适合“封禁多、解封少”的场景
  • OpenResty 下推荐用 resty.bloomfilter(需自己编译加载),别用纯 Lua 实现——性能差一个数量级

Nginx 动态黑名单真正难的不是写几行 Lua,而是让每个环节都扛住线上流量压力:Redis 连接管理、真实 IP 解析边界、API 接口防护粒度、以及缓存策略和布隆过滤器之间的协同节奏。这些地方出问题,往往不会立刻报错,而是在凌晨三点突然开始漏放或误杀。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

40

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

40

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

80

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

80

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Golangci-lint官方文档
Golangci-lint官方文档

共0课时 | 0人学习

Conan 参考手册
Conan 参考手册

共0课时 | 0人学习

Jupyter Notebook官方文档
Jupyter Notebook官方文档

共0课时 | 0人学习