Nginx访问控制模块
一、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访问控制模块的更多相关文章
- nginx 访问控制模块
截图,代码截屏均引用自慕课网nginx相关教学视频 基于用户的访问控制模块 http_access_module 基于用户登录信任的模块 http_access_module 参数示意:address ...
- 6、架构--Nginx虚拟主机(基于多ip、端口、域名方式)、日志配置、Nginx模块(访问控制模块、状态监控模块、访问链接控制模块)
笔记 1.晨考 2.昨日问题 3.今日内容 1.Nginx虚拟主机 - 基于多IP的方式 - 基于多端口的方式 - 基于多域名的方式 2.日志配置 Nginx有非常灵活的日志记录模式,每个级别的配置可 ...
- nginx 访问频率控制
Nginx访问频率控制 HTTP服务器的吞吐率(单位时间吞吐量)通常有一个上限,尤其是普通配置的机器,在带宽够的情况下,用压测工具经常能把服务器压出翔,为了线上环境稳定性,防止恶意攻击影响到其他用户, ...
- Nginx 访问日志轮询切割
Nginx 访问日志轮询切割脚本 #!/bin/sh Dateformat=`date +%Y%m%d` Basedir="/application/nginx" Nginxlog ...
- 按日期切割nginx访问日志--及性能优化
先谈下我们需求,一个比较大的nginx访问日志,根据访问日期切割日志,保存在/tmp目录下. 测试机器为腾讯云机子,单核1G内存.测试日志大小80M. 不使用多线程版: #!/usr/bin/env ...
- 一、基于hadoop的nginx访问日志分析---解析日志篇
前一阵子,搭建了ELK日志分析平台,用着挺爽的,再也不用给开发拉各种日志,节省了很多时间. 这篇博文是介绍用python代码实现日志分析的,用MRJob实现hadoop上的mapreduce,可以直接 ...
- Python正则表达式,统计分析nginx访问日志
目标: 1.正则表达式 2.oop编程,统计nginx访问日志中不同IP地址出现的次数并排序 1.正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- ...
- logstash收集nginx访问日志
logstash收集nginx访问日志 安装nginx #直接yum安装: [root@elk-node1 ~]# yum install nginx -y 官方文档:http://nginx.org ...
- 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页
使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...
随机推荐
- 20175314 《Java程序设计》第七周学习总结
20175314 <Java程序设计>第七周学习总结 教材学习内容总结 第八章:常用实用类 String()类代表字符串:Java 程序中的所有字符串字面值(如 "abc&quo ...
- tensorflow源码阅读(c++)(一)
root/tensorflow/core |--common_runtime # 公共运行库 |--distributed_runtime # 分布式执行模块,含有grpc session, grpc ...
- JavaWeb练习-网上名片管理系统
实验项目名称 JavaWeb网上名片管理系统 实验目的 实现名片的增.删.改.查等操作. 实验基本原理 JSP指令.JSP动作.JSP内置对象等 主要仪器设备及耗材 Win10.Myeclipse 实 ...
- Redis master/slave,sentinel,Cluster简单总结
现在互联网项目中大量使用了redis,本文著主要分析下redis 单点,master/slave,sentinel模式.cluster的一些特点. 一.单节点模式 单节点实例还是比较简单的,平时做个测 ...
- hbase——b树,b+树,lsm树
b树 b树,又叫做平衡多路查找树.一个m阶的b树的特性如下: 树中的每个节点,最多有m个子节点. 除了根节点之外,其他的每个节点至少有ceil(m/2)个子节点,ceil函数为取上限函数. 所有的叶子 ...
- 设计模式学习心得<外观模式 Facade>
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...
- java 日志体系目录
java 日志体系目录 1.1 java 日志体系(一)log4j1.log4j2.logback.jul.jcl.slf4j 1.2 java 日志体系(二)jcl 和 slf4j 2.1 java ...
- 修改pudb颜色
2019-02-19,18点20vim调整颜色vim ~/.vimrc 这个pudb的配色用上的方法改不了.调试状态时候按o和回车能切换console和调试界面. 成功了.通过修改pudb源代码来实现 ...
- 关于学习python的想法
选择学习python,就是一次对自己的挑战.自己之前并没有python的基础,只是学习了一点C语言的知识.对于这个课程了解的不是很多,只是上学期在网上自学了一点,自己也是对这门语言感兴趣,所以这个学期 ...
- linux简单安装方法
一.配置静态IP NAT:模式: 修改网卡eth0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 内容如下: DEVICE=eth0 HWADDR=:0C ...