Nginx 防攻击安全配置

Nginx 防攻击安全配置网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法)网站被攻击是一个永恒不变的话题,网站攻击的方式也是一个永恒不变的老套路。找几百个电脑(肉鸡),控制这些电脑同时访问你的网站,超过你网站的最大承载能力,然后你就瘫了。方法虽然老土,但却一直都很管用,就像怎么打败美帝国主义,最简单的方法就是13亿中国人都移民去美帝,吃他的、用他的、花他的,直接能让美帝破产,压根不需要用…

大家好,又见面了,我是你们的朋友全栈君。

网站安全配置(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
“” KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 24: …ddr; #̲# 用正则匹配,从 x_for… $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 {

“” KaTeX parse error: Can’t use function ‘\.’ in math mode at position 38: …<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;
}   

}

作者:FicowShen
链接:https://www.jianshu.com/p/25398b28b816
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149311.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 简述sealed关键字_java field

    简述sealed关键字_java fieldsealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写。sealed关键字:在类声明中使用sealed可防止其它类继承此类;在方法声明中使用sealed修饰符可防止扩充类重写此方法。相当于Java中的final类和final方法密封类:密封类在声明中使用sealed修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提示出错。在哪些场合…

    2022年10月22日
  • 解决gradle下载慢的问题

    解决gradle下载慢的问题开发工具:IntelliJIDEA&AndroidStudio问题:新建项目下载gradle慢的问题解决:打开用户主目录linux平台/home/用户名/.gradlewindows平台c:\Users\用户名\.gradlemacos平台/Users/用户名/.gradle找到./gradle/wrapper/dist/gradle-版本号-bin目

  • 在node.js中使用COOKIE

    node.js中如何向客户端发送COOKIE呢?有如下两个方案:一、使用response.writeHead,代码示例://设置过期时间为一分钟1vartoday=newDate();

    2021年12月21日
  • unity3d教学视频_unity3d激活成功教程版

    unity3d教学视频_unity3d激活成功教程版2018年什么游戏最火?不用问,肯定是人人都在撸的“王者荣耀”和吃鸡游戏了。 只会打游戏,不去研究可不行。一直在想,像王者荣耀这样火的游戏是用什么引擎和语言开发的?这里就不得不说到现在最主流的游戏开发引擎——Unity3D了。Unity3D是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综…

  • 【Linux】 Apache配置文件详解「建议收藏」

    【Linux】 Apache配置文件详解「建议收藏」安装apache并启动[root@gaosh-64~]#yuminstallhttpd[root@gaosh-64~]#systemctlrestarthttpd[root@gaosh-64~]#systemctlenablehttpdCreatedsymlinkfrom/etc/systemd/system/multi-user.target.wants/httpd.serviceto/usr/lib/systemd/system/httpd.service.

  • Javaweb人才招聘系统[通俗易懂]

    Javaweb人才招聘系统[通俗易懂]基于JSP的JSP+MYSQL人才招聘系统hrm系统是一个综合的员工管理系统,系统主页面左边由导航树构成,分为:部门管理、员工管理、招聘管理、培训管理、薪资管理、以及系统设置模块,模块功能主要包含CRUD操作,详情查看等操作。后台管理具体描述如下:网站新闻资讯管理|–添加新闻资讯;|–修改新闻资讯;|–删除新闻资讯个人会员管理|–查看个人会员|–删除个人会员企业会员管理|–查看企业会员|–删除企业会员在线留言管理|–查看在线留言|–删除在线留言系统用户管理|–系统用户的录

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号