写点什么

自建 CDN 防御 DDoS(1):知己知彼,建设持久防线

  • 2013-02-18
  • 本文字数:3262 字

    阅读完需:约 11 分钟

前言

本议题是我们在 OWASP 杭州区 2013 年岁末年初安全沙龙中进行分享的内容,在此我们对这个议题的整体内容进行了重新归纳梳理,形成了文字版。

在本文中,DDoS 的案例与应对经验均来自于某市场占有率很高的客服系统所遇到的实际场景,分别从成本、效率和具体架构设计(选型、配置、优化等)角度来分析通过自建 CDN 来应对不同类型的 DDoS 攻击。

背景介绍

客服系统的主要业务是提供基于网页的实时动态的文字聊天,主要应用在各类网络商品销售、网站在线客服等领域,总用户数 58 万,同时在线活跃的用户约 12 万 / 天。

这些应用领域通常行业之间的竞争比较激烈,其中包括在线下无法名正言顺的灰色 + 暴利产业,导致竞争对手之间经常发动 DDoS 恶意攻击。但营销网站往往是单面加速,加上推广时效性很强,很难被彻底打击,于是一些自作聪明的黑客通过攻击网站的在线客服系统,导致网站无法跟访客沟通,不能交易,从而达到恶意攻击的目的。因此客服系统这个原本有助于网站营销的工具反而成了被攻击的主要对象,虽然伤得委屈,但也不得不面对挑战。

我们遭遇的 DDoS 攻击类型包括:延缓性的 CC 攻击和致命的大流量攻击。下面将对两种攻击方式的攻击特点、防御思路和我们用过的一些防御方案进行简单的介绍。

延缓性的 CC 攻击

攻击特点

攻击者借助网络上提供的大量代理服务器 IP,利用攻击软件,生成指向受害主机的合法请求。

这类攻击对攻击者来说成本低,而且网上现成的软件多,攻击的风格相对比较”温柔谨慎”,其目的是通过逐渐增多的垃圾请求,消耗服务器的正常应用开销如 CPU, 内存, 网卡压力,甚至是网络拥堵,然后请求无响应,无出口流量,导致网站变慢,达到网站无法访问的目的。

防御思路

对于这类攻击,有两个漏洞特点可以被我们利用,从而阻止这类恶意的 CC 攻击,关键是响应一定要快。

第一个特征,由于是人为生成了大量的非法请求,引发网络的 incoming 流量会异常增大(正常情况下,incoming 流量小,outgoing 流量大);第二个特征,攻击力度有一个渐增过程,我们要充分利用这个宝贵的时间,让机器第一时间智能的做出反应,调用日志分析脚本做决策,加以防御或者引流。

具体的方法有多种,这里只列举我们所使用的两种:

  1. 使用监控软件的流量监控图来触发日志分析脚本,如图所示(zabbix 为例):
  2. 利用 bash 脚本来统计 incoming 流量,发现异常时,调用相应日志分析脚本,实现阻击。
复制代码
#!/bin/bash
DEV=$1 # 定义监听网卡
LIMIT=$2 # 定义触发阙值
WARN=$3 #定义报警阙值
TIME=$4 # 定义网卡数据采集频率
mobile_num="13xxxxxxxxxx" # 定义接收报警短信手机号码
LOCK="/tmp/.exchange_proxy.lock"
[ -z $DEV ] && echo "$0 ethx limit_band(kbps) warn_limit(kbps) seconds" && exit 0
[ -z $LIMIT ] && LIMIT=800000 # 800 kbps
[ -z $WARN ] && WARN=900000 # 900 kbps
[ -z $TIME ] && TIME=10 # 10s
send_fetion() {
#定义飞信报警短信接口
}
while : ; do
net_flood=`ifconfig $DEV|sed -n "8"p`
rx_before=`echo $net_flood|awk '{print $2}'|cut -c7-`
sleep $TIME
net_flood=`ifconfig $DEV|sed -n "8"p`
rx_after=`echo $net_flood|awk '{print $2}'|cut -c7-`
rx_result=$[(rx_after-rx_before)/$TIME]
over_bw=$[(rx_result-LIMIT)]
if [ $over_bw -gt 0 ];then
BOOL=`echo "$rx_result>$WARN"|bc` #判断是否为攻击
if [ $BOOL -eq 1 ];then
# 确认为攻击,执行策略并发送短信
send_fetion $mobile_num "$STR"
else
# 流量超标,发送短信,请留意
send_fetion $mobile_num "$STR"
fi
fi
sleep $TIME
done

