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

news/2024/5/9 20:24:34/文章来源:https://blog.csdn.net/weixin_33901926/article/details/91877957

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

网站被攻击是一个永恒不变的话题,网站攻击的方式也是一个永恒不变的老套路。找几百个电脑(肉鸡),控制这些电脑同时访问你的网站,超过你网站的最大承载能力,然后你就瘫了。方法虽然老土,但却一直都很管用,就像怎么打败美帝国主义,最简单的方法就是 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_700772.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个系统的html源代码,h5后台模板源码bootstrap网站后台管理系统HTML页面后台源代码...

bootstrap后端管理系统HTML页面源代码代码结构清晰&#xff0c;页面组件可DIY性强。HTML页面文件齐全每套都是经典模板 模板无需太多 有这几十套就足够了 拒绝差模板 不但不好用而且白费时间 废话不多说好产品无需吹嘘直接看演示就好了号称五星级 uihttp://mb.80zx.com/admin…

phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)

phpstudy一个域名配置两个网站&#xff08;一个是thinkphp5&#xff0c;一个是原生php&#xff09; 一、总结 一句话总结&#xff1a;把原生php的网站直接放到thinkphp5的public目录下可以解决以stem.aaaa.hk\**方式访问原生网站会被当成thinkphp子模块的问题 最后的解决方法&a…

25个调优工具/技术网站

对于程序员来说&#xff0c;不停的学习新技术&#xff0c;是我们一直要做的事情&#xff0c;平时不积累&#xff0c;等到金三银四&#xff0c;金九银十的跳槽季节&#xff0c;身边的朋友&#xff0c;一个个的拿着高薪跳槽&#xff0c;自己只能眼巴巴的看着&#xff0c;后悔平时…

这些资源网站为什么能获得5万知乎大佬推荐,而我错失了什么吗?

现在很多朋友可能只要是一听到资源网站&#xff0c;想必就会好奇是什么网站&#xff0c;用用看是不是由说的那么厉害&#xff01;其实资源网站给我们的诱惑是在是太大了&#xff0c;其主要原因是可以帮助我们搜索到很多意想不到的资源&#xff01; 为了回应大家的需求&#xff…

程序员视频学习网站,推荐这几个网站不错

想要学好编程&#xff0c;就要多努力挖掘有用的知识&#xff0c;在编程行业&#xff0c;有几个程序员可以学习的视频网站&#xff0c;不管是自学还是培训学习&#xff0c;这些网站都可以帮助到自己&#xff0c;下面小编就为大家做一一的介绍。 程序员视频学习网站&#xff0c;推…

为什么你不应该自行更新 Drupal 网站?

&#xff08;译注&#xff1a;这篇文章主要还是针对于非专业人员及个人Drupal站长&#xff0c;对于专业的 Drupal 团队和公司而言 Drupal 的升级更新都有规范的操作流程&#xff0c;完全是家常便饭&#xff0c;不可能出现文中出现的这些情况。尽管如此&#xff0c;里面也还是有…

Python常用6个技术网站汇总分享!

Python是一门面向对象的编程语言&#xff0c;它具有丰富和强大的库&#xff0c;能够把用其他语言编写的各种模块轻松地联结在一起&#xff0c;因此也常被称为“胶水语言”。Python技术会随着互联网的不断发展一直迭代和更新&#xff0c;所以需要Python开发的人员一直保持一个学…

大型网站系统架构系列:分布式消息队列(二)

四、JMS消息服务 讲消息队列就不得不提JMS 。JMS&#xff08;JAVA Message Service,java消息服务&#xff09;API是一个消息服务的标准/规范&#xff0c;允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低&#xff0c;消息服务更加可靠以及…

Java学习必不可少的网站,快收藏起来

java技术在IT互联网行业的发展前景一直在提升&#xff0c;越来越多的人都在学习java技术&#xff0c;今天小编来给大家提供一些学习Java的网站集合&#xff0c;希望能够帮助到正在学习java技术的同学。 Java学习必不可少的网站&#xff0c;快收藏起来! 1. Stackoverflow Stacko…

