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

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

开启CDN之后,我之前给他写的Shell防护脚本也就宣告无效了,因为不管是正常访问还是攻击访问,脚本拿到的IP都是CDN节点的,而我不可能把CDN的节点IP也给禁用了,那就都不能访问了。

为了解决这个窘迫,我想到了以前看过的Nginx访问限制。通过查资料,让我拜读了一枚大神的神作,感觉收获颇丰!于是转过来整理一下,分享给更多需要的人!


Nginx 有2个模块用于控制访问“数量”和“速度”,简单的说,控制你最多同时有 多少个访问,并且控制你每秒钟最多访问多少次, 你的同时并发访问不能太多,也不能太快,不然就“杀无赦”。

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

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

一、普通配置

什么叫普通配置?

普通配置就是针对【用户浏览器】→【网站服务器】这种常规模式的nginx配置。那么,如果我要对单IP做访问限制,绝大多数教程都是这样写的:

这样一个最简单的服务器安全限制访问就完成了,这个基本上你 Google 一搜索能搜索到  90% 的网站都是这个例子,而且还强调用“$binary_remote_addr”可以节省内存之类的云云。

二、CDN之后

目前国内已经争相出现了百度云加速、加速乐、360网站卫士以及安全宝等免费CDN。让我们这些小网站也能免费享受以前高大上的CDN加速服务。

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

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

甚至是更复杂的模式:

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

可以看到,我们的网站中间经历了好几层的透明加速和安全过滤, 这种情况下,我们就不能用上面的“普通配置”。因为普通配置中基于【源IP的限制】的结果就是,我们把【CDN节点】或者【阿里云盾】给限制了,因为这里“源IP”地址不再是真实用户的IP,而是中间CDN节点的IP地址。

我们需要限制的是最前面的真实用户,而不是中间为我们做加速的加速服务器。

其实,当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录

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

如果中间经历了不止一个代理服务器,这个记录会是这样

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

可以看到经过好多层代理之后, 用户的真实IP 在第一个位置, 后面会跟一串中间代理服务器的IP地址,从这里取到用户真实的IP地址,针对这个 IP 地址做限制就可以了。

那么针对CDN模式下的访问限制配置就应该这样写:

三、echo模块

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

①、给nginx集成echo模块:

②、echo用法举例:

其实就和shell的echo差不多,能否输出自定义信息。

比如,在nginx里面配置如下:

访问http://yourdomain.com/hello 就会在浏览器里面输出hello, world! 了(如果域名开了CDN可能会报404)。

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

生效后,访问http://yourdomain.com/realip 就能显示你所用电脑(宽带)的真实IP了(可在ip138查验准确性):Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法

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

本文介绍到这就差不多结束了,也是在神作的基础上精简整理并测试的,如果看完还有些许疑问,请前往查看神作原文,也许还是大神写的比较好理解(是否是原创我就不深究了,感觉也是转来转去,都没留链接,悲哀的互联网)!

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

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

刷新评论

目前评论:11   其中:访客  11   博主  0

  1. 同盟源 5 来自天朝的朋友 谷歌浏览器 Windows 7 安徽省芜湖市 电信

    太有用了,多谢

  2. pdf电子书 1 来自天朝的朋友 火狐浏览器 Windows 8.1 山东省青岛市 联通

    很高深。。。

  3. 外汇站 2 来自天朝的朋友 谷歌浏览器 Windows XP 河北省石家庄市 电信

    :grin: 哇!又有人购买,赚了不少了吧。

  4. Jcore 2 来自天朝的朋友 谷歌浏览器 Mac OS X 10_9_3 北京市朝阳区 联通

    nginx 的 echo模块 稍后要去试试。。。

  5. 易淘金 3 来自天朝的朋友 谷歌浏览器 Windows 7 河南省开封市 联通

    很好 谢谢分享

  6. tennfy 1 来自天朝的朋友 谷歌浏览器 Windows XP 江苏省南京市 南京航空航天大学

    学习下,很有意思

  7. Me.稀奇 1 来自天朝的朋友 谷歌浏览器 Windows 7 重庆市 电信

    新年快乐·················

  8. 圆月博客 5 Viet Nam 谷歌浏览器 Windows 7 越南

    太给力了这东西

  9. Case吧 1 来自天朝的朋友 谷歌浏览器 Mac OS X 10_10_1 北京市西城区 联通

    学习一下。。。

  10. 交通事故律师 4 来自天朝的朋友 搜狗浏览器 Windows XP 广东省 电信

    用百度云加速可以吗?会产生类似问题?

  11. wwek 1 来自天朝的朋友 谷歌浏览器 Windows 10 中国 移动

    非常棒的,分享. 讲的很清楚

加载中,请稍候...