可以说是我试图进入安全口的天才第一步了,能走多远鬼知道呢

背景

去年年前接到的一个外包项目,是一个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基本防护的更多相关文章

  1. 生成静态页面的PHP类

    生成静态页面的PHP类: 复制代码代码如下: <?php   class html   {    var $dir; //dir for the htmls(without/)    var $ ...

  2. 一个简单的NodeJs静态页面的web服务器

    主要功能 1 显示www文件夹下静态html或文本类型的文件. 2 缺省访问文件功能. 通过config.js的defaultfile属性设置 3 如果文件夹下没有缺省文件,显示文件夹下文件列表 4 ...

  3. 可以完成99%的静态页面的HTML标签

    HTML:一套浏览器认知的规则HTML分为两个部分,头和身体.一个完整的网页相当于一个裸体的人,我们利用HTML给它穿上衣服,使它更好看.下面我将为大家介绍一下HTML一些基本的标签,而这些基本的标签 ...

  4. 删除静态页面的html

    function dellist(obj) { $(obj).parent().parent().remove(); }

  5. [react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?

    壹 ❀ 引 虚拟DOM(Virtual DOM)在前端领域也算是老生常谈的话题了,若你了解过vue或者react一定避不开这个话题,因此虚拟DOM也算是面试中常问的一个点,那么通过本文,你将了解到如下 ...

  6. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面

    DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...

  7. ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构

    和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...

  8. ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求

    我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...

  9. JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录

    前言  最近实施的同事报障,说用户审批流程后直接关闭浏览器,操作十余次后系统就报用户会话数超过上限,咨询4A同事后得知登陆后需要显式调用登出API才能清理4A端,否则必然会超出会话上限.  即使在页面 ...

随机推荐

  1. Java 内存回收机制

    当执行构造方法生成一个对象时,需要占用各种系统资源.当生成的对象不再使用时,就需要返回给操作系统,以免资源的泄露.在各种系统资源中,最常使用的就是内存.Java运行时系统通过垃圾收集周期性地释放无用对 ...

  2. Java NIO之Buffer的使用

    目录 Buffer简介 Buffer的核心属性 Buffer的创建与使用(ByteBuffer为例) 总结 参考资料 Buffer简介 缓冲区(Buffer):本质上是一个数组,用于临时保存.写入以及 ...

  3. 关于Dfs(1);

    问: 我们大部分在根不定的情况下喜欢Dfs(1):到底要不要这样呢? 解释: 首先Dfs(1):是没有任何问题的,毕竟根不定,随便选一个肯定有1,这是没问题的,但是,很多数据也是这么造的,比如在1处卡 ...

  4. 关于npm和yarn 安装vue脚手架

    第一篇博客有点小紧张.轻喷~ 第一步:安装node.js       地址 --------https://nodejs.org/en/ 详细步骤这里就不写了    可以去看     地址 ----- ...

  5. appium升级操作

    在app自动化测试中经常会碰到,因为appium版本低而导致,appium客户端连接不到appium服务端等一系列错误~ 其实appium升级很简单的哦~ 打开cmd命令行终端,键入npm updat ...

  6. 在Linux上部署jmeter

    一.服务器安装jmeter 1.将安装文件上传到Linux服务器 通过xshell文件上传工具,将文件 “apache-jmeter-5.1.1.tgz”上传 2.在服务器解压缩“apache-jme ...

  7. java 数据结构(一):java常用类 一 String类

    java.lang.String类的使用1.概述String:字符串,使用一对""引起来表示.1.String声明为final的,不可被继承2.String实现了Serializa ...

  8. 07 flask源码剖析之用户请求过来流程

    07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...

  9. 神经网络结构:DenseNet

    论文地址:密集连接的卷积神经网络 博客地址(转载请引用):https://www.cnblogs.com/LXP-Never/p/13289045.html 前言 在计算机视觉还是音频领域,卷积神经网 ...

  10. ant-design-vue中实现modal模态框的复用(添加,编辑展示同一个模态框)

    用两个button(添加,编辑)按钮展示同一个模态框,并不是什么大问题,问题在于解决这两个模态框得有自己的确定和取消方法 父页面完全接管子页面(利于子页面复用) 父页面代码: <template ...