Nginx 访问限制模块 ngx_http_access_module

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

Nginx往期博文

Nginx 多环境安装与配置

Nginx命令行参数全解

Nginx 常用配置文件详解

  Nginx安装时默认安装了ngx_http_access_module模块,ngx_http_access_module允许限制对某些客户端地址的访问。

  ngx_http_access_module模块很简单,提供了黑名单和白名单功能,分别通过allow和deny参数进行配置。

  配置参数

  allow address | CIDR | unix: | all;

​    白名单配置。

  deny address | CIDR | unix: | all;

    黑名单配置。

  allow和deny都提供四种方式进行配置,下面来看下这四种配置方式:

  · address:

  IP地址方式配置,例如:192.168.20.1.

  · CIDR:

  CIDR可能是平常不太接触的一种地址表示格式。CIDR(Classes Inter-Domain Routing)可以将路由集中起来,在路由表中更灵活地定义地址,它不区分A类、B类、C类地址,而使用CIDR前缀的值指定地址中作为网络ID的位数。

  CIDR 标记使用一个斜线/分隔符,后面跟一个十进制数值表示地址中网络部分所占的位数。更加通俗的来讲,斜杠左边是网络块的IP,斜杠右边是网络块的掩码。通过设定掩码的大小,可以调整网络块的大小。网络块包含的IP数=2(32-掩码),例如:192.168.20.32/27实际表示了192.168.20.32及其之后的2(32-27)=32个IP,经过计算直到192.168.20.63。

  · unix:

  如果unix:指定了特殊值(1.5.1),则允许或拒绝访问所有UNIX域套接字。

  · all:

  允许或拒绝所有条件。

  默认配置

  对于黑白名单的演示,我们使用Nginx安装的默认配置文件,为了查看更清晰,我们将nginx.conf中注释暂时清理掉,只保留有用信息:
在这里插入图片描述
  静态黑白名单

  一般情况下,Nginx默认提供静态的黑白名单配置,也就是说,当黑白名单发生需要变化时,需要手动更改配置文件,重新加载配置,以达到更新黑白名单的目的。

  首先在location块下增加allow和deny的配置,./nginx(启动)或./nginx -s reload(重新加载)操作Nginx。

  下面,在location块中增加allow 192.168.20.36;,配置如下:
在这里插入图片描述
  此时,使用的是白名单策略,将192.168.20.36设置到白名单中,可以正常访问Nginx服务:
在这里插入图片描述
  接下来,将配置有allow更改为deny,配置变为deny 192.168.20.36;,配置如下:
在这里插入图片描述
  此时,使用的是黑名单策略,将192.168.20.36设置到黑名单中,访问Nginx服务则会提示403 Forbidden:
在这里插入图片描述
​  上面演示的是针对单一IP的配置,使用时可以配置多IP、多协议,像官网提供示例一样:
在这里插入图片描述
  当同一地址既配置了deny,也配置了allow,则以在前的配置为准。

  动态黑白名单

  Nginx动态白名单分为两种:

  · 定时拉取白名单信息,重置配置,平滑重启Nginx,达到更新黑白名单的目的。此种方案较为简单,不会过多引入三方依赖,但方案不成体系。

  · 通过Lua脚本语言拉取白名单信息,并在location块中使用黑白名单进行过滤。常用的方式包括Nginx+Lua+Redis或Nginx+Lua+MySql。此种方案较为复杂,但在稳定性等方面,都有很好的保证。

  本文演示第一种方式,第二种方式会在今后的博文中更新,请持续关注。

  · include 配置黑白名单

  Nginx提供了include命令,可以将命令进行分块引入,在/usr/local/nginx/conf/目录下新建两个文件white.ip和black.ip用于存放白名单和黑名单:

  white.ip:

allow 192.168.20.1;
allow 192.168.20.2;

  black.ip:

deny 192.168.20.11;
deny 192.168.20.12;

  在nginx.conf直接引入white.ip和black.ip,即可引入白名单和黑名单。
在这里插入图片描述
  此时,只需要动态更新white.ip和black.ip文件,并配合./nginx -s reload命令,就能达到动态配置黑白名单的目的。

  · 动态拉取黑白名单

  使用Linux提供的Crontab定时任务来定时从指定服务拉取white.ip、black.ip,在配置定时任务之前,需要在/usr/local/nginx/conf/目录下新建脚本,如下:

  uptwhiteblack.sh

#!/bin/bash
# 删除white.ip,重新下载white.ip.
rm -rf /usr/local/nginx/conf/white.ip
# http://192.168.20.36/是某台机器服务.
wget -P /usr/local/nginx/conf/  http://192.168.20.50/white.ip
# 删除black.ip,重新下载black.ip.
rm -rf /usr/local/nginx/conf/black.ip
# http://192.168.20.36/是某台机器服务.
wget -P /usr/local/nginx/conf/ http://192.168.20.50/black.ip
# 平滑重启Nginx
/usr/local/nginx/sbin/nginx -s reload

  使用 crontab -e 编辑定时任务:

# 每分钟执行一次uptwhiteblack.sh脚本.
* * * * * /usr/local/nginx/conf/uptwhiteblack.sh

  最后使用 service crond restart 重启定时任务即可。

  经过上面步骤的配置,Linux定时任务可以每分钟从http://192.168.20.50/拉取white.ip和black.ip,并平滑重启Nginx。此时,只需更新http://192.168.20.50/服务中的white.ip和black.ip,就可以实现动态黑白名单的配置。

  · 动态黑白名单演示

  环境情况说明:Nginx服务器IP为192.168.20.9,white.ip和black.ip动态文件服务器IP为192.168.20.50,访问Nginx服务客户端IP为192.168.20.36。

  初始时,192.168.20.50服务的white.ip和black.ip内容为空,此时在192.168.20.36上访问Nginx服务,可以正常访问。

  接下来,编辑192.168.20.50服务的black.ip,增加一条deny 192.168.20.36;,等待最长一分钟时间后,访问Nginx服务,提示403 Forbidden:
在这里插入图片描述
  总结

  Nginx实现反向代理时,访问控制是不可或缺的一个功能,实际应用时,可以根据服务的复杂程度,来选择更加合适的方案,没有一种方案可以完美的适应任意场景,我们需要做的是根据业务场景,选择合适的解决方案。

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/109067385