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 ...
随机推荐
- excle 内部 超链接(锚点)
超连接对象: 1.文档 2.本文档中的位置. 3. 本文重点 指定 链接到 xx表中的xx位置. 第三种连接 类似于 web文档的中 锚点 超连接 看下图 选 择本文档中的位置, 选择 工作表. ...
- laravel view not found
在windows开发的laravel项目,部署到Linux服务器找不到视图,代码格式可能是这样的 return view('news\list'); 原因是在Linux下不能识别反斜杠路径,解决办法是 ...
- vim matchit 自定义配对关键字之间的跳转
vim因其强大的扩展性一直深受linux程序员的喜爱,最近在用vim写verilog的时候,由于一个逻辑块中的begin end较多,常常会多写或者漏掉匹配关键字,很是苦恼,于是寻找匹配关键字间跳转的 ...
- Nevertheless 和 Nonetheless,你用对了吗?
本文转自:https://www.sohu.com/a/229443257_338773 Nevertheless 以及 nonetheless 都可以表示转折.很多人很多课程也提到这两者基本上可以交 ...
- 有关ajax的理解;
jQuery是JavaScript封装的一个库,里面封装了一些便于我们使用的方法,同时还有$.ajax()的一些理解需要我们更加深入了解 ajax简介: 实现后台与前台交互的功能或方法就叫做ajax: ...
- select 两层 第二个select需要加别名
select t.id from (select xxx) t
- iframe和form表单实现ajax请求上传数据
form的target属性设置为iframe的name值时,表示提交到url后返回的数据显示到iframe区域 <form action="/upload.html" met ...
- RequestMethod.Post&RequestMethod.GET
1.GET和POST都是将数据送到服务器 2.GET通过URL请求传递用户的数据,将表单各字段名称以及内容,以成对的字符串连接,置于action所指程序的URL后:POST方法通过HTTP post ...
- PNP的学习-P3P
PNP方法是为了解决在当前两帧图像中,已知前一帧图像上的3dLandmark点和当前帧的2d特征点,求取当前帧的pose. PNP主要有P3P.EPNP.UPNP.DLT.MRE(LS Iterati ...
- Mysql双主互备+keeplived高可用架构(部分)
一.Mysql双主互备+keeplived高可用架构介绍 Mysql主从复制架构可以在很大程度保证Mysql的高可用,在一主多从的架构中还可以利用读写分离将读操作分配到从库中,减轻主库压力.但是在这种 ...