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

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

webapp地址

F:\LSP\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

nginx介绍及常用功能

什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务。 Apache:重量级的,不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。这些都决定了Apache不可能成为高性能WEB服务器  nginx:

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A