Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法 | 张戈博客

  • 时间:
  • 浏览:10
  • 来源:木木娱乐网_提供晓轩资源网技术_技术QQ网资讯

最近老要在帮有另1个 购买了张戈博客付费服务的让我们 做网站防护,为了简单抵挡一下竞争对手的DDoS攻击,他给网站开启了Incapsula的免费CDN服务。

开启CDN事先,我事先给他写的Shell防护脚本也就否认无效了,事先不管是正常访问还是攻击访问,脚本拿到的IP后后 CDN节点的,而我不事先把CDN的节点IP也给禁用了,那就后后 能访问了。

为了防止你一点窘迫,我让你到了事先就看的Nginx访问限制。通过查资料,我让你拜读了一枚大神的神作,感觉收获颇丰!于是转过来采集一下,分享给更多时要的人!


Nginx 有有另1个 模块用于控制访问“数量”和“下行速率 ”,简单的说,控制你最多同时有 十几块 个访问,后后控制你每秒钟最多访问十几块 次, 你的同时并发访问只有不多,就说 能太快了 ,不然就“杀无赦”。

HttpLimitZoneModule    限制同时并发访问的数量

HttpLimitReqModule      限制访问数据,每秒内最多十几块 请求

一、普通配置

你一点叫普通配置?

普通配置就说 针对【用户浏览器】→【网站服务器】你一点常规模式的nginx配置。没人,事先我让你对单IP做访问限制,绝大多数教程后后 曾经写的:

## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址最多有 3000 个并发连接
## 你想开 几千个连接 刷死我? 超过 3000 个连接,直接返回 30003 错误让你,根本不防止你的请求了
limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;
limit_conn  TotalConnLimitZone  3000;
limit_conn_log_level notice;

## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址每秒防止 10 个请求
## 你想用守护进程每秒几百次的刷我,没戏,再快了就不防止了,直接返回 30003 错误让你
limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m  rate=10r/s;
limit_req_log_level notice;

## 具体服务器配置
server {
	listen   3000;
	location ~ \.php$ {
                ## 最多 5 个排队, 事先每秒防止 10 个请求 + 1个排队,你一秒最多发送 15 个请求过来,再多就直接返回 30003 错误让你了
		limit_req zone=ConnLimitZone burst=5 nodelay;
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		include	fastcgi_params;
	}	

}

曾经有另1个 最简单的服务器安全限制访问就完成了,你一点基本上你 Google 一搜索能搜索到  90% 的网站后后 你一点例子,后后还强调用“$binary_remote_addr”可不才能节省内存类似的云云。

二、CDN事先

目前国内事先争相再次老出了百度云加速、加速乐、3300网站卫士以及安全宝等免费CDN。让让我们 你一点小网站才能免费享受事先高大上的CDN加速服务。

于是,网站的访问模式就变为:

用户浏览器 → CDN节点 → 网站源服务器

甚至是更多样化的模式:

用户浏览器 → CDN节点(CDN入口、CC\DDoS攻击流量清洗等) → 阿里云盾 → 源服务器

可不才能就看,让我们 的网站后边经历了好几层的透明加速和安全过滤, 你一点具体情况下,让我们 就只有用后边的“普通配置”。事先普通配置中基于【源IP的限制】的结果就说 ,让我们 把【CDN节点】事先【阿里云盾】给限制了,事先这里“源IP”地址不再是真实用户的IP,就说 后边CDN节点的IP地址。

让我们 时要限制的是最前面的真实用户,而后后 后边为让我们 做加速的加速服务器。

人太好,当有另1个 CDN 事先透明代理服务器把用户的请求转到后边服务器的事先,你一点 CDN 服务器会在 Http 的头中加入有另1个 记录

X-Forwarded-For :  用户IP, 代理服务器IP

事先后边经历了不止有另1个 代理服务器,你一点记录会是曾经

X-Forwarded-For :  用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ….

