当前位置: 首页 > news >正文

Nginx 和 Lua 设计黑白名单

使用 Nginx 和 Lua 设计黑白名单机制,借助 Redis 存储

在现代网络应用中,安全性是一个不可忽视的关键因素。应用程序需要能够有效地管理访问权限,以保护其资源不被恶意用户攻击。黑白名单机制是实现访问控制的一种有效方式。本文将详细介绍如何使用 Nginx、Lua 和 Redis 来实现一个黑白名单系统。

一、引言

黑白名单机制是一种简单而有效的访问控制策略。通过将 IP 地址分为允许(白名单)和拒绝(黑名单)访问两类,系统能够对外部请求进行有效管理。使用 Nginx 作为反向代理服务器,结合 Lua 脚本和 Redis 数据库,可以灵活且高效地实现这一机制。

二、系统架构

在我们的设计中,系统架构主要包括三部分:

  1. Nginx:作为反向代理服务器,用于处理用户请求。
  2. Lua:在 Nginx 中运行的脚本语言,用于动态处理请求逻辑。
  3. Redis:高性能的键值存储,用于存储和查询黑白名单数据。

系统流程

  1. 用户发送请求到 Nginx。
  2. Nginx 通过 Lua 脚本获取用户的 IP 地址。
  3. Lua 脚本连接 Redis,检查用户 IP 是否在黑名单或白名单中。
  4. 根据检查结果,决定是否允许访问。

三、环境准备

在开始编码之前,需要准备以下环境:

  1. 安装 Nginx:确保您已经安装了 Nginx,并启用了 Lua 模块(ngx_http_lua_module)。
  2. 安装 Lua:确保系统支持 Lua。
  3. 安装 Redis:用于存储黑白名单数据。

四、Redis 数据结构

在 Redis 中,我们将使用集合(SET)来存储黑白名单的数据。以下是初始化数据的示例命令:

# 添加 IP 到白名单
SADD whitelist "192.168.1.1"
SADD whitelist "192.168.1.2"# 添加 IP 到黑名单
SADD blacklist "192.168.1.100"
SADD blacklist "192.168.1.101"

五、Nginx 配置示例

以下是 Nginx 的配置示例,在 nginx.conf 中添加黑白名单逻辑:

http {lua_shared_dict my_cache 10m;  # Lua共享内存server {listen 80;server_name your_domain.com;location / {# 设置 Lua 处理access_by_lua_block {local redis = require "resty.redis"local red = redis:new()-- 设置 Redis 连接超时red:set_timeout(1000)  -- 1秒超时local ok, err = red:connect("127.0.0.1", 6379)if not ok thenngx.log(ngx.ERR, "failed to connect to Redis: ", err)return ngx.exit(500)endlocal client_ip = ngx.var.remote_addr-- 检查黑名单local is_blacklisted, err = red:sismember("blacklist", client_ip)if is_blacklisted == 1 thenreturn ngx.exit(403)  -- 禁止访问end-- 检查白名单local is_whitelisted, err = red:sismember("whitelist", client_ip)if is_whitelisted == 1 thenreturn  -- 允许访问end-- 如果不在白名单中,默认拒绝访问return ngx.exit(403)}# 其他处理逻辑proxy_pass http://your_backend;}}
}
也可以直接写一个代码块,直接加载,再nginx -s reload 

六、Lua 脚本逻辑分析

在上述配置中,使用的 Lua 脚本主要完成几个关键任务:

  1. 连接 Redis:通过 resty.redis 模块连接 Redis 数据库,确保 Nginx 可以访问存储的黑白名单数据。

  2. 获取客户端 IP:通过 ngx.var.remote_addr 获取请求的客户端 IP 地址。

  3. 检查黑名单

    • 使用 sismember 方法检查 IP 是否在黑名单中。
    • 如果在黑名单中,返回 HTTP 403 状态,禁止访问。
  4. 检查白名单

    • 同样使用 sismember 检查 IP 是否在白名单中。
    • 如果在白名单中,允许请求继续处理。
  5. 默认拒绝:如果未在任何列表中找到,默认拒绝访问。

