先说网站的状态,BT面板,NGINX+php,然后是用了cloudflare的才cnd.。表现症状,就是cpu满载,然后负载也是满的,就这下面两个图,然后访问很慢,还会出现404错误。
看到这个症状可不行啊,本屌像呵护孩子一样的站点一下子坏了可不行啊,马上找原因,要么是服务器被人黑了占用服务器资源干些挖矿的勾当,要么就是网站被攻击了,然后我就去把网站先关闭,cpu立刻使用率就下来了,毫无疑问问题就出在了网站层面,我再看看连接管理(这让我走了很大的弯路)。
因为我用了cloudflare的才cnd,所以跟你网站本身连接的是cloudflare的IP(之前我是不知道的),看到都是那几个IP在连接,而且一查还是美国的IP,错误的认为就是这几个IP的大量请求,我就去把这几个IP段给屏蔽掉,结果就是502错误。一开始我以为是CND那边需要缓存我的页面所以才会大量链接网站(这一错误的以为让我耽误很久,我想着缓存总是需要时间的,那会刚好是中午,就查了下美国的时间正好是半夜,想想也合理,人家半夜给你缓存呀)。后面等了很久,也没见好转,就感觉不对了。
认识到这一点后,我就去cloudflare的cdn去掉,DNS解析是要时间的不是,这里有浪费了很多时间,CND去掉了后,症状依然存在,可见这次的攻击是基于网址的而不是IP地址,再去查看链接管理,就是下图(这是正常后的截图,攻击的时候谁还有空截图),框框里会有大量的IP 进程在等待,造成网站崩溃。
把这些IP都查了下,大部分是国外的IP,现在攻击手段就明了了,用大量IP去请求网站内容,造成拥堵,正常访问发生错误。现在解决办法就是怎么把这些IP给屏蔽掉,开始笨到一个个去屏蔽,太多了,而且都不是一个IP段的,这样弄肯定会累死还解决不了。
后面一下既然大部分都是国外的,那就把国外的IP都屏蔽掉,然后网上找啊找方法,解决办法就是在服务器上的防火墙给国内IP加白名单,然后禁止所有80端口,后面也确实实现了,下图是实现后的防火墙状态。
到这里呢,我再看了下cup使用率,确实下降了很多,这一招确实很有效,CPU使用率下降到了30%,在我以为问题解决之后,我就去研究cloudflare,然后发现里面有个防火墙很容易就达到屏蔽或者放行某一国家的IP,设置好规则(这里也告诉大家少走点弯路)。
到这里我就想了,创建防火墙规则容易呀,但是要知道了解了攻击者的特征,才好添加规则不是,不然要么达不到效果要么造成误杀。那会我也是这么想的,那怎么才能知道攻击特征呢,答案就是日志,日志是这篇文的重点,就是因为没有看日志的习惯,可以这么说,上述的经历、解决办法都是弯路。
我查看到当天的访问日志后,不看不知道,一看就知道问题在哪,有大量的不同IP请求同一个页面,并且referer都是同一个值,关于这个网站,我也去看了是个游戏辅助的,想不通干嘛要攻击我,我网站又没用户数据,攻击了也导不了流,难道只是在我后台留下网址让我去看看,好吧这个目的你达到了,还有比较小的可能就是他也是受害者。
既然你有这种特征那就比较好办了,就又网上搜办法了,就是下面的代码了,
在nginx.conf的server配置项中加入
if ($http_referer ~* "www.xxx.com") {
return 403;
}
然后给加上了,服务器的cpu终于正常了,就像第一张图那样的,今天我再去看日志,发现还在攻击,不过现在都被403了。其实对于这次攻击,有上面一句话就够了,之前弄得防火墙都是不需要的,但是既然都设置了,本身网站也不需要国外的流量,就干脆留着了。
最后想说说的是,这次的攻击八成是某个攻击软件,设定特定攻击对象,然后改写referer,所以才会这么有特征,要是厉害点的估计就会变写参数,让防攻击工作更难。这次的经历让我白白浪费了一个周末,一是攻击者的可恶,二也是自己没有经验,走了好多弯路,浪费时间。也告诫大家出了问题一定要先看日志,看日志,看日志!