Nginx 内置变量,细化规则,真实IP获取及限制连接请求

很多时候,我们的网站不是简单的  普通用户IE浏览器  ——->  你的服务器  的结构, 考虑到网络访问速度问题,我们中间可能会有各种 网络加速(CDN)。以本网站  www.bzfshop.net 为例,考虑到网站的安全性和访问加速,我们的架构是:

普通用户浏览器  —–>  360网站卫士加速(CDN,360防 CC,DOS攻击) ——>  阿里云加速服务器(我们自己建的CDN,阿里云盾) —-> 源服务器(PHP 程序部署在这里,iptables, nginx 安全配置)

可以看到,我们的网站中间经历了好几层的透明加速和安全过滤, 这种情况下,我们就不能用上面的“普通配置”。因为上面基于  源IP的限制 结果就是,我们把 360网站卫士  或者  阿里云盾 给限制了,因为这里“源IP”地址不再是  普通用户的IP,而是中间  网络加速服务器 的IP地址。我们需要限制的是 最前面的普通用户,而不是中间为我们做加速的 加速服务器。

 

1.1 现在我们面对的最直接的问题就是, 经过这么多层加速,我怎么得到“最前面普通用户的 IP 地址”呢?

(这里只说明结果,不了解 Http 协议的人请自行 Google 或者 Wikipedia  http://zh.wikipedia.org/zh-cn/X-Forwarded-For  )

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

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

如果中间经历了不止一个 代理服务器,像 www.bzfshop.net 中间建立多层代理之后,这个 记录会是这样

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

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

 

1.2 经过多层CDN之后取得原始用户的IP地址,nginx 配置

 

 

1.3 测试、测试

很多时候,你在网上搜到一堆配置,你照着做了,但是你怎么知道这个配置真的正确 ?是的,我们需要自己做一个有效的真实的测试,验证它是正确的之后才真的采用它

Nginx 这种配置怎么测试呢? 用 Echo 模块,如果你知道 Nginx 这个模块的话。

以 www.bzfshop.net 网站为例, 我们首先测试这个 $clientRealIp 是否真的是我们客户机的 IP 地址,在网站上增加一个访问地址,比如  www.bzfshop.net/nginx-test,配置如下:

接下来,用你的浏览器访问  www.bzfshop.net/nginx-test,这个时候会弹出框下载一个文件 nginx-test,下载完成用 notepad++ 打开,里面就是一个 IP 地址

访问 www.ip138.com ,看看这个里面记录的IP地址是否和 ip138 侦测的IP 一致?

通过这种方式,你就可以对 Nginx 的一些复杂配置做有效的测试。

经过测试,我们确认 通过多层CDN 之后,$clientRealIp 仍然是有效的原始用户IP地址

 

 1.4 根据用户的真实 IP 做连接限制

下面是修改之后的 Nginx 配置:

 原博客地址:https://yq.aliyun.com/articles/44945

posted @ 2017-06-19 14:55  Drutor  阅读(2078)  评论(0编辑  收藏  举报