2019独角兽企业重金招聘Python工程师标准>>>

网站被攻击是一个永恒不变的话题,网站攻击的方式也是一个永恒不变的老套路。找几百个电脑(肉鸡),控制这些电脑同时访问你的网站,超过你网站的最大承载能力,然后你就瘫了。方法虽然老土,但却一直都很管用,就像怎么打败美帝国主义,最简单的方法就是 13 亿中国人都移民去美帝,吃他的、用他的、花他的,直接能让美帝破产,压根不需要用武力。土方法,自然解决这个问题的方法也土,就是设置一个海关,控制进入的人口数量,只要不让你进来太多人,你就吃不穷他。 网站也一样,只要控制能够进入的访问数量,你就攻击不了我。

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

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

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

请先检查你的 nginx 是否有这 2 个模块,否则~~~额~~~没戏,一边墙角哭去吧~~~

1. 普通配置

啥叫普通配置 ? 就是说,你的服务器直接面向普通用户,例如    普通用户IE浏览器  -->  你的服务器,这也是你能 Google 到的 99% 的Nginx 安全配置例子,基本上就是抄了 Nginx 官方的一个 Sample。考虑到文章的完整性,我这里也就重复一下这个被 千百个网站 已经重复过无数次的 配置

普通用户IE浏览器  ——->  你的服务器      由于普通用户直接访问你的服务器,所以你可以直接得到用户的 IP 地址, 而我们的限制就是基于对 来源IP 地址的访问限制

Nginx 里面设置一个限制

## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址最多有 50 个并发连接
## 你想开 几千个连接 刷死我? 超过 50 个连接,直接返回 503 错误给你,根本不处理你的请求了
limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;
limit_conn  TotalConnLimitZone  50;
limit_conn_log_level notice;
## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址每秒处理 10 个请求
## 你想用程序每秒几百次的刷我,没戏,再快了就不处理了,直接返回 503 错误给你
limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m  rate=10r/s;
limit_req_log_level notice;
## 具体服务器配置
server {listen   80;location ~ \.php$ {## 最多 5 个排队, 由于每秒处理 10 个请求 + 5个排队,你一秒最多发送 15 个请求过来,再多就直接返回 503 错误给你了limit_req zone=ConnLimitZone burst=5 nodelay;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;include fastcgi_params;}
}

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

2. 你 Google 不到的配置

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

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

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

2.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 地址做限制就可以了,

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

map $http_x_forwarded_for  $clientRealIp {## 没有通过代理,直接用 remote_addr"" $remote_addr;  ## 用正则匹配,从 x_forwarded_for 中取得用户的原始IP## 例如   X-Forwarded-For: 202.123.123.11, 208.22.22.234, 192.168.2.100,...## 这里第一个 202.123.123.11 是用户的真实 IP,后面其它都是经过的 CDN 服务器~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
## 通过 map 指令,我们为 nginx 创建了一个变量 $clientRealIp ,这个就是 原始用户的真实 IP 地址,
## 不论用户是直接访问,还是通过一串 CDN 之后的访问,我们都能取得正确的原始IP地址

2.3 测试、测试

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

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

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

server {listen   80;server_name  www.bzfshop.net;## 当用户访问 /nginx-test 的时候,我们输出 $clientRealIp 变量,看看这个变量## 值是不是真的 用户源IP 地址location /nginx-test {echo $clientRealIp;}
}

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

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

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

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

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

## 这里取得原始用户的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  50;limit_conn_log_level notice;## 针对原始用户 IP 地址做限制limit_req_zone $clientRealIp zone=ConnLimitZone:20m  rate=10r/s;#limit_req zone=ConnLimitZone burst=10 nodelay;limit_req_log_level notice;## 具体服务器配置server {listen   80;location ~ \.php$ {## 最多 5 个排队, 由于每秒处理 10 个请求 + 5个排队,你一秒最多发送 15 个请求过来,再多就直接返回 503 错误给你了limit_req zone=ConnLimitZone burst=5 nodelay;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;include fastcgi_params;}}

后记:

通过上面的配置,现在你的网站可以完美的配合任何 网络加速服务(CDN)的使用,并且同时能保证对“最终用户的限制”。

写这篇文章的原因是因为 我们最近把 www.bzfshop.net 迁移到  360网站卫士(wangzhan.360.cn)  上了,使用 360网站卫士 做我们的加速服务器和安全保护,同时我们网站自身 nginx 本身也配置了防止攻击的安全措施, 结果我们的安全配置把  360网站卫士的加速服务器给 盾 掉了,因为所有用户的访问都通过加速服务器过来,很明显加速服务器超过了我们的“连接限制”。经过上面的改造之后,现在我们的 Nginx 安全配置能够和 360加速服务器 完美配合,同时能对终端的用户访问作限制。

写下这些文字,希望对看到这篇文章的朋友会有用。

转载于:https://my.oschina.net/HeAlvin/blog/395328

网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置)相关推荐

  1. 网站安全配置Nginx防止网站被攻击

    网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法) 网站被攻击是一个永恒不变的话题,网站攻击的方式也是一个永恒不变的老套路.找几百个电脑(肉鸡),控制这些电脑同时访问你的网 ...

  2. [备忘]关于在阿里云平台配置免费HTTPS的成功测试案例(含CDN加速)

    纠正一下,本文是域名CDN加速操作.文末简单说HTTPS. 说明: 阿里云的https证书有免费的,但是是跟CDN绑定在一起使用的,CDN根据请求数计费,我这里请求数不会多,所以费用也很少,根据自己的 ...

  3. 新建网站提升曝光率设置集合(边使用边更新)(包括:SEO优化,Robots设置,CDN加速,防盗链)

    目前处于边学习边记录的状态,将自己建站中遇到的问题记录下来,以供大家参考,最终效果可以访问我的主页进行查看:alvincr.com Table of Contents 1.1 SEO优化目的(搜索引擎 ...

  4. 使用CloudFlare免费的CDN加速和网站防攻击配置教程

    CloudFlare名气之所以大,一是技术精湛,拥有强大的隐藏IP技术,能有效防御DDOS攻击.CC技术在世界上屈指可数,很多国外网站都使用它.不过要强调一点,cdn加速并不适用于所有的国外主机,如果 ...

  5. 腾讯云iis8.5新建网站无法访问_教程篇 | 使用七牛云存储、CDN加速网站图片

    嗨,大家好,今天给大家分享的是 使用七牛云等云服务商提供的对象存储服务,存储网站图片,并且可以cdn加速图片,让你的网页变得更快. 首先给大家多多介绍一些有关的知识. 目前各大云服务商都提供了对象存储 ...

  6. cdn对动态网站有作用吗_网站选择cdn加速有什么作用?

    在互联网有一个许多人都知道的"8秒原则",就是如果一个页面的加载时间超过了8秒,那么大部分的用户就会觉得不耐烦,加载的时间太长,就会出现直接放弃的可能.即便是一个网站内容丰富.制作 ...

  7. 企业上云,如何给网站提速?CDN加速一定要知道

    随着互联网的普及,上网用户越来越多,网站访问量增加.若网页加载缓慢,用户体验不佳则会迅速将关闭该页面,从而造成了网站用户的流失.为了提升用户体验,就要提高网站打开速度.那么,该如何给网站提速呢? 1. ...

  8. 浅析门户网站体育赛事CDN加速解决方案

    经过近些年来的高速发展,互联网已经成为现今媒体传播的主要力量.这一点在大型体育赛事的报道与转播上,体现的尤为明显.更及时的信息内容.更多样的报道形式.更齐全的资料组成.更方便的阅读查询.更具互动性的报 ...

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

    一.普通配置 什么叫普通配置? 普通配置就是针对[用户浏览器]→[网站服务器]这种常规模式的nginx配置.那么,如果我要对单IP做访问限制,绝大多数教程都是这样写的: <span style= ...

最新文章

  1. 什么是CNN?写给小白的机器学习入门贴,Facebook员工打造,47k访问量
  2. 深度优先(DFS)和广度优先(BFS)
  3. 在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
  4. linux下crontab allow,Linux下crontab命令的用法
  5. Python编程核心内容 ---- Function(函数)
  6. linux路由修改密码,Linux中修改Mysql root用户密码的方法
  7. OpenCASCADE绘制测试线束:几何命令之Intersections
  8. Taro+react开发(100):问答模块07适配
  9. Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean 解决方案
  10. Day01----jsp
  11. 易语言之今日头条新闻收集源码
  12. 通过Kali模拟CC攻击进行WEB压力测试实操
  13. Linux:什么是 i386、i586、 i686、noarch?
  14. 适合中小企业发展的内网即时通讯软件应该具备什么
  15. 解决django admin表的外键关联数据过多响应时间过长问题
  16. Android x86安装教程
  17. python热搜排行功能_手把手教你用Python+Pyecharts让微博热搜榜动起来
  18. mysql添加表或字段注释
  19. django中models的filter过滤方法
  20. 量子通信借助计算机,量子通信技术核心——量子计算算法

热门文章

  1. 分享memcache和memcached安装过程
  2. jQuery / jQuery mvc plugin
  3. C#创建和调用DLL
  4. 跨平台PHP调试器设计及使用方法——界面设计和实现
  5. C++/C++11中std::exception的使用
  6. java 继承 意义_Java中继承,类的高级概念的知识点
  7. linux快捷键 赋值,2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换...
  8. 腐蚀rust高速箭怎么做不了_皮带轮动平衡怎么做
  9. python22期_python学习第22期
  10. 打包tomcat没有xml文件_Spring Boot 项目打包 War 并部署到 Tomcat