查看原文
其他

DDoS攻击:无限战争

轩辕之风 编程技术宇宙 2020-10-29

前情回顾

经过黑衣人和的合作,终于清除了入侵Linux帝国的网页病毒,并修复了漏洞。不曾想激怒了幕后的黑手,一场新的风雨即将来临。详情参见一条SQL注入引出的惊天大案

1

风云再起

小Q是Linux帝国网络部负责TCP连接的公务员。

一直以来工作都很轻松,加班也少,但自从小马哥到Linux帝国开设了nginx公司,小Q的工作量一下就大了起来,经常加班,为此小Q背后没少抱怨。


一大早,nginx按时启动,绑定了80端口监听,开始了今天的营生。

没过多久,今天的第一个客户来了。

小Q还是如往常一样,收到这个带有SYN标记的数据包后,创建了一个连接请求块,然后将其放入80端口归属的连接请求队列中,回复了一个带有SYN和ACK标记的数据包后,开启了一个定时器,等待第三次握手的完成。

没等多久,这个客户就发来了回信,三次握手完成。小Q把这个连接请求块转移到了80端口对应的连接就绪队列中,并按下了铃铛。


听到铃声的nginx线程从epoll_wait函数中醒来,调用accept函数,从队列中拿到了这个新来的客户,开始服务。

这就是小Q的日常,他已经干这份工作太久了,轻车熟路。


很快到了深夜,小Q准备打个盹儿,这么晚估计是没有活干了。


没想到刚躺下,就来了一个连接请求,小Q揉揉惺忪的睡眼,准备来处理,然后接着很快来了第二个,第三个,第四个······


奇怪的是,每一个客户只发送了一个SYN就没了音讯,眼看着连接请求队列里的请求块越来越多,最后实在没有空间安放新的请求块,小Q开始意识到情况不妙,拉响了帝国安全警报······


2

全军出击

十分钟前······


“快醒醒,有消息来了“,还在sleep的阿D被唤醒了。

“上峰总算想起我了,我来到Windows帝国都快一个月了,一直没有指示,只是让我保持静默,我都憋坏了。”,阿D伸了伸懒腰,起身调用recv函数取到了消息:

目标:222.230.189.34

端口:80

动作:伪造源IP地址,发送SYN数据包


读完消息后,阿D使用原始套接字构造了一个TCP数据包,将SYN标记点亮,伪造了一个源IP地址,将其发送了出去。

经过一通路由转发,这个数据包终于来到Linux帝国,却迟迟没有人来接待,侧目望去,原来,已经有数不清的TCP包堵在门口,还有无数类似的TCP包正在源源不断的涌入……


3

SYN Flood

此刻,帝国高层正在召开紧急会议。

防火墙:“现在有无数的网络连接进来,为了帝国的安全,我只好先关闭了网络,把那些数据包挡在外面。”

小马哥:“需要赶紧采取措施,恢复正常,我们nginx公司每秒钟都在丢失大量的客户,这是一笔巨额损失!”


帝国安全部长:“小Q,你把当前的形势介绍一下,大家一起来出谋划策。”

小Q:“好的。TCP的三次握手想必诸位都有所了解,收到SYN数据包后,我需要准备一个数据块来存储客户端的信息,敌军正是瞄准了这一点,给我发送大量SYN数据包,我就需要分配大量的数据块,直到把帝国空间耗尽。”

小马哥:“抱歉,我打断一下,你为何不及时把无效的数据块释放掉,腾出空间呢?

小Q:“当然有,我有一套超时机制,超时以后第三次握手还没来,我就会给释放掉。但现在问题是敌军声势浩大,刚刚腾出的空间马上又会被挤占。”

小马哥:“那简单,你把超时时间调小一点,尽快释放无效的数据块不就行了!”

小Q:“要是太小了,正常的用户因为网络原因,时延比较大的,这不就误伤了吗?”

小马哥:“嗯,这个你们自己权衡一下,取一个合适的值,如今也没有其他办法,赶紧恢复生产才是!”