过滤脚本实现原理就是在服务器上启动日志分析机制,在第一时间找出异常的 IP、Agent,URL 或者其它特征码,从内核层利用 iptables 对恶意 IP 进行过滤,在应用层上利用 nginx 的 http 关键词进行过滤,直接返回 badcode 444 进行拦截。

方案缺点

无论是从内核级别还是应用级别,对服务器本身的 CPU 和内存的依赖度高,如 iptables 的过滤本身对服务器的 CPU 压力很大,在阻止 IP 超过 15K 个,服务器基本不可用了;Nginx 在阻止 HTTP 请求时,由于 nginx 会给每个 http 请求分配内存和处理链规则,内存资源耗尽;随着流量的不断增大和攻击时间的持续,网卡压力也大,资源最终被耗尽。

所以,这个方案治标不治本。

致命的大流量攻击

攻击特点

这种攻击通常以 tcp syn,icmp 和 UDP(尤其是 UDP 包,单 UDP 的数据包可以很大)方式为主。客服系统遭遇到的最大的一次为 16G 的攻击流量,整个机房都被影响到。攻击者通常控制大量肉鸡或者直接勾结 IDC 里的服务器和带宽资源,对目标进行流量打击。此时流量会快速占满服务器的网络带宽,导致无法响应任何用户请求。

这类攻击需要购买大量带宽资源,对于攻击方来说,成本挺高,但是下手“快狠准”,目的是让网站在短时间内彻底无响应。

由于这类攻击会引起流量陡增,IDC 里的流量监控设备也会很明显的察觉到这个现象。IDC 通常采取的措施一般是丢车保帅,直接将这个被攻击的 IP 拉黑名单甚至直接拔线,让攻击对象自杀。这对本应该需要帮助的客户无疑是落井下石,雪上加霜。

防御思路

应付此类流量攻击的防御方式有:

  • 架设硬防火墙
  • 租用高防节点
  • 租用 CDN 分散目标流量

方案缺点

  • 架设硬防火墙:市面上 2G 硬防单价在 10W 左右,集群防御代价更大,虽然硬件级的防御性能较高,但面对流量洪水也是杯水车薪,且副作用也不容小觑。
  • 租用高防节点:高防节点有防御带宽,防御流量,共享独享区分,各个套餐的组合价格相差很大,分流策略也不同,超过高防承诺的流量后,防御失效或者再加钱,但都有性能损耗和副作用。
  • 租用 CDN 分散目标流量:市面上的 CDN 提供商都是以流量为收费标准,这对于经常遭受流量攻击的网站来说,反而要为攻击流量买单,这着实让人哭笑不得。

无论是采购的硬件成本和高防资源还是 CDN 加速,都成本昂贵,闲时资源利用率低,攻击高峰时面对有组织有规模的流量时又捉襟见肘,还伴有副作用(参见绿盟黑洞防火墙的原理),并非长久之计。

处于弱势的被打击方

综上所述,我们无论做哪个抉择都很痛苦。

我们跟发起攻击的人有过长达近一年的交流,目前了解到这是一个非常完整的产业链(上游人员早已身居海外,远程遥控指挥行动,根本无法查处),他们手上控制了大量的攻击资源,并且攻击资源本身就来自于 IDC。攻击者为了快速牟利,本身也喜欢和推荐这种直接了当的方式来对目标进行打击,在发动攻击时,他们能够调集到多个 IDC 的带宽资源来对目标打击(这一现象也折射出了当前国内不规范的 IDC 管理)。

从这一角度来看,被打击方永远都处于弱势地位,以势单力薄的架构和极其有限的资源,根本无法抵抗强大的集群资源攻击。

我们一直思考一个问题:如果我们持续投入这些资金,危机过去或者若干年后,能给我们留下些什么?因此,我们跳出了单节点防御和租用 CDN 的思路,综合上述方案的优点,转而自建 CDN 的方案。

长久之计:自建 CDN

自建 CDN 的好处有几个方面:

  • 旁路做流量清洗(痘痘长在别人脸上最好)
  • 资源充分利用:无攻击的时候,做路由加速,有攻击的时候,做节点切换(一物多用)
  • 随着投入的资金增加,防御 DDoS 攻击的能力增强(长远规划,资金回报率高)

有关自建 CDN 具体建设的思路如何,成本多少,我们会在系列的下一篇文章中进行介绍。

作者简介

邵海杨(个人页面),来自杭州 Linux 用户组。网名“海洋之心”,系统架构师,业余撰稿人,致力于开源软件及前沿科技的研究和探索。

