Nginx R31 doc-14-Dynamic Denylisting of IP Addresses 动态拒绝IP地址

2024-05-28 00:52

本文主要是介绍Nginx R31 doc-14-Dynamic Denylisting of IP Addresses 动态拒绝IP地址,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

大家好,我是老马。很高兴遇到你。

我们为 java 开发者实现了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何处理的,可以参考我的另一个项目:

手写从零实现简易版 tomcat minicat

手写 nginx 系列

如果你对 netty 不是很熟悉,可以读一下

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

从零手写实现 nginx-02-nginx 的核心能力

从零手写实现 nginx-03-nginx 基于 Netty 实现

从零手写实现 nginx-04-基于 netty http 出入参优化处理

从零手写实现 nginx-05-MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

从零手写实现 nginx-06-文件夹自动索引

从零手写实现 nginx-07-大文件下载

从零手写实现 nginx-08-范围查询

从零手写实现 nginx-09-文件压缩

动态拒绝IP地址

使用NGINX Plus的键值存储和API,您可以控制特定客户端IP地址对站点或应用程序的访问权限,创建和维护IP地址的动态拒绝列表或允许列表。

概述

在NGINX Plus Release 13(R13)及更高版本中,您可以拒绝一些IP地址,并创建和维护一个包含拒绝IP地址的数据库。

您还可以明确地允许其他IP地址。IP地址数据库通过NGINX Plus API和keyval模块进行管理。

NGINX Plus Release 19(R19)通过将IP地址与子网或网络范围中的任何地址进行匹配,扩展了此功能。

先决条件

NGINX Plus Release 13及更高版本,NGINX Plus Release 19及更高版本支持网络范围。

设置

首先,启用用于存储拒绝和允许的IP地址列表的数据库。

在NGINX Plus配置文件中,在http上下文中包含keyval_zone指令,以创建一个用于存储键和值的内存区域。此示例指令创建了一个名为one的1兆字节区域。

http {# ...keyval_zone zone=one:1m;}

要执行IP地址与子网(例如,192.168.13.0/24)的匹配,请指定keyval_zone指令的type=ip参数:

http {# ...keyval_zone zone=one:1m type=ip;}

请注意,由于type=ip参数还在区域中启用了一个额外的索引,因此keyval_zone的大小也应相应增加。

您还可以使用state参数来创建一个文件,其中存储了键值数据库,因此可以在NGINX Plus重新加载和重新启动时保持。在此示例中,为one.keyval:

keyval_zone zone=one:1m state=one.keyval;

使用api指令将NGINX Plus API启用为读-写模式:

# ...server {listen 80;server_name www.example.com;location /api {api write=on;}}

我们强烈建议限制对此位置的访问,例如仅允许从本地主机(127.0.0.1)访问,并使用HTTP基本身份验证将使用PATCH、POST和DELETE方法的使用限制为指定的一组用户:

# ...server {listen 80;server_name www.example.com;location /api {api   write=on;allow 127.0.0.1;deny  all;limit_except GET {auth_basic "NGINX Plus API";auth_basic_user_file /path/to/passwd/file;}}}

使用API的POST方法将键值对数据库填充数据,以JSON格式提供数据。您可以像以下示例中那样使用curl命令。如果区域为空,则可以一次输入多个键值对;否则,必须逐个添加对。

$ curl -X POST -d '{"10.0.0.1": "1","10.0.0.2": "1","10.0.0.3": "0","10.0.0.4": "0"}' -s http://www.example.com/api/6/http/keyvals/one

如果已经指定了IP地址与网络范围的匹配(使用keyval_zone指令的type=ip参数),请以CIDR表示法发送带有网络范围的POST命令:

$ curl -X POST -d '{"192.168.13.0/24": "1"}' -s http://www.example.com/api/6/http/keyvals/one

通过在http上下文中包含keyval指令,定义如何根据客户端IP地址与键值数据库进行匹配。

该指令利用了标准的NGINX和NGINX Plus变量$remote_addr,该变量自动设置为每个请求的客户端IP地址。

在处理每个请求时,NGINX Plus:

在键值数据库中查找第一个参数(这里是$remote_addr,自动设置为客户端的IP地址)在zone=参数指定的键值数据库中。如果数据库中的键与$remote_addr完全匹配,则将第二个参数(这里是$target)设置为与键对应的值。在我们的示例中,拒绝列表中的地址值为1,允许列表中的地址值为0。

http {# ...keyval_zone zone=one:1m type=ip state=one.keyval;keyval $remote_addr $target zone=one; # Client addressis the key,# $target is the value;}

使用if指令创建规则,根据客户端IP地址允许或拒绝访问。通过这个规则,当$target为0时允许访问,当$target为1时拒绝访问:

if ($target) {return 403;
}

此方法允许您动态地创建和更新拒绝IP地址列表,并根据需要阻止或允许特定的客户端IP地址访问您的站点或应用程序。

管理键-值数据库

使用 API 方法动态更新键-值数据库,无需重新加载 NGINX Plus。

以下示例均操作一个区域,在 http://www.example.com/api/6/http/keyvals/one 可访问。

获取区域的所有数据库条目列表:

curl -X GET 'http://www.example.com/api/6/http/keyvals/one'

更新现有条目的值(例如,将 IP 地址 10.0.0.4 的访问状态从允许更改为拒绝):

curl -X PATCH -d '{"10.0.0.4": "1"}' -s 'http://www.example.com/api/6/http/keyvals/one'

向已填充的区域添加条目:

curl -X POST -d '{"10.0.0.5": "1"}' -s 'http://www.example.com/api/6/http/keyvals/one'

删除条目:

curl -X PATCH -d '{"10.0.0.4":null}' -s 'http://www.example.com/api/6/http/keyvals/one'

完整示例

完整的 NGINX Plus 配置:

http {# ...keyval_zone zone=one:1m type=ip state=one.keyval;keyval $remote_addr $target zone=one;server {listen 80;server_name www.example.com;location /api {api   write=on;allow 127.0.0.1;deny  all;limit_except GET {auth_basic "NGINX Plus API";auth_basic_user_file /path/to/passwd/file;}}if ($target) {return 403;}}
}

此配置:

  • 创建了一个 1 MB 的 keyval 区域 one,接受网络范围,并创建文件 one.keyval 以使键-值对数据库在 NGINX Plus 重新加载和重启时保持持久化。
  • 启用了 NGINX Plus API 写入模式,以便使用 IP 地址填充区域。
  • 启用了将 IP 地址 $remote_addr 在键-值数据库中查找的功能,将找到的键的值放入 $target 变量。
  • 启用了一个简单的规则来检查结果值:如果 $target 的值为 1(地址在拒绝列表中),则向客户端返回 403(禁止)。

以下 curl 命令将空的 keyval 区域 one 填充了拒绝列表(值为 1)或允许列表(值为 0)的 IP 地址:

$ curl -X POST -d '{"10.0.0.1": "1","192.168.13.0/24": "1","10.0.0.3": "0","10.0.0.4": "0"
}' -s 'http://www.example.com/api/6/http/keyvals/one'

参见

使用 NGINX Plus 和 fail2ban 进行动态 IP 拒绝列表

参考资料

https://docs.nginx.com/nginx/admin-guide/security-controls/denylisting-ip-addresses/

这篇关于Nginx R31 doc-14-Dynamic Denylisting of IP Addresses 动态拒绝IP地址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1009084

相关文章

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模