七、性能考虑

1. Redis 访问优化

虽然 Redis 性能极高,但频繁的访问可能会对性能产生影响。以下是一些优化建议:

  • 连接池:使用连接池可以减少每次请求建立连接的开销。
  • 缓存机制:在 Lua 中使用共享内存缓存常用结果,以减少对 Redis 的访问。例如,可以将最近检查过的 IP 地址结果存储在 lua_shared_dict 中。

2. 日志记录

记录请求和访问控制决策可以帮助后续分析和调试。Nginx 和 Lua 提供了日志记录的机制,可以记录每个请求的状态、IP 地址和处理结果。

ngx.log(ngx.INFO, "Client IP: ", client_ip, " - Status: ", status)

八、安全性考虑

在实现黑白名单机制时,安全性是一个重要因素。确保以下几点可以增强系统的安全性:

  1. 保护 Redis:设置密码和访问控制,以防止未经授权的访问。
  2. 监控日志:定期检查 Nginx 和 Redis 的日志,及时发现异常请求和访问行为。
  3. 定期更新名单:确保黑白名单是最新的,定期审查和更新列表。

九、测试与验证

在生产环境部署之前,确保经过充分的测试。可以使用以下方法进行验证:

  1. 功能测试:检查不同 IP 是否能够正确地被允许或拒绝访问。
  2. 压力测试:在高并发情况下测试系统的稳定性和性能。
  3. 安全测试:模拟攻击请求,检查黑名单是否能够有效阻止恶意访问。

十、总结

通过结合 Nginx、Lua 和 Redis,我们可以实现一个灵活且高效的黑白名单机制。该机制不仅能够有效管理访问权限,还能提供良好的性能和安全性。

相关文章:

Nginx 和 Lua 设计黑白名单

使用 Nginx 和 Lua 设计黑白名单机制,借助 Redis 存储 在现代网络应用中,安全性是一个不可忽视的关键因素。应用程序需要能够有效地管理访问权限,以保护其资源不被恶意用户攻击。黑白名单机制是实现访问控制的一种有效方式。本文将详细介绍如…...

【部署篇】Redis-01介绍‌

一、Redis介绍‌ 1、什么是Redis? ‌Redis,英文全称是Remote Dictionary Server(远程字典服务),Redis是一个开源的、使用‌ANSI C语言编写的‌Key-Value存储系统,支持网络、可基于内存亦可持久化。‌ 它提…...

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…...

【text2sql】ReFSQL检索生成框架

论文标题为《ReFSQL: A Retrieval-Augmentation Framework for Text-to-SQL Generation》,发表在 EMNLP 2023 上。ReFSQL框架通过结构增强检索器来获取与当前问题语义和模式结构相似的样本,然后通过对比学习机制来引导模型学习到这些样本的特定知识&…...

美国市场跨平台应用程序本地化流程的特点

为美国市场本地化移动应用程序是为了创造一种自然、直观、与多元化和精通技术的受众文化相关的体验。美国是世界上最大、最具竞争力的应用程序市场之一,用户期望高质量的性能以及在个人层面引起共鸣的内容。这个市场的本地化需要对美国语言、文化和行为有细致入微的…...

STM32 实现 TCP 服务器与多个设备通信

目录 一、引言 二、硬件准备 三、软件准备 四、LWIP 协议栈的配置与初始化 五、创建 TCP 服务器 1.创建 TCP 控制块 2.绑定端口 3. 进入监听状态 4.设置接收回调函数 六、处理多个客户端连接 七、数据处理与通信管理 八、错误处理与资源管理 九、总结 一、引…...

EdgeNAT: 高效边缘检测的 Transformer

EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b):来自BSDS500的数据集的输入图像。(c, d):对应的真实标签。(e, f):由EdgeNAT检测到的边缘。(e)显示了由于颜色变化…...

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】,3.4k stars - WiFi 网络分析工具二、【penpot】,33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】,6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…...

力扣21~30题

21题(简单): 分析: 按要求照做就好了,这种链表基本操作适合用c写,python用起来真的很奇怪 python代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, v…...

