作者:陌溪
陌溪的学习笔记:http://note.moguit.cn
大家好,我是陌溪
就在最近,蘑菇博客官网又又又挂了,开始以为只是普通的宕机,直接重启完事~
没想到通过 SSH 命令想进入到服务器的时候,一直提示超时,发现我竟然进不去自己的服务器了??
遇到这种情况后,我直接在腾讯云服务器后台,点击重启,然后才勉强的进去了
但是,在重启后不久,发现网站恢复了,以为蘑菇万事大吉了。然后过了一会后,蘑菇官网又打不开了!!!后台看了看日志,我嘞个去,发现 CPU 和 磁盘IO 一直在 100%!
蘑菇后台监控
然后,赶快联系到搞服务器的小伙伴:泪梦红尘,一起来排查问题。
以下,是我和红尘大佬一起交流的分析思路
-------------------------------------------------------------------------------
通过上图的分析,显示症状为 CPU 和 IO 同一时间占用 100%, 单看这张图的话 CC 攻击无疑了。
CC攻击:是DDoS攻击的一种常见类型,攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装
磁盘IO爆满
再看一张 nginx 日志
随后分析 发现只有这一个请求连接 而且只有一个ip请求 ?
难道是 while(true){sendGet(https://www.moguit.cn/)} 蘑菇被一个人恶作剧搞挂了 ?
从海量的 nginx 日志中,发现了一些端倪
发现搞事的人
然后百度了一下这个 ip 地址,发现是国外的 ip,那大概率就是别人用来 CC 的肉鸡了
搜了下ip
打开云服务器后台,找到防火墙,直接禁掉 IP 关小黑屋,设置一下非法请求策略就基本隔离了这种恶作剧
关小黑屋
但是,就在我给陌溪出谋划策两天后,我的服务器让人一天打进黑洞两次 !
jingya002
从日志来看,直接打了我服务器 22G 流量
流量打了22G
然后,我的服务器就被腾讯云封了
服务器被封了
虽然日志显示峰值只有 10G 但是那是3分钟的量 3 分钟后就进了黑洞没有在计算了,而这次攻击持续了一个多小时,可以想象流量有多少!
这次的攻击方式是以 UDP 发包的形式发送攻击的,下面我就给大家介绍一下常见的几种攻击方式和基本防护策略!
常见的网络攻击方式
第一种CC攻击
- CC攻击( ChallengeCoHapsar,挑战黑洞 )是DDoS攻击的一种常见类型,攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装。CC攻击是一种针对Http业务的攻击手段,该攻击模式不需要太大的攻击流量,它是对服务端业务 处理瓶颈的精确打击,攻击目标包括:大量数据运算、数据库访问、大内存文件等,攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。
- 最简单的理解:3000 台电脑同时访问你的网站,然后开 3 个浏览器,按住 F5 是一种什么样的体验,有点特点的,死循环请求搜索接口,批量访问大文件等等!
- 比如这个 URL 就是蘑菇的搜索接口,我测试的时候还没有做频率限制,和分页限制,100并发压测直接就凉了,吓得陌溪连夜加上了 频率限制 和 后端分页 的限制。
- 蘑菇搜索接口:https://192.168.192.168/mogu-web/search/sqlSearchBlog?currentPage=1&pageSize=100&keywords=1
- 特征,被攻击服务器,一瞬间会带宽飙升,随后 CPU,内存,IO,随着飙升!
- 特点,就是攻击方式简单,隐藏性高,并且量大!
- 缺点,需要持续压制直至攻击服务器宕机,如果在中途停止了压测,一般情况下服务器很快就能恢复,或者宕机服务自动重启,恢复业务正常运行!
第二种UPD攻击
- UDP 攻击,又称 UDP 洪水攻击或 UDP 淹没攻击(英文:UDP Flood Attack)是导致基于主机的服务拒绝攻击的一种。UDP 是一种无连接的协议,而且它不需要用任何程序建立连接来传输数据。当攻击者随机地向受害系统的端口发送 UDP 数据包的时候,就可能发生了 UDP 淹没攻击。
- 特征,因为UDP协议是不需要建立连接的,所以UPD攻击可以在非常短的时间内,发送大量的数据,动辄几百G,这个时候服务器一般会进入黑洞状态,也就是IP隔离,根据不同厂商,隔离时间不等,腾讯云是两个小时可以自助解封,其他小型厂商动辄24小时。
- 特点,就是攻击方式简单,量非常大!
- 第三种 TCP SYN洪泛攻击
- SYN洪泛攻击的基础是依靠TCP建立连接时三次握手的设计。第三个数据包验证连接发起人在第一次请求中使用的源IP地址上具有接受数据包的能力,即其返回是可达的。这玩意最早在 1996 年就在 Phrack 中出现过,他还分为 直接攻击,分布式攻击,欺骗式攻击,到现在为止也没有特别好的防护策略!
- 原理,TCP 只有经过三次握手才能连接,而 SYN 泛洪攻击就是针对 TCP 握手过程进行,攻击者发送大量的 SYN 包给服务器(第一次握手成功),服务器回应(SYN ACK)包(第二次握手成功),但是攻击者不回应 ACK 包(第三次握手不进行),导致服务器存在大量的半开连接,这些半连接可以耗尽服务器资源,使被攻击服务器无法再响应正常 TCP 连接,从而达到攻击的目的!
- 特点,就是攻击方式!繁多,防护比较复杂,虽然可以基于 SYN cookie 和降低 SYN timeout,来做防护但是随着攻击防的数量增多和攻击方式增多,这种防护会逐渐降低,只能能相对缓解!
- 缺点,没有特别的缺点,相对对攻击者技术较高!
- 其他网络攻击
- 以上只是常见的还有非常多,比如基于 TCP 的,TCP-lLEGIT、TCP-MIX、TCP-ACK、TCP-REFLECT,基于 UDP 放大的 NTP、WSD、SSDP、ARD,基于其他协议的 DNS 、WSS 等等,各有各的特点!
常见的网络攻击防护
网络攻击防护,在这里先说明一下,除了CC,其他以UDP,TCP,等等协议做为攻击方式的,软件层面,拦截意义不大尤其是UDP,软件层面也是经过了网卡的,网卡也是接收了的,只是没有处理,这个时候关不关端口有区别吗,有区别的,区别大吗,不是很大,以下面例子为例!
一大帮乞丐(大量UDP) 来找王总门前要饭 不请自来(无连接)堵在大佬门口,大佬出不去,乞丐的进不来,这个时候开不开门有区别吗(开不开端口有区别吗)这个时候物业来赶人了,但是大佬还是出不来(运营商黑洞),等都赶走了,王总和物业去谈,物业给了两种方案,一种以后没有门卡都不让进(运营商上层路由屏蔽),第二种,花钱请一大帮子人专门为你这一户甄别(高防清洗),老王最终选择了搬家(换服务器,关站了)从此高枕无忧!
下面是关于一些简单 CC攻击 防护测试,专业的还是要找商业防火墙防护!
我准备了两台测试机器,两台机器硬件配置和系统配置一模一样,克隆出来的,两台机器配置均为
- CPU:2核心 E52696V2
- 内存:4G
- 带宽:进 100M,出 20M
- 系统盘:30G SSD
两台机器均部署了 Nginx 挂载了一个简易导航页面(纯 HTML 单页面)!
随意部署一个静态页
不同的是其中一台部署了开源 Scout 攻击检测工具,其中一台单纯防火墙防护
Scout部署比较简单文档也有,需要注意是,它采用的是 iptables 防火墙,Centos7.X 及 Ubuntu 需要停止系统自身防火墙并安装这个!
GitHub地址:https://github.com/ywjt/Scout
- 机器一 23.224.85.208:无防护
- 机器二 23.224.85.249:Scout 防护
CC攻击 测试,我们先拿没有防护的机器:23.224.85.208,进行简易 CC 压测(最简单的模拟访问)
- 存活时间15秒,第一波攻击直接挂了,带宽直接占满,因为没有业务处理所以 CPU 和 IO 并无太大变化,但是带宽已经满了这个时候访问页面已经是无法访问了!
网站打不开了
下图,是本台服务器的一些资源状态,发现带宽基本上被打满了
服务器状态
同样的方式压测 23.224.85.249,然后开启 Scout 防护 看下
第一波攻击是没有太大问题,虽然连接数很高,但是 Scout 进行屏蔽后,带宽很快就降下来了!
服务器状态
但是,当我们继续加大连接数后,与第一台没有区别了!
资源被占满
来看看网络接收到的流量
流量到达峰值
在打开页面看看,已经提示响应时间过长了
另一台也不行了
这只是普通 CC 压测攻击,即便我们只采用本机防火墙,或者 nginx ngx_waf 扩展也是能达到一定效果的!
总结
经过反复测试 Scout 对于简单cc攻击和一些压测软件发出的压测及简单 TCP-syn,以及 UDP 攻击是有一定防护作用的,比没有强,但是这只是用的默认内置策略,有小伙伴有兴趣的话可以自定义策略试一下!
上面主要测试的是cc攻击,下面就来说一下其他攻击比较通用的防护建议
建议
说一下目前,我个人站点,对于CC、DDOS 采用的策略
- 套一个腾讯阿里的CDN(要配置一下策略-设置单IP QPS频率,防止循环攻击和流量突增,这个量根据个人网站设置!)
- 关闭不需要的端口,包括UCP,IMCP,其他80 443也只允许CDN ip回源,目的就一个,让外界看来这个源站IP是一台死机!
- 为了攻击者抓不到你的源站ip,邮件服务要代理ssl也请做一下防护,其他方面等等,这里目的就是不让别人从web端发现源站IP!
以上做完能,防住吗,可以!能完全防住吗,不能!还有一个概率扫段,例如 23.22.21.1-255 就打他,刚好你在这个段之中,中彩票了,整个段都了凉。
这种情况一般只出现在海外 CN2 线路上尤其是香港,原因就是海外监管没那么严格,CN2 带宽水管小!
其他通用建议
- 端口:WEB 系统端口对外开放,只应该开放 80 和 443,其他端口即便开放,也应该以授权 IP 的方式开放,蘑菇博客这种后端服务建议以 Nginx 代理的方式,对外只暴露 80 和 443 端口,不暴露后端端口,后端服务也只应该允许内网访问!
- 弱口令:市面上 80% 的肉鸡都是根据弱口令扫来的,防护住这个,不乱开端口,不下载第三方破解程序,你已经防护住了 90% 的入侵!
通用防护方式
- 采用商业防火墙
- 采用 CDN
- 采用高防服务器
- 把网站做成静态页面
所使用软件
压测软件
压测软件用了两种,这两种只能做简单压测,不能算攻击!
SuperBenchmarker:一个开源的测压工具,轻量级,易操作的命令行压力测试工具
hping3:hping 是面向命令行的用于生成和解析 TCP/IP 协议数据包汇编分析的开源工具。
防护软件
Scout 攻击检测工具:
https://github.com/ywjt/Scout
SYN cookies:参考(windows开启 SYN cookies,可以大大加强抵御 SYN 攻击几十倍的提升)
监控系统
wgcloud:极简&高效的主机监控系统
wgcloud:https://www.wgstart.com/
测试服务器赞助
最后,目前蘑菇所使用的测试服务器,均由老七云提供测试,也非常感谢红尘对蘑菇服务器的赞助支持
好了,本期关于蘑菇的被打挂的排查经历就到这里了
我是陌溪,我们下期再见~
博主就职于字节跳动商业化部门,一直维护校招笔记仓库 LearningNote「在Gitee上已有 5k star,地址 https://gitee.com/moxi159753/LearningNotes」,公众号上的文章也会在此同步更新,欢迎各位小伙伴一起交流学习
同时,想要丰富项目经验的小伙伴,可以参考我维护的开源微服务博客项目:蘑菇博客「 Gitee 官方推荐项目,博客类搜索排名第一,在 Gitee 已有 4.7K star,仓库地址:https://gitee.com/moxi159753/mogu_blog_v2 」。