nginx动态添加访问白名单的方法

本文实现的功能是:网站启用访问白名单,对于不在白名单中又需要访问的客户,只需打开一个不公开的网址,然后自动获得2小时的访问权限,时间达到后自动删除访问权限

实现此功能需要以下几个步骤:

  • nginx启用访问白名单
  • 客户打开指定网址自动添加访问白名单
  • 为网址添加简单的认证
  • 每两个小时自动恢复默认白名单,删除临时IP访问权限

一、nginx配置访问白名单

这个就比较简单了,简单贴一下配置:

............nginx.conf...........

geo $remote_addr $ip_whitelist {
default 0;
include ip_white.conf;
}

............server段............

location / {
  if ($ip_whitelist = 1) {
   break;
  }
  return 403;
 }

启用白名单的IP写在ip_white.conf文件中,格式为: 8.8.8.8 1;,只需将IP按照格式写入ip_white.conf中即可获得访问权限。

二、使用LUA自动添加白名单

nginx需配合lua模块才能实现这个功能,新建一个location,客户访问这个location时,使用lua拿到客户IP并调用shell脚本写入ip_white.conf中,写入后自动reload nginx使配置生效,lua代码:

location /addip {
content_by_lua '

CLIENT_IP = ngx.req.get_headers()["X_real_ip"]
if CLIENT_IP == nil then
 CLIENT_IP = ngx.req.get_headers()["X_Forwarded_For"]
end
if CLIENT_IP == nil then
 CLIENT_IP = ngx.var.remote_addr
end
if CLIENT_IP == nil then
 CLIENT_IP = "unknown"
end
 ngx.header.content_type = "text/html;charset=UTF-8";
 ngx.say("你的IP : "..CLIENT_IP.."<br/>");
 os.execute("/opt/ngx_add.sh "..CLIENT_IP.."")
 ngx.say("添加白名单完成,有效时间最长为2小时");
';
}

/opt/ngx_add.sh shell脚本内容:

#!/bin/bash
ngx_conf=/usr/local/nginx/conf/52os.net/ip_white.conf
ngx_back=/usr/local/nginx/conf/52os.net/ip_white.conf.default
result=`cat $ngx_conf |grep $1`

case $1 in

rec)
 rm -rf $ngx_conf
 cp $ngx_back $ngx_conf
  /usr/local/nginx/sbin/nginx -s reload
 ;;

*)
 if [ -z "$result" ]
  then
   echo "#####add by web #####" >>$ngx_conf
   echo "$1 1;" >> $ngx_conf
   /usr/local/nginx/sbin/nginx -s reload
  else
   exit 0
  fi
;;
esac

该脚本有两个功能:

  • 自动加IP并reload nginx
  • 恢复默认的ip_white.conf文件,配合定时任务可以取消非默认IP的访问权限

nginx主进程使用root运行,shell脚本reload nginx需设置粘滞位:

chown root.root /usr/local/nginx/sbin/nginx
chmod 4755 /usr/local/nginx/sbin/nginx

nginx启用lua模块见nginx启用lua模块

三、添加简单的认证

使用base auth 添加简单的用户名密码认证,防止非授权访问,生成密码文件:

代码如下:

printf "52os.net:$(openssl passwd -crypt 123456)\n" >>/usr/local/nginx/conf/pass

账号:52os.net

密码:123456

在刚刚的location中加入:

location /addip {

   auth_basic "nginx auto addIP for 52os.net";
   auth_basic_user_file /usr/local/nginx/conf/pass;
   autoindex on;

......Lua代码略......

四、自动恢复默认IP白名单

通过web获得访问权限的IP,设置访问有效期为两小时,我是通过每两小时恢复一次默认的IP白名单文件实现。把ip_white.conf文件复制一份作为默认的白名单模版:

代码如下:

cp /usr/local/nginx/conf/52os.net/ip_white.conf /usr/local/nginx/conf/52os.net/ip_white.conf.default

使用定时任务每两小时通用上面的shell脚本来恢复,定时任务为:

1 */2 * * * root /opt/ngx_add.sh rec

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Nginx启用GZIP压缩网页传输方法(推荐)

    原理: 浏览器-请求--> 声明可以接受 gzip压缩 或 deflate压缩 或compress 或 sdch压缩 从http协议的角度看–请求头 声明 acceopt-encoding: gzip deflate sdch (是指压缩算法,其中sdch是google倡导的一种压缩方式,目前支持的服务器尚不多) 服务器–>回应-把内容用gzip方式压缩-->发给浏览器 浏览<-–解码gzip-–接收gzip压缩内容-- gzip配置的常用参数 参数 含义 gzip on/off

  • Nginx 禁止IP访问如何实现

    Nginx 禁止IP访问 我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了.下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效最关键的一点是,在server的设置里面添加这一行: listen 80 default; 后面的default参数表示这个是默认虚拟主机. Nginx 禁止IP访问这个设置非常有用. 比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有

  • 微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)

    微信小程序Server环境配置详解 主要内容: 1. SSL免费证书申请步骤 2. Nginx HTTPS 配置 3. TLS 1.2 升级过程 微信小程序要求使用 https 发送请求,那么Web服务器就要配置成支持 https,需要先申请SSL证书 小程序也要求 TLS(传输层安全协议)的版本至少为 1.2,在配置好 https之后,如果 TLS 的版本较低,就涉及到升级问题 所以 Server端环境配置的主要步骤: 申请 SSL 证书 配置web服务器支持https(我使用的是nginx)

  • 微信小程序 Nginx环境配置详细介绍

    微信小程序Server环境配置详解 主要内容: 1. SSL免费证书申请步骤 2. Nginx HTTPS 配置 3. TLS 1.2 升级过程 微信小程序要求使用 https 发送请求,那么Web服务器就要配置成支持 https,需要先申请SSL证书 小程序也要求 TLS(传输层安全协议)的版本至少为 1.2,在配置好 https之后,如果 TLS 的版本较低,就涉及到升级问题 所以 Server端环境配置的主要步骤: 申请 SSL 证书 配置web服务器支持https(我使用的是nginx)

  • 使用MongoDB分析Nginx日志的方法详解

    本文我们要从日志文件中找出IP访问最多的10条记录,然后判断其是否合法,从而采取对应的措施.感兴趣的朋友们一起来看看吧. 日志解析流程 正常情况下,关于Nginx日志解析的流程如下所示: 一般情况下我们会对要解析的日志提前进行切分,常用的方式是按照日期,然后保存1个星期的日志.然后接下来就是日志的解析了,在这个过程中会使用到一些工具或编程语言,例如awk.grep.perl.python. 最后的入库和可视化处理一般视业务而定,没有强制的要求. 日志查询的解决方案 而关于Nginx日志解析的常用

  • 详解nginx过滤url实现前台js的配置问题

    我们在开发的过程中,可能需要一些配置,这些配置可能就是仅仅为了开发的方便,比方说,订单过期时间,生产环境需要半小时失效,但是真正开发时,我不可能等上个半小时,所以这个时间这个失效时间我们会写在配置文件中,这样开发环境和生产环境各一套配置,来回切换很方便的. 基于摘要里的,在Java后台实现很方便,只需要读取properties配置文件即可 但是在前台js,js是在浏览器里执行的,无法读取服务器上的配置,除非请求后台,但是每次的开销也是挺大的,所以这个想法被ps了 这时候可以利用nginx,前台静

  • Nginx配置文件nginx.conf详细说明

    在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; #工作模式及连接数上限 events { use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但

  • Linux下安装配置nginx详解

    一.Linux下安装配置nginx 第一次安装nginx,中间出现的问题一步步解决. 用到的工具secureCRT,连接并登录服务器. 1.1 rz命令,会弹出会话框,选择要上传的nginx压缩包. #rz 1.2 解压 [root@vw010001135067 ~]# cd /usr/local/ [root@vw010001135067 local]# tar -zvxf nginx-1.10.2.tar.gz 1.3 进入nginx文件夹,执行./configure命令 [root@vw0

  • Nginx反向代理一个80端口下配置多个微信项目详解

    Nginx反向代理一个80端口下配置多个微信项目详解 我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑.但是微信公众号接口只支持80接口(80端口).我们因业务需求需要在一个公众号域名下面,发布两个需要微信授权的项目,怎么办? 我们可以用nginx服务器做反向代理来解决这个问题.nginx服务器对外80端口,然后根据URL参数不同,对内访问不同的项目. nginx配置如下: 打开/usr/local/nginx/conf/nginx.conf worker_pr

  • nginx动态添加访问白名单的方法

    本文实现的功能是:网站启用访问白名单,对于不在白名单中又需要访问的客户,只需打开一个不公开的网址,然后自动获得2小时的访问权限,时间达到后自动删除访问权限 实现此功能需要以下几个步骤: nginx启用访问白名单 客户打开指定网址自动添加访问白名单 为网址添加简单的认证 每两个小时自动恢复默认白名单,删除临时IP访问权限 一.nginx配置访问白名单 这个就比较简单了,简单贴一下配置: ............nginx.conf........... geo $remote_addr $ip_w

  • 为Nginx动态添加模块的方法

    写在前面 很多时候,我们根据当时的项目情况和业务需求安装完Nginx后,后续随着业务的发展,往往会给安装好的Nginx添加其他的功能模块.在为Nginx添加功能模块时,要求Nginx不停机.这就涉及到如何为已安装的Nginx动态添加模块的问题.本文,就和小伙伴们一起探讨如何为已安装的Nginx动态添加模块的问题. 为Nginx动态添加模块 这里以安装第三方ngx_http_google_filter_module模块为例. Nginx的模块是需要重新编译Nginx,而不是像Apache一样配置文

  • centOS7 下利用iptables配置IP地址白名单的方法

    编辑iptables配置文件,将文件内容更改为如下,则具备了ip地址白名单功能 #vim /etc/sysconfig/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -N whitelist -A whitelist -s 1.2.3.0/24 -j ACCEPT -A whitelist -s 4.5.6.7 -j ACCEPT -A INPUT -m state --state

  • Nginx为已安装nginx动态添加模块

    这里以安装第三方ngx_http_google_filter_module模块为例 nginx的模块是需要重新编译nginx,而不是像apache一样配置文件引用.so 1. 下载第三方扩展模块ngx_http_google_filter_module # cd /data/software/ # git clone https://github.com/cuber/ngx_http_google_filter_module 2. 查看nginx编译安装时安装了哪些模块 将命令行切换到nginx

  • javascript动态添加删除tabs标签的方法

    本文实例讲述了javascript动态添加删除tabs标签的方法.分享给大家供大家参考.具体实现方法如下: <html> <HEAD> <TITLE>网页对话</TITLE> <LINK href="style.css" type=text/css rel=stylesheet> <script> function $(obj) { var o = typeof(obj)=="object" ?

  • jQuery使用toggleClass方法动态添加删除Class样式的方法

    本文实例讲述了jQuery使用toggleClass方法动态添加删除Class样式的方法.分享给大家供大家参考.具体分析如下: jQuery通过toggleClass方法动态添加删除Class,一次执行相当于addClass,再次执行相当于removeClass,运行下面的代码点击按钮可以看到文本段落字体在蓝色和黑色间切换 <!DOCTYPE html> <html> <head> <script src="js/jquery.min.js"&

  • ASP.NET动态添加用户控件的方法

    本文实例讲述了ASP.NET动态添加用户控件的方法.分享给大家供大家参考.具体实现方法如下: 为了让用户控件能ASP.NET页面实现动态添加,首先写一个接口IGetUCable,这个接口有一个函数,返回对象类型是UserControl. using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; /// <summary> /// Summar

  • asp.net为网页动态添加description描述信息的方法

    本文实例讲述了asp.net为网页动态添加description描述信息的方法.分享给大家供大家参考.具体分析如下: 这段代码可以修改网页的head区的description meta HtmlMeta desc = new HtmlMeta(); desc.Name = "Description"; desc.Content = "描述"; Page.Header.Controls.Add(desc); 希望本文所述对大家的asp.net程序设计有所帮助.

  • php动态添加url查询参数的方法

    本文实例讲述了php动态添加url查询参数的方法.分享给大家供大家参考.具体分析如下: 这段代码可以动态为url添加key-value查询参数,如果参数已经存在则会用新的进行覆盖 function add_querystring_var($url, $key, $value) { $url=preg_replace('/(.*)(?|&)'.$key.'=[^&]+?(&)(.*)/i','$1$2$4',$url.'&'); $url=substr($url,0,-1);

  • jQuery实现动态添加tr到table的方法

    本文实例讲述了jQuery实现动态添加tr到table的方法.分享给大家供大家参考,具体如下: 运行效果图如下: 完整代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" co

随机推荐