AGI|如何构建一个RAG应用?入门新手攻略!

目录 一、概述 二、过程概述 三、如何优化提问? 四、路由和高级查询 五、丰富索引结构 六、重排序上下文 七、总结 一、概述 Retrieval Augmented Generation RAG 检索增强的内容生成。 从字面上来看检索只是一种手段途径,在人工智能领域中存在多种…...

【.NET 8 实战--孢子记账--从单体到微服务】--角色(增加/删除/修改/查询)

本节我们将开始编写角色相关的接口 一、需求 本节的要做的需求如下: 编号需求标题需求内容1增加角色角色名称不能重复2删除角色角色逻辑删除3修改角色修改的名称不能和已有名称重复4查询角色不分页查询,根据角色名模糊匹配 二、Role类和Role表 这一…...

数据结构-栈与队列笔记

普通的双端队列 用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; import java.util.ArrayDeque; import java.util.Deque;class MyQueue {// 使用双端队列&#xff08;Deque&#xff09;来实现一个队列Deque<Integer> input; // 用于存放新加…...

DevExpress WPF中文教程:如何解决数据更新的常见问题?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

SpringBoot基础(四):bean的多种加载方式

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 SpringBoot基础(四)&#xff1a;bean的多种加载方式 目录 一、xml配置文件二、注解定义bean1、使用AnnotationCon…...

JavaScript网页设计案例:构建动态交互的在线图书管理系统

JavaScript网页设计案例&#xff1a;构建动态交互的在线图书管理系统 在当今的数字化时代&#xff0c;网页设计不仅仅是关于美观和布局&#xff0c;更重要的是用户体验和互动性。JavaScript&#xff0c;作为一种强大的编程语言&#xff0c;在网页开发中扮演着至关重要的角色&a…...

嵌入式数据结构中线性表的具体实现

大家好,今天主要给大家分享一下,如何使用数据结构中的线性表以及具体的实现。 第一:线性表的定义和表示方法 线性表的定义 – 线性表就是零个或多个相同数据元素的有限序列。 • 线性表的表示方法 – 线性表记为: L=(a0,∙∙∙∙∙∙∙∙ai-1aiai+1 ∙∙∙∙∙∙an-1) •…...

Redis高级篇 —— 分布式缓存

Redis高级篇 —— 分布式缓存 文章目录 Redis高级篇 —— 分布式缓存1 Redis持久化1.1 RDB1.2 RDB的fork原理1.3 RDB总结1.4 AOF持久化1.5 RDB和AOF的对比 2 Redis主从2.1 搭建主从架构2.2 数据同步原理2.2.1 全量同步2.2.2 增量同步 3 Redis哨兵3.1 哨兵的作用和原理3.1.1 哨兵…...

彩族相机内存卡恢复多种攻略:告别数据丢失

在数字时代&#xff0c;相机内存卡作为我们存储珍贵照片和视频的重要媒介&#xff0c;其数据安全性显得尤为重要。然而&#xff0c;意外删除、错误格式化、存储卡损坏等情况时有发生&#xff0c;导致数据丢失&#xff0c;给用户带来不小的困扰。本文将详细介绍彩族相机内存卡数…...

【C语言】计算需要的缓冲区大小

使用 snprintf 函数计算缓冲区大小的方法其实是一个常见的技巧,因为 snprintf 会返回所需的缓冲区大小,而不需要实际写入任何数据。当传入 NULL 指针时,`snprintf` 并不会尝试写入数据,而是仅仅返回格式化后的字符串长度。如果再加上终止符(即 \0),我们就可以知道实际需…...

Renesas R7FA8D1BH (Cortex®-M85) 上超声波测距模块(HC-SR04)驱动开发

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 硬件架构 2.1 硬件框架结构 2.2 测距模块&#xff08;HC-SR04&#xff09;介绍 2.2.1 HC-SR04特性 2.2.2 HC-SR04操作时序 2.2.3 计算距离 3 软件实现 3.1 FSP配置项目 3.1.1 配置IO口的外…...

微信聊天记录永久保存与智能分析:WeChatMsg完全使用指南

微信聊天记录永久保存与智能分析&#xff1a;WeChatMsg完全使用指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…...

优化问题求解器选型指南:何时该用高斯伪谱法,而不是直接法或打靶法?

优化问题求解器选型指南&#xff1a;高斯伪谱法在动态系统控制中的战略定位 当面对化工反应器温度控制或航天器轨道转移这类复杂动态系统优化问题时&#xff0c;工程师们常陷入算法选择的困境。就像外科医生需要根据病灶位置选择手术刀或激光治疗一样&#xff0c;最优控制问题的…...

LangChainJS智能代理开发:构建自主决策的AI系统完整指南

LangChainJS智能代理开发&#xff1a;构建自主决策的AI系统完整指南 【免费下载链接】langchainjs 项目地址: https://gitcode.com/GitHub_Trending/la/langchainjs LangChainJS是一个强大的JavaScript/TypeScript框架&#xff0c;专门用于构建基于大语言模型&#xff…...

基于 eBPF 与 Python 异步代理的嵌入式 OT 网络微隔离架构实战

前言与业务背景最近在主导一个船舶 OT 网络的底层加固项目&#xff0c;遇到了一个典型的边缘计算资源受限问题。根据最新的网络安全规范&#xff08;如 IACS UR E27&#xff09;&#xff0c;边缘节点必须具备跨区域流量的深度过滤以及审计日志的防篡改留存能力。如果照搬传统的…...

Minecraft世界修复全攻略:从数据损坏到完整恢复的专业解决方案

Minecraft世界修复全攻略&#xff1a;从数据损坏到完整恢复的专业解决方案 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/Minecraf…...

不止于读写:在HC32F460上为FATFS和SDIO驱动添加调试信息与性能测试

HC32F460深度优化&#xff1a;FATFS与SDIO驱动的调试技巧与性能压测实战 当你的HC32F460开发板已经能够读取SD卡文件时&#xff0c;真正的挑战才刚刚开始。那些隐藏在初始化失败、数据错位、速度瓶颈背后的秘密&#xff0c;往往需要更精密的调试手段才能揭开。本文将带你超越基…...

7_Harness驾驭工程安全与成本层:DevSecOps与云成本优化

7_Harness驾驭工程安全与成本层&#xff1a;DevSecOps与云成本优化 关键字&#xff1a; DevSecOps、安全测试编排、STO、SAST、DAST、SCA、OPA策略、策略即代码、Rego、软件供应链安全、SBOM、依赖追溯、云成本管理、CCM、FinOps、资源浪费识别、预算告警、RBAC、审计日志、单位…...

Qwen3-14B入门到精通:从环境搭建到多轮工具调用防死循环实战

Qwen3-14B入门到精通&#xff1a;从环境搭建到多轮工具调用防死循环实战 1. 为什么选择Qwen3-14B 在当今企业AI应用场景中&#xff0c;我们常常面临一个两难选择&#xff1a;要么使用功能有限的小模型&#xff0c;要么部署资源消耗巨大的千亿参数模型。Qwen3-14B恰好提供了一…...

s2-pro效果展示:多说话人语音合成(同一模型切换不同音色)

s2-pro效果展示&#xff1a;多说话人语音合成&#xff08;同一模型切换不同音色&#xff09; 1. 专业级语音合成效果展示 s2-pro作为Fish Audio开源的专业级语音合成模型&#xff0c;其最惊艳的能力在于同一模型支持多种音色切换。通过上传不同的参考音频&#xff0c;模型可以…...

免环境配置:Qwen-Image定制镜像让4090D显卡快速跑通视觉语言模型

免环境配置&#xff1a;Qwen-Image定制镜像让4090D显卡快速跑通视觉语言模型 1. 引言 1.1 视觉语言模型的应用价值 在当今AI技术快速发展的背景下&#xff0c;视觉语言模型(VLM)已成为连接计算机视觉与自然语言处理的桥梁。这类模型能够理解图像内容并生成相关文本描述&…...