一、Nginx访问控制模块

  Nginx默认安装的模块http_access_module,可以基于来源IP进行访问控制.

  1.模块安装

  nginx中内置ngx_http_access_module,除非编译安装时指定了–without-http_access_module。

  2.指令

  allow、deny

  语法: allow address | CIDR | unix: | all;

  默认值: –

  配置段: http, server, location, limit_except

  允许或者禁止某个ip或者一个ip段访问。如果指定unix:,那将允许或者禁止socket的访问,unix在1.5.1才新加入。

  3.示例

   location / {
  deny 192.168.1.1;
  allow 192.168.1.0/24;
  allow 10.1.1.0/16;
  allow 2001:0db8::/32;
  deny all;
  }

  从上到下的顺序,类似iptables。匹配到了便跳出。如上的例子先禁止了192.16.1.1,接下来允许了3个网段,其中包含了一个ipv6,最后未匹配的IP全部禁止访问.

  被deny的将返回403状态码。

  该方案缺陷:nginx内置的http_access_module只能针对remote_addr进行来源IP的限制,如果用户和服务器之间加入了CDN或者其他代理,remote_addr记录的则是CDN节点的IP地址,无法做到有效的基于来源IP的访问控制。

二、支持CDN的Nginx来源IP访问控制

  在经过了CDN节点后,用户端的真实IP地址将会被隐藏,无法通过remote_addr来做到有效的IP访问控制。

  大部分的的CDN服务商都会将用户的真是IP加入到http header的http_x_forwarded_for这个变量中(当然,这个http header是可以被伪造的)

  也有部分CDN厂商使用了自定义的变量,比如网宿科技使用http_cdn_src_ip这个变量

  这里不讨论http header伪造的问题,这里的目的只是为了能够获取到用户的真实IP,如果条件允许,你完全可以使用其他的自定义变量来获取用户真实IP

  下面直接来看Nginx具体配置:

location / {
set $httpcode 403;
if ( $remote_addr ~* “10.0.0|192.168.1|172.16.0.1” ) {    # 匹配10.0.0.0/24,192.168.1.0/24,172.16.0.1
set $httpcode 200;
}
if ( $http_x_forwarded_for ~* “118.89.174.181” ) {    # 匹配118.89.174.181
set $httpcode 200;
}
if ( $http_cdn_src_ip ~* “118.89.174.181” ) {    # 匹配118.89.174.181
set $httpcode 200;
}
if ( $httpcode = 403 ) {
return 403;
}
}

  配置解释:

  首先要考虑到用户行为,用户有可能直接访问服务器(对应的变量为remote_addr),也可能是通过阿里云的CDN节点(假设,对应的变量为http_x_forwarded_for),也可能是通过网宿的CDN节点(假设,对应的变量为http_cdn_src_ip),这时候就需要对不同的场景配置IP访问控制。

我的方法是,先设置一个变量httpcode=403,然后进行if判断,如果对应的变量只要有一条匹配定义的IP地址,则设置httpcode=200,最后判断httpcode的值,如果是403(IP全部未匹配)则返回403拒绝访问,否则允许访问。

Nginx访问控制模块的更多相关文章

  1. nginx 访问控制模块

    截图,代码截屏均引用自慕课网nginx相关教学视频 基于用户的访问控制模块 http_access_module 基于用户登录信任的模块 http_access_module 参数示意:address ...

  2. 6、架构--Nginx虚拟主机(基于多ip、端口、域名方式)、日志配置、Nginx模块(访问控制模块、状态监控模块、访问链接控制模块)

    笔记 1.晨考 2.昨日问题 3.今日内容 1.Nginx虚拟主机 - 基于多IP的方式 - 基于多端口的方式 - 基于多域名的方式 2.日志配置 Nginx有非常灵活的日志记录模式,每个级别的配置可 ...

  3. nginx 访问频率控制

    Nginx访问频率控制 HTTP服务器的吞吐率(单位时间吞吐量)通常有一个上限,尤其是普通配置的机器,在带宽够的情况下,用压测工具经常能把服务器压出翔,为了线上环境稳定性,防止恶意攻击影响到其他用户, ...

  4. Nginx 访问日志轮询切割

    Nginx 访问日志轮询切割脚本 #!/bin/sh Dateformat=`date +%Y%m%d` Basedir="/application/nginx" Nginxlog ...

  5. 按日期切割nginx访问日志--及性能优化

    先谈下我们需求,一个比较大的nginx访问日志,根据访问日期切割日志,保存在/tmp目录下. 测试机器为腾讯云机子,单核1G内存.测试日志大小80M. 不使用多线程版: #!/usr/bin/env ...

  6. 一、基于hadoop的nginx访问日志分析---解析日志篇

    前一阵子,搭建了ELK日志分析平台,用着挺爽的,再也不用给开发拉各种日志,节省了很多时间. 这篇博文是介绍用python代码实现日志分析的,用MRJob实现hadoop上的mapreduce,可以直接 ...

  7. Python正则表达式,统计分析nginx访问日志

    目标: 1.正则表达式 2.oop编程,统计nginx访问日志中不同IP地址出现的次数并排序 1.正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  8. logstash收集nginx访问日志

    logstash收集nginx访问日志 安装nginx #直接yum安装: [root@elk-node1 ~]# yum install nginx -y 官方文档:http://nginx.org ...

  9. 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页

    使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...

随机推荐

  1. CodeWarrior 10 添加/修改 头文件路径

    当使用CodeWarrior 10时,默认使用大名鼎鼎的GCC编译器. 我们在构建工程的时候,往往按模块分类文件夹,那么就存在需要包含头文件路径的问题.那么如何加入头文件的路径呢?见下文. 1.打开工 ...

  2. jsp九个内置对象、四个域对象及Servlet的三大域对象

    一,什么是内置对象? 在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创 ...

  3. Vue-input框checkbox强制刷新

    在引用input框的checkbox属性时,选中后会出现数据已经刷新,checkbox选中状态不会改变.这时在事件触发后可以调用this.$forceUpdate(),强制刷新页面解决这个问题. in ...

  4. tiny4412 --Uboot移植(5) DDR3内存

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  5. 将Windows系统移到另一个硬盘

    原先的128GB SSD,给Windows用是够了,最近虚拟机用得多,靠以前的SSD外挂着用,实在有点不爽,就入手一个256GB的,重装系统是个令人头疼的事情,当然不能干.想起来以前另一个机器操作的时 ...

  6. MVC Request生命周期(综合总结)

    当用户在浏览器输入一个URL地址后,浏览器会发送一个请求到服务器.这时候在服务器上第一个负责处理请求的是IIS.然后IIS再根据请求的URL扩展名将请求分发给不同的处理程序处理. 流程如下: 当请求一 ...

  7. 进军的socket

    在学socket有时候我们会遇到这种问题: 解决方法一: 在服务端中加入:severTCP.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ...

  8. 递归求6的阶乘(考虑int类型溢出)

    编码 public class Factorial { public static void main(String[] args) { System.out.println(fac(6)); } p ...

  9. go的包下载失败解决方案

    包被墙的方案 1 翻啊的墙 2 gopm 3 https://github.com/golang/net 4 使用国内网站打包 5 export GOPROXY=https://goproxy.io

  10. sparse_matrix

    (1)ndarray 与 scipy.sparse.csr.csr_matrix 的互转 import numpy as npfrom scipy import sparse 1.1 ndarry 转 ...