phpcms中调用外部网站数据

1、在phpcms后台模块->模块管理->数据源->外部数据源 中 添加外部数据源2、在phpcms前台模板中&#xff0c;使用get标签获取数据源中数据。{pc:get sql"SELECT * FROM pre_forum_thread" cache"3600" dbsource"discuz" return"dat…

啥不懂也能动手搭建属于自己的博客网站

目前&#xff0c;我们在大多数的网站搭建教程中都是基于linux系统&#xff0c;可是&#xff0c;对于有些对linux系统完全没有一点了解的朋友来说&#xff0c;这并不是一个好的消息&#xff0c;今天&#xff0c;我为大家写一篇基于腾讯云windows server 2008服务器的网站搭建教程…

这五个网站可以让你免费学习编程,快来收藏!

学习编程技术是现在很多人的一个选择&#xff0c;互联网快速发展的时代&#xff0c;越来越多的人选择学习编程技术&#xff0c;来实现自己的职业梦想&#xff0c;下面小编就为大家整理了五个可以免费学习编程语言的网站&#xff0c;希望能够帮助到大家。 这五个网站可以让你免费…

网站ui的配色有哪些需要注意的?

作为一名UI设计师&#xff0c;那么关于配色的问题是非常注重的&#xff0c;尤其是做一款网站设计&#xff0c;配色方面要非常注意&#xff0c;本期小编为大家介绍的UI设计培训教程就是关于网站ui的配色有哪些需要注意的?来看看下面的详细介绍。 UI设计培训分享&#xff1a;网站…

IDEA IntelliJ 如何设置网站的欢迎页面

网站的目录结构如下 在web>WEB-INF>web.xml 文件中设置login.html为欢迎页面&#xff08;运行跳出的第一个页面&#xff09;

写给云栖社区在做网站的朋友一点干货

我本人也是从事网站建设及APP开发业务的&#xff0c;工作多年下来&#xff0c;从以前的几百元企业网站&#xff0c;到商城网站&#xff0c;以及一些应用类型的APP开发&#xff0c;亲眼目睹了很多企业&#xff0c;以及很多项目&#xff0c;在应用的过程中&#xff0c;过了1-2年&…

计算机网站编辑需要学什么,网站编辑工作的心得体会

网站编辑工作的心得体会从事网络编辑之前&#xff0c;我对网络编辑这个名词可谓前所未闻&#xff0c;一无所知。从起步时我也认为网络编辑的工作应该是很轻松的&#xff0c;每天就是相同的工作&#xff1a;复制加粘贴&#xff0c;感觉是一个“搬运工”&#xff0c;而后在这十个…

Equifax再陷风波:一门户网站管理员密码是admin/admin

据外媒报道&#xff0c;又一个Equifax门户网站被指存在安全协议问题。最先发现这个的Hold Security LLC指出&#xff0c;一个负责管理信用报告纠纷&#xff08;内含个人信息&#xff09;的新Equifax门户网站使用的是用户名和密码都为admin的用户名/密码数字通道。该门户网站叫V…

小型网站到大型网站-Mysql优化

2019独角兽企业重金招聘Python工程师标准>>> 背景 好的大型网站都是从小型网站慢慢演变来的&#xff0c;都不是一步就设计好的。现在的淘宝&#xff0c;03年创建的时候它也是只有一台服务器&#xff0c;使用的是我们目前还经常使用的lamp架构&#xff08;LinuxApach…

那些进入 Alexa 排名前 250 的 WordPress 网站

目前在全球的所有网站中&#xff0c;WordPress占据了接近25%的市场份额&#xff0c;几乎每四个网站中就有一个是使用WordPress搭建的。那么&#xff0c;在全球访问量前250个网站中&#xff0c;又有多少个是使用WordPress搭建的呢&#xff1f;最近&#xff0c;WPMU DEV网站对此进…

不上全站https的网站你们就等着被恶心死吧

2019独角兽企业重金招聘Python工程师标准>>> 测试脚本 #!/bin/sh wget \ --user-agent"Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19" \-r \-P a…