一、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. 20175314 《Java程序设计》第七周学习总结

    20175314 <Java程序设计>第七周学习总结 教材学习内容总结 第八章:常用实用类 String()类代表字符串:Java 程序中的所有字符串字面值(如 "abc&quo ...

  2. tensorflow源码阅读(c++)(一)

    root/tensorflow/core |--common_runtime # 公共运行库 |--distributed_runtime # 分布式执行模块,含有grpc session, grpc ...

  3. JavaWeb练习-网上名片管理系统

    实验项目名称 JavaWeb网上名片管理系统 实验目的 实现名片的增.删.改.查等操作. 实验基本原理 JSP指令.JSP动作.JSP内置对象等 主要仪器设备及耗材 Win10.Myeclipse 实 ...

  4. Redis master/slave,sentinel,Cluster简单总结

    现在互联网项目中大量使用了redis,本文著主要分析下redis 单点,master/slave,sentinel模式.cluster的一些特点. 一.单节点模式 单节点实例还是比较简单的,平时做个测 ...

  5. hbase——b树,b+树,lsm树

    b树 b树,又叫做平衡多路查找树.一个m阶的b树的特性如下: 树中的每个节点,最多有m个子节点. 除了根节点之外,其他的每个节点至少有ceil(m/2)个子节点,ceil函数为取上限函数. 所有的叶子 ...

  6. 设计模式学习心得<外观模式 Facade>

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

  7. java 日志体系目录

    java 日志体系目录 1.1 java 日志体系(一)log4j1.log4j2.logback.jul.jcl.slf4j 1.2 java 日志体系(二)jcl 和 slf4j 2.1 java ...

  8. 修改pudb颜色

    2019-02-19,18点20vim调整颜色vim ~/.vimrc 这个pudb的配色用上的方法改不了.调试状态时候按o和回车能切换console和调试界面. 成功了.通过修改pudb源代码来实现 ...

  9. 关于学习python的想法

    选择学习python,就是一次对自己的挑战.自己之前并没有python的基础,只是学习了一点C语言的知识.对于这个课程了解的不是很多,只是上学期在网上自学了一点,自己也是对这门语言感兴趣,所以这个学期 ...

  10. linux简单安装方法

    一.配置静态IP NAT:模式: 修改网卡eth0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 内容如下: DEVICE=eth0 HWADDR=:0C ...