使用 Service Worker 缓解网站 DDOS 攻击
前言
传统的 DDOS 防御开销很大,而且有时效果并不好。
例如使用 DNS 切换故障 IP 的方案,由于域名会受到缓存等因素的影响通常有分钟级延时,前端难以快速生效。例如使用 CDN 服务,虽可抵挡大多网络层攻击,但对应用层攻击却常有疏漏,攻击者可通过恶意请求消耗流量、日志存储等费用,导致欠费停止服务。例如购买流量清洗等服务,虽然效果不错但费用十分昂贵。
今天分享一种超低成本的网站 DDOS 防御方案 —— 不使用任何后端防御服务,纯前端实现!当然效果也非常极端:如果用户之前未访问过该网站,这种防御不会生效,网站被打垮仍无法访问;但如果用户之前访问过该网站,之后即可无视攻击,甚至服务器关机网站也能访问,并且还能保持更新!
前端代理
说到低成本、防攻击、离线访问等特性,大家可能会想到 Cloudflare 服务。不过前面提到,我们不使用后端防御,而是纯前端实现。
事实上,我们可以把 Cloudflare 搬到浏览器前端!这里不得不提 HTML5 中的一个 API —— Service Worker
,它能拦截当前站点产生的所有请求,并能控制返回结果,相当于一个反向代理服务。有了这个黑科技,即可在前端实现 CDN 功能。
我们为静态资源准备多个站点做冗余备份,当 Service Worker 加载资源出错时,可不返回错误给上层页面,而是继续从备用站点加载,直到获得正确结果才返回。这样,只要有一个备用站点可用,资源就不会加载失败。
相比传统使用 DNS 切换故障 IP 的方案通常有分钟级的延迟,这种 JS 控制的方案可精确到毫秒级,并且还能有多次试错的机会,从而大幅增加稳定性。
离线访问
Service Worker 的设计初衷就是为了增强网页的离线化体验,因此一旦安装即可在后台长期运行,即使服务器关机、浏览器重启,它也不会失效。
事实上,除了网页中的资源可被 Service Worker 拦截,网页本身也可以。Service Worker 安装后,用户在地址栏输入网址发起的那个请求其实也会被拦截,从而可从备用站点加载网页文件。
注意,这不是重定向,地址栏不会有变化。
因此即使网站被打垮,之前访问过的用户仍可通过 Service Worker 从备用站点加载页面,从而正常访问。
免费节点
使用冗余站点虽能提升稳定性,但攻击者仍可对备用站点发起攻击,尤其是恶意消耗流量费用的攻击,导致成本大幅上升。
为此,我们还可使用一种更极端的方案 —— 使用免费 CDN 作为备用站点,例如 jsdelivr.net、unpkg.com、IPFS Gateway 等等,图片则可上传到各大网站的相册。
对于非图片类型的文件,甚至还可以封装成图片上传,使用时再从中提取!例如 此文件 正是从 该图片 中提取。
虽然单个免费 CDN 的稳定性可能不高,但多准备几个,稳定性就呈指数级上升了。
至于恶意攻击,几乎不可能打垮。DDOS(Distributed DOS)的精髓在于分布式,将分布在各地的流量汇聚到一起,从而增加伤害;而我们正好相反,将集中的流量分摊到各地,变成一个去中心化的分布式站点,从而化解攻击。
演示
这个方案原理虽不复杂,但实现起来还是有很多细节。为方便开发者使用,这里提供一个工具 https://github.com/EtherDream/freecdn,可实现上述提到的所有功能。
演示案例:https://freecdn.etherdream.com/time.html
该页面通过 HTML 静态输出当前时间,刷新可变化。
关闭页面,退出浏览器。现在模拟该网站被打垮,例如通过 hosts 屏蔽站点域名:
0.0.0.0 freecdn.etherdream.com
清理系统 DNS 缓存(当然 Chrome 等浏览器自己维护 DNS 缓存,退出浏览器即可清理)。
打开浏览器,再次访问该页面。页面不仅能正常访问,甚至还能更新!
通过控制台可见,虽然当前站点已无法连接,但后台 Service Worker 将页面代理到 https://freecdn1.etherdream.com:30000/time.html 这个备用地址,因此页面仍能显示,并且地址栏毫无变化 —— 尽管该页面的内容来自第三方站点。
接口防御
对于纯静态资源的站点,我们可将所有资源甚至包含 HTML 文件都通过免费 CDN 加速,从而大幅降低成本、增加稳定性。
但对于动态接口,又该如何实现防御?事实上,接口数据也可以分发到多个备用节点上,细节可参考 POST 请求代理 的案例。
当然,动态接口不同于静态资源那样可使用大量免费 CDN 分摊攻击流量,因此即使有背后多个备用节点,攻击者仍可找出来然后进行攻击。对此,我们需要更多的巧妙的防御思路,例如通过云防火墙和 Service Worker 使用约定的算法生成端口号,从而可不断更换端口,识别出固定不变的攻击流量;例如通过最便宜的抢占式主机(几分钱一小时)购买大量公网 IP 作为转发节点。。。细节下回讲解。
当然即使不考虑动态接口,网站被打垮后仍能访问静态内容,相比完全打不开要好得多。
使用 Service Worker 缓解网站 DDOS 攻击的更多相关文章
- (转)网站DDOS攻击防护实战老男孩经验心得分享
网站DDOS攻击防护实战老男孩经验心得分享 原文:http://blog.51cto.com/oldboy/845349
- 小型网站如何防范DDoS攻击
ddos(Distributed Denial of Service,分布式拒绝服务攻击),俗称洪水攻击.是在传统的DoS攻击基础之上产生的新的破坏力更强的攻击方式.分布式拒绝服务攻击是指借助于客户/ ...
- 使用多个DNS供应商以缓解DDoS攻击
随着不安全物联网(IoT)设备的激增,针对域名系统(DNS)供应商的分布式拒绝服务(DDoS)攻击在数量和规模上正在不断增加.这些攻击随之影响依赖于这些供应商进行域名解析的网站.虽然DNS供应 ...
- 老板怎么办,我们网站遭到DDoS攻击又挂了?
相信现在正在阅读此文的你,一定听说过发生在上个月的史上最大的DDoS攻击. 美国东部时间2月28日,GitHub在一瞬间遭到高达1.35Tbps的带宽攻击.这次DDoS攻击几乎可以堪称是互联网有史以来 ...
- 网站遭遇CC及DDOS攻击紧急处理方案
检测访问是否是CC攻击的命令: 80口为网站的访问端口,可以根据实际情况进行修改 # netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: ' ...
- 【转载】网站遭遇DDoS攻击怎么办
在网站运维过程中,有些人的网站遭遇过DDoS攻击,DDos攻击又叫做分布式拒绝服务攻击.DDos攻击将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力 ...
- 【dedecms网站安全】如何防止dedecms网站被DDos攻击
[dedecms网站安全]如何防止dedecms网站被DDos攻击 第一步:进入后台,系统->添加新变量变量名称:cfg_anquan_cc 变量类型:布尔(Y/N) 参数说明:是否开启防CC ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
- 如何防御网站被ddos攻击 首先要了解什么是流量攻击
什么是DDOS流量攻击?我们大多数人第一眼看到这个DDOS就觉得是英文的,有点难度,毕竟是国外的,其实简单通俗来讲,DDOS攻击是利用带宽的流量来攻击服务器以及网站. 举个例子,服务器目前带宽是100 ...
随机推荐
- 41、解决du与df统计不一致的解决方法
41.1.案例说明: 通过df -hT和du -sh /.du -h --max-depth=1 /命令 发现磁盘的使用不量不一致,使用'df -hT'命令查看磁盘的使用量要 比使用'du -sh / ...
- 10、ssh中scp、sftp程序详解
每次都是全量拷贝,rsync是增量拷贝 10.1.scp的基本用法: -r:拷贝目录; -p: 保持属性: -l:限速设置; scp -P52113 /etc/hosts lc@172.16.1.41 ...
- 24、mysql数据库优化
24.1.如何判断网站慢的排查顺序: 客户端->web->nfs->数据库: 24.2.uptime命令详解: [root@backup ~]#uptime 13:03:23 up ...
- Flex中利用事件机制进行主程序与子窗体间参数传递
在开发具有子窗体,或者itemrenderer的应用时,常常涉及到子窗体向父窗体传递参数或者从itemrenderer内的控件向外部的主程序传递参数的需求.这些都可以通过事件机制这一统一方法加以解决. ...
- 暑假自学java第八天
1.接口的概念(关键字interface ) Java程序设计中的接口 ( interface)也是一种规范,用来组织应用程序中的类,并调节它们的相互关系.接口是由常量和抽象方法组成的特殊类,是对抽 ...
- ExtJs4学习(三)组件查找 ComponentQuery类
Extjs3.x: ID:这就是所熟知的Ext.getCmp("组件ID"),缺点是id重复导致出错. ref:在EXTJS3中,所有的组件都会有一个ref属性,也就是refere ...
- 简单学习java内存马
看了雷石的内存马深入浅出,就心血来潮看了看,由于本人java贼菜就不介绍原理了,本文有关知识都贴链接吧 前置知识 本次主要看的是tomcat的内存马,所以前置知识有下列 1.tomcat结构,tomc ...
- Codeforces Round #139 (Div. 2) 题解
vp上古场次ing CF225A Dice Tower 1.题目简述: 有 \(n\) 个骰子被叠在了一起.对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) . 你是小明,你只能从正面看这个 ...
- AspNetCore&MassTransit Courier实现分布式事务
在之前的一篇博文中,CAP框架可以方便我们实现非实时.异步场景下的最终一致性,而有些用例总是无法避免的需要在实时.同步场景下进行,可以借助Saga事务来解决这一困扰.在一些博文和仓库中也搜寻到了.Ne ...
- 个人博客开发之blog-api 项目整合JWT实现token登录认证
前言 现在前后端分离,基于session设计到跨越问题,而且session在多台服器之前同步问题,肯能会丢失,所以倾向于使用jwt作为token认证 json web token 导入java-jwt ...