当前位置: 首页 > 科技观察

低成本防御网站DDOS攻击

时间:2023-03-18 23:58:50 科技观察

前言传统的DDOS防御通常采用“硬防御”的方式,导致开销很大,有时效果也不佳。比如在使用DNS切换失败IP的方案中,由于域名会受到缓存等因素的影响,通常会有分钟级的延迟,前端很难快速生效.例如,使用CDN服务可以抵御大部分网络层攻击,但对应用层攻击往往有疏漏。攻击者可以通过恶意请求消耗流量、日志存储等费用,造成欠费和服务中断。比如购买交通清洗等服务,虽然效果不错,但成本非常昂贵。今天分享一个超低成本的网站DDOS防御方案——无后台防御服务,纯前端实现!当然,效果也很极端:如果用户之前没有访问过网站,这个防御就不会生效,网站就会被屏蔽。被打败后仍然无法进入;但如果用户之前访问过该网站,则之后的攻击可以忽略,即使服务器关闭也可以访问该网站,并且还可以更新!前端代理提到低成本、抗攻击、离线访问等特性,你可能会想到Cloudflare服务。不过前面说了,我们不采用后端防御,而是纯前端实现。其实我们可以把Cloudflare搬到浏览器的前端!这里不得不提一下HTML5中的一个API——ServiceWorker,它可以拦截当前站点产生的所有请求并控制返回结果,相当于一个反向代理服务。有了这个黑科技,前端就可以实现CDN功能了。我们可以准备多个站点对静态资源进行冗余备份。当ServiceWorker加载资源错误时,不会向上层页面返回错误,而是继续从备站加载,直到返回正确结果。这样,只要有可用的备用站点,资源就不会加载失败。相对于传统的通过DNS切换故障IP通常会有分钟级延迟的方案,这种JS控制的方案可以精确到毫秒级,而且也有多次试错的机会,从而大大提高稳定。离线访问ServiceWorker的初衷是为了提升网页的离线体验,所以一旦安装,可以在后台长时间运行,即使关闭服务器重启浏览器也不会失败.其实除了网页中的资源被ServiceWorker拦截外,网页本身也可以被拦截。ServiceWorker安装后,实际上会拦截用户在地址栏输入URL发起的请求,从而实现从备用站点加载网页文件。请注意,这不是重定向,地址栏不会改变。这样即使网站挂了,之前访问过的用户仍然可以通过ServiceWorker从备用站点加载页面,从而正常访问。虽然免费节点使用冗余站点可以提高稳定性,但攻击者仍然可以对备份站点发起攻击,尤其是恶意消耗流量费用的攻击,导致成本大幅增加。为此,我们还可以采用更极端的方案——使用免费的CDN作为备份站点,比如jsdelivr.net、unpkg.com、IPFS网关等,图片可以上传到各大网站相册。对于非图片文件,甚至可以打包成图片上传,使用时再提取出来!比如这个文件是从图片中提取出来的。虽然单个免费CDN的稳定性可能不高,但是如果多准备几个,稳定性会成倍增加。至于恶意攻击,几乎是不可能战胜的。DDOS(DistributedDOS)的本质在于分布式,将分布在各地的流量汇集起来,增加危害;而我们恰恰相反,把中心化的流量分散到各个地方,变成去中心化的分布式站点,从而化解攻击。虽然这个方案的演示原理并不复杂,但是在实现上还是有很多细节问题,比如节点选择策略和资源列表格式的设计,以及第三方站点内容完整性、线下资源被篡改等安全问题withbyXSS一定要注意。为了方便开发者,最近做了一个命令行工具https://github.com/EtherDream/freecdn,可以实现上面提到的所有功能。演示案例:https://freecdn.etherdream.com/time.html该页面通过HTML输出当前时间,刷新时可以更改。关闭页面并退出浏览器。在hosts中添加0.0.0.0freecdn.etherdream.com屏蔽域名,模拟站点坏掉。打开浏览器并再次访问该页面。不仅页面可以正常访问,内容甚至可以刷新更新!通过控制台可以看到,虽然当前站点无法连接,但是仍然可以通过ServiceWorker从备站点加载页面!接口防御对于纯静态资源的站点,我们可以将所有资源转移到即使包含的HTML文件也通过免费的CDN加速,大大降低成本并提高稳定性。但是对于动态接口,如何实现防御呢?动态接口的防御比较复杂,但是还是有一些巧妙的解决办法。例如,云防火墙和ServiceWorker使用约定的算法生成端口号,从而不断改变端口拦截攻击流量;比如代理多家云主机厂商,“扫”国防流量的免费额度;比如通过最便宜的抢占主机公网IP购买大量主机。..下次会详细说明。当然,就算不考虑动态界面,网站坏了之后静态内容还是可以访问,但是不能交互,总比根本打不开强多了。