安全部长:“小Q,先这样试试看”

小Q:“行吧,我这就去”


半小时后······


小Q:“大人,我已经按照指示执行,不过网络连接越来越多,这一招恐怕支撑不了太久,还是早做打算才是。”


安全部长:“WAF公司呢,你们有什么办法没有?”

WAF公司黑衣人:“大人,我们关注的业务在于web应用安全,此次的SYN Flood,实非我等擅长。”


现场陷入了久久的沉默……



良久,防火墙打破了沉默:“小Q,为何非得在收到第一次握手SYN数据包后就建立数据块?如果把数据块的建立时间放在第三次握手之后呢?

小Q:“如果一开始不用建立数据块占用空间,那确实解决了大麻烦!不过,不建立数据块,那如何把客户端的信息保存起来呢?”


防火墙:“保存什么信息?”

小Q:“客户端的IP、端口、序列号这些啊。”

防火墙:“这些信息在第三次握手来的数据包中也有啊,不用提前存起来嘛!”

小Q:“说的也是,唉,还是不对,第三次握手我得校验对方发来的ACK是不是我在第二次发给他的序列号+1,如果我提前不分配数据块把我发给他的序列号存起来,到时候就没办法校验了呀!不行,还是得提前存下来!”


防火墙:“有没有什么办法,不用提前存,也能做校验呢?”

小Q:“这,这怎么做?”

防火墙:“有了!第二次发给客户端的序列号,如果不是一个随机值,而是根据客户端信息和其他信息综合计算出来的一个哈希值,收到第三次握手的时候,我们拿到客户端答复的ACK,再重新计算一次哈希值,如果哈希值+1=ACK,那就能对得上,反之就是错误的包,直接丢弃!

还没等小Q回过神,安全部长起身鼓掌:“妙哉!这真是一个绝妙的点子!小Q,就按这个办法,赶紧去办!


4

绝处逢生

小Q回到工作岗位,按照防火墙提供的思路修改了策略。随后,通知防火墙重新打开网络码头,但究竟效果如何,小Q心里还是捏了一把汗。

网络恢复的一刹那,无数TCP SYN数据包涌了进来,这一次,小Q不再分配数据块,只是快速计算了一个哈希值作为序列号,回复给了客户端。小Q忙的满头大汗,但看到存储空间总算没有疯狂增长,小Q心里长舒了一口气。

收到消息的会议室里响起了热烈的掌声!安全部长:“本次经历值得牢记,我们给这个方案取个名字吧,告知比特宇宙其他的帝国,帮助大家一起抵抗黑暗势力的侵扰。”

WAF黑衣人抢先发言:“我觉得这个方式关键点在于把校验信息的存储从服务器放到了客户端,有点类似web技术中的Cookie。要不咱们就叫做SYN Cookie吧!”

防火墙:“嗯,这个名字好,总结的很到位”


一个小时后,疯狂的TCP SYN数据包潮水逐渐退去,Linux帝国终于恢复了往日的宁静,nginx公司的业务也恢复了正常。小Q抬头一看,天边已经微亮,这漫长的夜晚总算是熬过去了。


未完待续·······



彩蛋

“大人,Linux帝国有防火墙、WAF一帮人守卫,我们的攻击没有起到什么效果。”

“你以为他们真的是靠自己的本事胜利的吗?这次只是给他们点教训,我们的游戏才刚刚开始。


欲知后事如何,请关注后续精彩......



原创不容易,快转发分享给更多人看啊




 


精彩回顾

一条SQL注入引出的惊天大案
内核地址空间大冒险:系统调用闯荡Linux帝国:nginx的创业故事一个HTTP数据包的奇幻之旅远去的传说:安全软件群雄混战史我是一个流氓软件线程产品vs程序员:你知道www是怎么来的吗?比特宇宙-TCP/IP的诞生我是一个IE浏览器线程我是一个杀毒软件线程我是一个explorer的线程


  

扫码关注,更多精彩


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存