起首,为了对CDN进行报复打击,我们必需清晰CDN的工作道理,这里我们再来简单介绍一下CDN的工作模型。
CDN的全称是Content Delivery Network(内容分发收集),经由过程在收集遍地的加快节点办事器来为网站抵当歹意流量,把正常流量进行转发。用简单点的话来讲,CDN一般有三个感化
1. 跨运营商加快:我们本身的网站常常只属于一个运营商(好比:电信),而加快节点遍及每家运营商,因而和网站不合运营商(好比:联通)的用户拜候起来就不会那么慢了。
2. 缓存加快:良多的静态资本和一部门页面更新都是比较慢的(好比首页),这个时辰CDN就会按照浏览器的max-age和last-modified值和治理员的预设值来进行缓存,因而良多流量CDN节点就不会每次都来向网站要求,CDN节点可以直接自作主张地将射中的缓存内容返回。
3. 歹意流量过滤:这是CDN很是首要的一个感化,也是良多网站会用CDN的启事,因为CDN能为我们抵当报复打击大年夜流量报复打击、通俗的报复打击(好比注进等),只有正常流量才会转发给网站。
这里还要申明几个名词:
源站:我们本身的阿谁网站就被称为是源站。
反向代办署理:CDN节点向源站要求数据的编制就叫反向代办署理,也就是上文所说的转发。
回源:CDN节点向源站要求数据的行动就叫做回源。
下面开端我们的切磋之旅。
我们在做OpenCDN测试的时辰,碰着了一些小标题问题。发现一个没有人拜候的网站竟然会有流量,并且有着惊人的拜候次数。
我们的OpenCDN有2分钟一次的反向代办署理检测,可是此次数加起来也就戋戋的720次,而这400万的拜候次数是哪里冒出来的?然后我们查看了日记,发现单个域名的日记达到了58G之多,而将其打开以后发现X-Forwarded-For字段中(X-Forwarded-For机制是经由过程一层代办署理跋文录一个IP,让源站在利用CDN后可以或许获得真实的访客IP而不是CDN节点IP)充满着大年夜量有的IP,并且都是本办事器IP。我们刹时大白了甚么,然后往治理端上验证了一下,果不其然地,我们一不谨慎把源站IP设成了CDN节点的IP,不外那时我们并没有发现。因而这么大年夜的流量也好诠释了,因为2分钟一次的检测触发CDN节点的回源,而这个站点的源站是CDN节点本身,因而CDN就开端不竭本身反向代办署理死轮回,如许一个要求就被无限地放大年夜了。当超时或HEADER太大年夜(就是X-Forwarded-For字段导致HEADER溢出)的时辰,要求会被丢弃。
把站点的源站IP设为CDN节点本身,可以或许让CDN节点进行自我的反向代办署理死轮回,然后放大年夜流量。
貌似有点意思,小火伴们因而顿时就步履起来了,进行了尝试。
我们在安然宝上成功地将源站IP设置成了某个为我们加快的CDN节点IP,然后在美帝的一台小vps上开webbench用2000个线程往打这个这个站点(不管是哪个CDN节点收到要求,要求最终城市会聚到阿谁无辜的被设源站的CDN节点),不外尝试成果其实不睬想,节点没有宕机,经由过程IP反查找到一台和我们公用一个CDN节点的网站,经由过程这个CDN节点反向代办署理拜候阿谁网站,呈现了卡顿和打不开环境,仅此罢了。因为没法汇集到安然宝的这个节点的机能数据,我们也没法对我们的报复打击做出评估。并且我们这个尝试贫乏了一个对比组,事实是因为死轮回把流量放大年夜导致CDN节点卡顿,仍是这个2000线程本身就可以把CDN节点打卡。
因而我们总结了一下,猜想这类节点反向代办署理本身的报复打击手法可能可以合用于如许的场景
你想要报复打击某个CDN节点,可是假定打404页面耗损不了太多,而假定打CDN中的某个站点,因为流量会穿透过往,可能还没有把CDN节点打掉落,背后的站点早被穿透死了。这个时辰,假定让节点进行本身反向代办署理死轮回,他就会把所有的流量给吃进往,并且没法吐出来,这个时辰可以产生必然量的流量杠杆效应,可使得CDN节点呈现异常。
不外话说回来,这类报复打击的防御编制也异常简单,只要在设置源站IP的时辰,不让设置CDN节点IP就好了,只要在网站前端交互输进的时辰加点验证就好了。
我们考虑到我们没法对不是我们的CDN节点的带宽上限,机能上限有个很好的评估,黑盒式的试探可能带来不了甚么,因而我们拿我们本身的CDN节点开刀。
同时我们继续对这个思路进行摸索。我们发现,既然一个节点能死轮回,那两个节点如何样?成果是必定的,并且产生了质的改变。我们假定了如许的一个场景
我们的opencdn.cc在甲CDN办事商注册办事,并且在乙CDN办事商注册办事,然后我们获得甲CDN办事商的一个CDN加快节点1.1.1.1,然后又获得乙CDN办事商的一个CDN加快节点2.2.2.2。 然后智慧的你必然已猜到了。我们把在甲CDN办事商设置源站为乙的加快节点2.2.2.2,在乙CDN办事商设置源站为甲的加快节点1.1.1.1,然后甲会问乙往索取源站,乙又来问甲索取源站,因而1.1.1.1和2.2.2.2就很高兴地并且不断地交换了起来~
因而我们也进行了尝试。此次我们采取POST包进行测试。
用POST包的启事有两个
1.CDN节点是会有缓存机制的,方才你要求的地址射中缓存,那么就直接返回,不会成为死轮回了,而POST包则有一个很好的特点,尽对回源,一点也不含混。
2.POST包可以扩大年夜体积,在划连续接数的环境下让效应加倍较着。
我们本次测试发送500个POST包,每个别积大年夜概为10k摆布。然后总共发送的流量为5M。
然后让我们来看下两个节点的反应
不外仿佛到了带宽上限。因为我们手中的机械事实也不是很给力。
然后让我们来看下这500个POST包产生的结果
58.215.139.124
RX bytes:5473847154 (5.0 GiB) TX bytes:17106340685 (15.9 GiB)
RX bytes:6014294496 (5.6 GiB) TX bytes:17717990777 (16.5 GiB)
流进 540447342(515MB) 流出 611650092(583MB)
112.65.231.233
RX bytes:5583125549 (5.1 GiB) TX bytes:5022744608 (4.6 GiB)
RX bytes:6133578284 (5.7 GiB) TX bytes:5649798353 (5.2 GiB)
流进 550452735(524MB) 流出 627053745(598MB)
我们拿最小的进行测算吧,大年夜概把流量扩大年夜了100倍摆布,然后假定把流进流出加起来就是扩大年夜了200倍摆布。
这一种报复打击编制和前一种比拟有两个长处
1.CDN办事商不克不及把源站IP做限制来防御,因为他没法知道别家的CDN节点IP。
2.能借刀杀人,可以用一家CDN办事商的CDN节点来打别的一家CDN办事商。
然后我们还进行了一些联想,一个站点可以把两个节点陷进死轮回,假定把更多的节点来进来呢?
我们可以如许。让多个CDN节点和一个CDN节点死轮回,把中间的CDN节点带宽耗尽。
我们还可以如许。让三个CDN节点死轮回,假定有做流量上的流进流出探测限制,如许能包管流进流出不为一个IP。
事其实CDN办事商添加一个域名的代价是很小的(免费),我们可以用一个一个域名将节点串起来,然后啪一下开端流量死轮回震动。
好了,让我们用四个字总结一下此次的缝隙的特点:借力打力。
那么若何来防御这类和可能演变出来的报复打击呢?
1. 避免把源站IP设为CDN节点本身(这是必需的)。
2. 限制每个站点的带宽。
3. 对要求超时的源站做必然限制。
4. 经由过程X-Forwarded-For来进行限制,超越多少层主动丢弃。
和CDN节点已存在的一系列的软硬防都可让一部门的报复打击流量没法成型,天然也没法构成死轮回震动。
本文仅为一种CDN流量放大年夜报复打击的思路,只是做过一些小范围的尝试,也欢迎大年夜牛们进行验证。如有不足的地方或逻辑上的弊端还请提出,感谢您的浏览。