张磊(微博博客),来自杭州谷歌开发者社区。专注于信息安全技术领域,曾主导多项银行 / 证券行业网站安全测试和入侵取证分析项目,为四大银行提供安全防护技术支持。目前创业做互联网安全防护。

相关阅读

  1. 自建 CDN 防御 DDoS(2):架构设计、成本与部署细节
  2. 自建 CDN 防御 DDoS(3):架构的后续改进
2013-02-18 00:0113540
用户头像

发布了 40 篇内容, 共 26.6 次阅读, 收获喜欢 142 次。

关注

评论

发布
暂无评论
发现更多内容

前端三件套 HTML+CSS+JS基础知识内容笔记

明金同学

前端

打印 Logger 日志时,需不需要再封装一下工具类?

程序员小航

Java 日志 slf4j

怎样提高报表呈现的性能

陈橘又青

sql 9月月更

2022华为开发者大赛开学动员 开启想象力无限创新

华为云开发者联盟

云计算 后端 企业号九月金秋榜

架构模块一作业

Diana S

架构实战营

【数据结构与算法】详解 “清华大学(考研)OJ题”_ 二叉树重要面试OJ题

Dream-Y.ocean

面试 算法 清华大学 9月月更

HowTo:Pipy 如何修改请求和响应的内容

Flomesh

Service Mesh 服务网格

明道云新增四项国产信创平台兼容性认证

明道云

跟着卷卷龙一起学Camera--内存池浅析06

卷卷龙

ISP 9月月更

【web开发基础】php开发基础快速入门(1)-PHP介绍及开发环境快速安装和基本使用介绍

迷彩

Web应用开发 php开源 9月月更 web开发基础

原生Redis跨数据中心双向同步优化实践

京东科技开发者

数据中心 幂等性 同步 数据容灾 Redis 数据结构

议题征集:NGINX Sprint China 2022 线上大会

NGINX开源社区

nginx 开源软件 Sprint

读书笔记|择一城以定财富,择一行以定发展

宇宙之一粟

读书笔记 职业 个人感悟 9月月更

最高增强至1440p,阿里云发布端侧实时超分工具,低成本实现高画质

阿里云大数据AI技术

机器学习 企业号九月金秋榜

【数据结构与算法】“堆”还能这样用_堆的应用

Dream-Y.ocean

面试 9月月更

【中秋特辑-代码解析月饼节】C++比C语言更加规范、方便?是因为增加了如下特性 | C++98 & C++11 | C++难学?带领大家一步一步深度剖析 | 简单易懂

Dream-Y.ocean

c++ 底层 细节 9月月更

【数据结构与算法】一篇文章带你玩懂 “栈和队列”(增、删、查、改)的实现_【附源码、动图】

Dream-Y.ocean

队列 数据结构与算法 9月月更

从东南亚到中东,为什么社交类产品成为游戏出海的突破口?

融云 RongCloud

白皮书 社交网络 出海 社交娱乐

C++来时路 _ 重温经典之C++类和对象 | 三大特性之一 - 封装 | 腾讯面试题

Dream-Y.ocean

c++ 封装 底层 腾讯面试 9月月更

openjdk镜像的tag说明

程序员欣宸

Docker Docker 镜像 9月月更

【数据结构与算法】2道面试真题,带你领略算法思想【附思路、动图、源码】

Dream-Y.ocean

面试 链表 9月月更

深度剖析“八大排序”(下)- 交换排序 | 快速排序 & 优化 | 非比较排序_探寻一些不为人知的细节

Dream-Y.ocean

排序算法 9月月更

【数据结构与算法】LeetCode面试真题,带你领略算法思想

Dream-Y.ocean

面试 队列 9月月更

【数据结构与算法】二叉树题目很难?一句”技巧“巧做基础二叉树题目

Dream-Y.ocean

二叉树 二叉树遍历 9月月更 技巧总结

大数据ELK(六):安装Elasticsearch

Lansonli

ES 9月月更

Python语法之模块和包(1)

梦笔生花

9月月更 Python语法 模块的创建

跟着卷卷龙一起学Camera--内存池浅析05

卷卷龙

ISP 9月月更

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

华为云开发者联盟

Python 人工智能 企业号九月金秋榜

少儿编程是智商税?还是未来的生存技能?

博文视点Broadview

【数据结构与算法】粽子树?二叉树_关于堆你不知道的事情

Dream-Y.ocean

栈和队列 9月月更

深度剖析“八大排序”(上)_ 探寻一些不为人知的细节

Dream-Y.ocean

排序算法 9月月更

自建CDN防御DDoS(1):知己知彼,建设持久防线_安全_邵海杨_InfoQ精选文章