可不才能就看经过好多层代理事先, 用户的真实IP 在第有另1个 位置, 后边会跟一串后边代理服务器的IP地址,从这里取到用户真实的IP地址,针对你一点 IP 地址做限制就可不才能了。

没人针对CDN模式下的访问限制配置就应该曾经写:

## 这里取得原始用户的IP地址
map $http_x_forwarded_for  $clientRealIp {
	""	$remote_addr;
	~^(?P<firstAddr>[0-9\.]+),?.*$	$firstAddr;
}

## 针对原始用户 IP 地址做限制
limit_conn_zone $clientRealIp zone=TotalConnLimitZone:20m ;
limit_conn  TotalConnLimitZone  3000;
limit_conn_log_level notice;

## 针对原始用户 IP 地址做限制
limit_req_zone $clientRealIp zone=ConnLimitZone:20m  rate=10r/s;
#limit_req zone=ConnLimitZone burst=10 nodelay; #事先开启此条规则,burst=10的限制事先在nginx全局生效
limit_req_log_level notice;

## 具体Server:如下在监听php部分新增限制规则即可
server {
	listen   3000;
	location ~ \.php$ {
                ## 最多 5 个排队, 事先每秒防止 10 个请求 + 1个排队,你一秒最多发送 15 个请求过来,再多就直接返回 30003 错误让你了
		limit_req zone=ConnLimitZone burst=5 nodelay;

		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		include	fastcgi_params;
	}	

}

三、echo模块

作者原文提到了nginx的有另1个 echo模块,特意玩了下感觉挺有意思的,下面贴一下简单集成步骤。

①、给nginx集成echo模块:

cd /usr/local/src
#下载echo模块并解压:
wget https://github.com/openresty/echo-nginx-module/archive/v0.57.tar.gz
tar zxvf v0.57.tar.gz

#下载nginx并解压
wget http://nginx.org/download/nginx-1.6.0.tar.gz
tar -xzvf nginx-1.6.0.tar.gz
cd nginx-1.6.0/

#查看在用nginx的编译参数(事先是全新安装则省略)
/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.6.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) #以下这行即为旧的编译参数:
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_gzip_static_module
#在旧的编译参数基础上新增【--add-module=/echo模块的解压路径】参数,开始英语

编译
./configure --prefix=/usr/local/nginx/nginx  --add-module=/usr/local/src/echo-nginx-module-0.57

#make编译
make -j2

#平滑升级nginx (事先是全新安装请执行:make install)
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp -f objs/nginx /usr/local/nginx/sbin/
make upgrade

②、echo用法举例:

人太好就和shell的echo差不多,可不才能输出自定义信息。

比如,在nginx后边配置如下:

location /hello {
  echo "hello, world!";
}

访问http://yourdomain.com/hello 就会在浏览器后边输出hello, world! 了(事先域名开了CDN事先会报404)。

又比如,测试本文提到的真实用户的IP,我希望在本文第二步配置基础上,再加如下规则并reload即可:

server {
	listen   3000;
        server_name  yourdomain.com;
        ## 以下是新增规则:
        ## 当用户访问 /realip 的事先,让我们

输出 $clientRealIp 变量,看看你一点变量
        ## 值是后后

真的 用户源IP 地址
        location /realip {
                echo $clientRealIp;
        }
}

生效后,访问http://yourdomain.com/realip 就能显示你所用电脑(宽带)的真实IP了(可在ip138查验准确性):

Ps:感兴趣又喜欢学习的童鞋可不才能看下相关wiki文档:http://wiki.nginx.org/HttpEchoModule

本文介绍到这就差不多开始英语 了,也是在神作的基础上精简采集并测试的,事先就看还一点许问题,请前往查看神作原文,你说歌词 还是大神写的比较好理解(不是是原创让你不深究了,感觉也是转来转去,都没留链接,悲哀的互联网)!

本文采集自【棒主妇开源】,原文地址:《网站安全配置(Nginx)防止网站被攻击》。