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

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

Nginx 有 2 个模块用于控制访问“数量”和“速度”。

简单的说,控制你最多同时有 多少个访问,并且控制你每秒钟最多访问多少次, 你的同时并发访问不能太多,也不能太快,不然就“杀无赦”。

  • HttpLimitZoneModule 限制同时并发访问的数量
  • HttpLimitReqModule 限制访问数据,每秒内最多几个请求

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

普通配置

啥叫普通配置 ? 就是说,你的服务器直接面向普通用户,例如 普通用户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”可以节省内存之类的废话

你 Google 不到的配置

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

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

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

现在我们面对的最直接的问题就是, 经过这么多层加速,我怎么得到“最前面普通用户的 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 地址做限制就可以了,

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

取得用户的原始地址Shell

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地址

测试、测试

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

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

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

给 Nginx 增加一个测试地址Shell

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地址

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

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

CDN环境下 Nginx 的安全配置Shell

## 这里取得原始用户的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;}
}


转自:
网站安全配置Nginx防止网站被攻击

Nginx 防攻击安全配置相关推荐

  1. Nginx防攻击杀手锏

    1.限制IP访问频率: HttpLimitZoneModule 限制并发连接数实例 limit_zone只能定义在http作用域,limit_conn可以定义在http server location ...

  2. nginx lua 配置cc 防攻击-使用lua 配置黑白名单

    nginx lua 配置cc 防攻击-使用lua 配置黑白名单 cc 防攻击和ip 禁止期限 lua_shared_dict _dict 1m; lua_shared_dict _blacklist ...

  3. Nginx并发数、每秒连接数、下载速度限制,防攻击杀手锏

    Nginx并发数.每秒连接数.下载速度限制,防攻击杀手锏 本文链接:https://blog.csdn.net/slovyz/article/details/54583882 1.限制IP访问频率: ...

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

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

  5. 《安富莱嵌入式周报》第280期:支持在线仿真编程的网页版电子开发,CAN总线防攻击实现,BigFAT 规范打破了 FAT 每个文件 4GB 的限制

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  6. IPv6解决方案ND防攻击技术白皮书

    [转自]http://www.h3c.com/cn/d_200907/642189_30004_0.htm IPv6解决方案ND防攻击技术白皮书 关键词:ND,ARP,ND攻击,ARP攻击,交换机,I ...

  7. nginx安装及安全配置和转发代理

    Nginx安装 1. 新建用户和组 ngxuser:ngxuser groupadd ngxuser useradd -m -g ngxuser ngxuser  #-m自动建立家目录,-g指定组 2 ...

  8. 常见网络攻击方式介绍及短信防攻击策略的后端实现

    大家好,今天给大家分享一下:几种常见的网络攻击方式的介绍以及短信防攻击策略的后端实现. 一.背景介绍 有人的地方就有江湖,有数据交互的地方,就存在入侵风险. 只有知己知彼,才能百战不殆.我们学习相关知 ...

  9. 入门学习Nginx代理服务器?就看这篇Nginx进阶学习最佳配置实践指南

    前置基础知识学习 1.Nginx基础安装与配置详细 https://blog.weiyigeek.top/2019/9-1-121.html 2.Nginx进阶学习之最佳配置实践指南 https:// ...

最新文章

  1. 让你的silverlight更炫(三):让BusyIndicator更炫
  2. Netty ObjectPool对象池技术原理分析
  3. linux镜像文件不要大于4g,Systemback制作大于4G的Ubuntu系统镜像
  4. activemq 安全连接
  5. Vue文件在VsCode工具中红色波浪线的问题解决方法
  6. 有2-3年工作经验但依然迷茫
  7. WCF 部署在IIS上
  8. 广东科技学院计算机应用技术专业,广东科技学院是几本 [深圳大学应用技术学院计算机技术专业2018考研调剂信息]...
  9. [论文写作] vscode + latex
  10. chmod命令用法linux,Linux下chmod命令详细介绍及用法举例
  11. 抓包工具Charles乱码解决办法
  12. 操练Draco的代码
  13. 中国互联网十八摸(全)
  14. 云计算的三种服务模式的讲解
  15. 服务器系统启用来宾用户,系统日志中出现Internet来宾账户
  16. 4. 假设一年期定期利率为 3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
  17. 微信小程序获取当前地址以及选择地址详解
  18. E8卡 linux 系统 读写 高通 字库芯片
  19. 一款QQ盗号木马分析
  20. x3650m4服务器主板型号,【联想x3650 M4参数】联想x3650 M4系列服务器参数-ZOL中关村在线...

热门文章

  1. 论坛APP开发需要具备哪些功能
  2. iOS开发中plist文件的创建与简单读取
  3. 简单分布式锁实现(拍黄片)
  4. TDSQL:腾讯金融级分布式数据库解决方案
  5. wazuh agent 认证
  6. 你怎样看待男女军人接吻
  7. 图像导出dwg格式出错?CAD VCL热门技术问答精选合集有你想要!
  8. 一场2.2亿公里的太空奥德赛
  9. ubuntu安装与配置ngnix静态代理与反向代理的流程
  10. java 手电筒 电池_android 手电筒的实现