最近我一直帮助我朋友对一个项目网站进行二次开发和防护,为了简单抵挡一下竞争对手的 DDoS 攻击,他给网站开启了腾讯云CDN加速服务。

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

  目前国内已经争相出现了百度云加速、腾讯云、阿里云、加速乐、360 网站卫士以及安全宝等CDN加速服务。不仅能够有效的隐藏自己的服务器IP地址,还能很好的防御DDos攻击和加快网站的访问速度,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 地址做限制就可以了。

  我们如何通过PHP获取访问用户的真是IP呢?

  今天我就讲自己编写的代码发给大家,支持cdn加速获取用户IP,也支持不加速获取IP。IsCDN默认flase为不启动cdn加速获取用户IP,true则相反。