一、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. Uncaught TypeError: form.attr is not a function 解决办法

    前端form表单提交时遇到个问题,一直报错如下 首先说结论:form是个js对象,不是jQuery对象,不能用jquery对象的方法. 代码是: $(document).ready(function( ...

  2. Heroku发布前准备

    group :development, :test do gem 'byebug', platform: :mri gem 'sqlite3', '~> 1.3.13' end group :p ...

  3. Hillstone设备管理-许可证安装

    1.CLI命令行安装 登录安全网关,运行命令exec license install +许可证,如下图: 系统会提示重启后生效,重启设备即可. 2.web界面安装许可证 1)登录安全网关设备,依次点击 ...

  4. tmux复制模式

    复制模式支持滚屏等操作,进入方法为Ctrl + b再按"[",此时进入所谓的copy-mode 然后就可以用上下键或PageDn/PageUp浏览屏幕了. 想退出copy-mode ...

  5. ELK-Elasticsearch 安装启动

    系统版本:Centos7 Elasticsearch:5.3.1 1:关闭SELinux [root@es local]# sed -i 's/SELINUX=enforcing/SELINUX=di ...

  6. Python:a,*args,**kwargs的理解

    1.何时用这些参数? 在任何时候继承类和重写方法时,应当用到’*args’和’**kwargs’将接收到的位置参数和键值参数给父类方法 . 2.一句话清晰说明: a是常规的变量类型,比如int,str ...

  7. 如何解决出现AXIOS的跨域问题:Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

    转载:https://www.cnblogs.com/caimuqing/p/6733405.html 问题描述: 由于restful接口需要在头部header传递两个字段: Content-Type ...

  8. 201621123002《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  9. CAS SSO单点登录框架学习

    1.了解单点登录  SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用( ...

  10. C# BitArray 二进制处理

    int k = 6; byte[] bytearr = BitConverter.GetBytes(k); BitArray myBA = new BitArray(bytearr); for (in ...