记一次针对静态页面的DDOS基本防护
可以说是我试图进入安全口的天才第一步了,能走多远鬼知道呢
背景
去年年前接到的一个外包项目,是一个base在日本的中国人留学机构做的静态页面。出于锻炼自己的目的,选择为他们按次结薪做长期服务维护。20年618当天给我越洋电话打过来说大量潜在客户试图访问机构官网报错无法访问服务器,让我去帮他们看看怎么回事。
回到电脑前登陆阿里云,发现带宽和CPU被占满了,如下图所示:
第一反应就是:坏了,拒绝服务攻击,搞不好还是分布式的……然后登陆后台尝试看日志,发现还真是拒绝服务攻击:
还行,不是分布式的,不过也够吃满了服务器的1核1G1MBps小水管了……对方还挺无聊,发post没把body整的整齐划一,内容缤纷多彩
处理过程
第一阶段:请求洪泛
iptable bans:
由于发现对方没有使用分布式的攻击手段,我考虑停止对攻击流量的来源IP地址进行HTTP响应,经过查询学习,我选择使用iptables命令完成这一操作:
iptables -I INPUT -s <ip addr.> -j DROP
通过此命令,当传入网关的ip地址为定义的ip时,网关会直接丢弃请求,不做任何处理。然而很快我就发现自己太年轻了。对方显然不是抱着笔记本在攻击我,他们不仅更换了ip, 还欢乐骂我的话……
我当时很幼稚的不死心,又用iptables ban了对面五个IP,然后对方换了IP继续打我,我真的毫无办法……
第二阶段 分布式请求洪泛
ddos deflate:
由于对方会动态更换IP地址,单纯手动封禁IP只能做到“见招拆招”,假设对方用的手动更换IP还好,拼手速即可,一旦人家用的是IP池自动调用,人是肯定干不过机器的。一开始打算造轮子,结合
iptables -I INPUT -s <addr> -j DROP
弄个脚本自动封IP,后来觉得雇主给不了让我满意的钱而且我太懒,于是转而上网寻找轮子——找到了ddos deflate
这款软件完全实现我的想法:轮询拿指定时间范围内的网络访问记录,把设定时间长度内连续请求数量大于指定值的IP自动关进小黑屋一段时间。但是他不是万能的,对于雇主的小水管,一秒一次的请求居然也能造成服务延迟,对方不断试探我配置的参数,先后有过一秒一次,五分钟30次然后停止攻击5分钟、半小时攻击停止五分钟等各种憨批操作……下图这些稀奇古怪的字符串有无大佬知道是什么,还请评论区教教我。
后来我配上一小时内连续访问50次就ban的自杀式配置了以后,服务器太平了10天左右。我自以为高枕无忧,没想到……
第三阶段 SYN 半开链接攻击
强安全策略 + CDN掩盖源站地址
这次雇主又给我打电话,说裂开了,访问时断时续的。我上去看发现对方每三十秒给我发一次脏话。奇了怪了,这怎么会让服务崩溃呢?用netstat命令查看发现有些IP地址连接数很高却没有被 ddos deflate屏蔽掉,于是查看这些IP的链接情况(图是我后来截的):
可以看到,有些IP一直处于 SYN_RECD 状态(这里没有是因为攻击已经被屏蔽了,命令是对的哈),意即为已经向其发送了SYN信号等待第三次握手,却没有收到ACK。每当一个IP地址端口向我们的服务器发送TCP链接请求,都会有一个线程被唤起对其提供服务,如果攻击者drop我们发回的SYN,默认的该线程会等待15分钟并重试3次,也就是说对方每个端口发动攻击一次就会浪费一个线程45分钟。当量足够大,线程池爆掉的时候,你的服务器就再也无法为正常用户提供服务了。
这一攻击致命在于你不能判断一个TCP半开链接是真的网不好还是有恶意,所以超时太短会导致影响正常用户体验,太长则会被对方攻击流量洪泛。网传的哪些加大窗口队列长度、缩短超时时间等方法实际上并不能解决本质问题。
那么我们怎么解决这个问题呢?
答案是使用分布式内容分发网络(CDN)。由于CDNIP不固定且遍布全球,某个IP如果被短时间高流量爆破,还有其他的IP为用户提供服务,不会导致系统完全停止响应。而大多CDN提供了更好用的防火墙设置,也能方便我们自定义安全策略。本次处置我采用了CloudFlare CDN(免费版)+ 阿里云强安全策略解决了这一问题。
第一步:部署CloudFlare
登陆注册以后,前往你的域名服务商,将DNS重定向至Cloudflare提供的地址:
随后,等待24h使修改生效。
第二步:应用强安全策略
在阿里云上使用网络安全组策略,设置一个优先级为2的禁止任何流量流入或流出服务器的组策略和一个优先级为1的允许Cloudflare IP地址通过防火墙的组策略:
这时你的服务应该已经恢复正常了,因为攻击者就算知道源站IP,也没有办法用垃圾流量塞满你的服务器了。但是这还不够太平,因为他们有可能洪泛掉免费CDN那点可怜的带宽,怎么办呢:
第三步:使用Cloudflare防火墙策略
在Cloudflare上,根据雇主特点(访问集中于东亚洲几个国家和几个VPS常见地址)部署自定义的防火墙策略,如图:
成效是显著的,域外发动的攻击基本全部被屏蔽,一个月以来,我们的服务再也没有中断过,而对方的攻击流量全部被Cloudflare 一 瞬 缓 存
愿大家在防御的路上武运方昌!
记一次针对静态页面的DDOS基本防护的更多相关文章
- 生成静态页面的PHP类
生成静态页面的PHP类: 复制代码代码如下: <?php class html { var $dir; //dir for the htmls(without/) var $ ...
- 一个简单的NodeJs静态页面的web服务器
主要功能 1 显示www文件夹下静态html或文本类型的文件. 2 缺省访问文件功能. 通过config.js的defaultfile属性设置 3 如果文件夹下没有缺省文件,显示文件夹下文件列表 4 ...
- 可以完成99%的静态页面的HTML标签
HTML:一套浏览器认知的规则HTML分为两个部分,头和身体.一个完整的网页相当于一个裸体的人,我们利用HTML给它穿上衣服,使它更好看.下面我将为大家介绍一下HTML一些基本的标签,而这些基本的标签 ...
- 删除静态页面的html
function dellist(obj) { $(obj).parent().parent().remove(); }
- [react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?
壹 ❀ 引 虚拟DOM(Virtual DOM)在前端领域也算是老生常谈的话题了,若你了解过vue或者react一定避不开这个话题,因此虚拟DOM也算是面试中常问的一个点,那么通过本文,你将了解到如下 ...
- ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面
DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...
- ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构
和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...
- ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求
我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...
- JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
前言 最近实施的同事报障,说用户审批流程后直接关闭浏览器,操作十余次后系统就报用户会话数超过上限,咨询4A同事后得知登陆后需要显式调用登出API才能清理4A端,否则必然会超出会话上限. 即使在页面 ...
随机推荐
- Spring 容器的初始化
读完这篇文章你将会收获到 了解到 Spring 容器初始化流程 ThreadLocal 在 Spring 中的最佳实践 面试中回答 Spring 容器初始化流程 引言 我们先从一个简单常见的代码入手分 ...
- 代码块&&API(object、String、StringBuffer、StringBuilder)
day 07 代码块 局部代码块 定义在方法中,用户划分区域的 构造代码块 和成员方法并列,用{}包裹 每次创建对象的时候都会执行,优先于构造方法 静态代码块 构造代码块前面用static声明 在同类 ...
- 一文读懂 Redis 分布式部署方案
为什么要分布式 Redis是一款开源的基于内存的K-V型数据库,因为内存访问速度快,一般被用来做系统的缓存. Redis作为单机部署能够支持业务简单,数据量不大的系统需求,但在实际应用中,一旦系统规模 ...
- 进阿里真的这么难?P8大佬告诉你,你和阿里之间缺的只是这份笔记
一转眼今年已经到六月份了,在这个过去的半年里有人选择了安稳,有的人偏偏不... 最近小编就有个朋友,去面了个[P8 级架构师],也算是摸摸行情,为后面的一些安排提前做好规划~ 先给大家介绍一下我这个朋 ...
- 题解:2018级算法第二次上机 Zexal的排座位
题目描述: 样例: 实现解释: 一道看似复杂但实际既是斐波那契变形的题目 知识点:递推,斐波那契 通过问题的描述,可以得到以下规律:(除了座位数为一时)男生坐最后时,倒数第二个一定是女生:女生坐最后, ...
- Java集合类初探
目录 概述 Iterable和Iterator Collection List Queue Set Map 概述 Java中基本的常用的集合类,主要包含: List Set Queue Map 这 ...
- 数据分析07 /matplotlib绘图
数据分析07 /matplotlib绘图 目录 数据分析07 /matplotlib绘图 1. 绘制线性图:plt.plot() 2. 绘制柱状图:plt.bar() 3. 绘制直方图:plt.his ...
- Python之常用模块学习(二)
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- 数据可视化之分析篇(六)使用Power BI进行流失客户分析
https://zhuanlan.zhihu.com/p/73358029 为了提升销量,在不断吸引新客户的同时,还要防止老客户离你而去,但每一个顾客不可能永远是你的客户,不可避免的都会经历新客户.活 ...
- Django之Model、Form、ModelForm区别
本节内容: 1:Model https://www.cnblogs.com/shuai1991/p/10844662.html 2:Form ...