hynking

A student,developer,try to change the world by code.

hynking

攻击记录

昨天在施工blog的过程中发现blog变得很慢,打不开,重启了jekyll和nginx还是一样,配置是没错的啊,而且ping也没问题啊。然后去看了一下nginx后台的error.log,发现里面基本上都是”too much open files”,按理来说这个没人看的blog不会出现这种情况啊,更何况梯子也没出现过这种情况啊。然后把ulimit从1024调到2048,应该可以了吧,然而还是不行,还是很难刷出页面。越想越觉得奇怪,tail -f /var/log/nginx/access.log,发现正在有一大堆的ip在访问一个奇怪的url,是一个非法地址,我服务器上根本没有这东西,nginx访问的全是301,为什么不是404呢,大概是因为我用了80端口跳转https,然后返回301重定向https.这么大的访问量,加上都是同一个访问地址,有可能是ddos,又或者是一些奇怪的爬虫,但是爬虫也不应该会这么多吧,顺手查了几个ip都是来自中国的,还遍布全中国…这个blog我都没正式公开过地址呀,平时也没惹到谁,怎么就被攻击了呢,虽然blog里面有提供二维码,但也不至于吧…可能是被误伤的,躺着也中枪呀。

不管如何,想办法恢复blog的运作,一方面是加大Nginx的性能指标,另一方面是把这些非法请求给拒绝掉。先继续增大Nginx的ulimit,再看一下error.log已经很少再出现”too much open files”的警告了,然后再打开blog,尽管打开的速度比较缓慢但还是能连接上的,估计一开始就是过量的请求然后让nginx占用很多文件数量,达到了系统默认的文件数量,遇到正常请求不能再新增文件数量就不能继续处理了。然后是配置nginx.conf控制一下并发数

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; //触发条件,所有访问ip 限制每秒10个

不过效果不是很好,后台记录基本都是很多个ip单独发请求。然后又想用iptables把这些攻击过的ip全部加到黑名单,只要用脚本统计一下access.log里面符合特征的IP然后加到iptables就可以了。虽然也统计出ip,但是这些IP分布广泛,却很少出现同一个ip段的,要是我要屏蔽的话可能把大部分中国的IP给屏蔽掉,可是会看我blog的人IP基本都是来自国内啊,让看blog的人开代理看也不现实。这个不是我想要的效果,只好作罢。 大部分的请求都是攻击我的80端口,用netstat看有好几万的并发,可是成功转发443的很少。在被攻击的几个小时内,CPU和硬盘读写都有显著的升高,但流量消耗并不大。由于我技术不行不会防御反击,也不知道攻击者的意图,只能调高Nginx的性能来扛,还没用上cloudflare呢。反正这blog也不会有什么人去看的,就继续被D也没什么关系,干脆把80端口的请求全发403好了。 可是奇怪的是,不开代理我打不开我的blog了,而挂了其它国家的代理又能上去了,而ping也能ping得通。非常奇怪的现象,不知道是国内线路的问题,还是墙的问题,又或者是Nginx的问题。

到了快十二点的时候,又有一波IP给我发google_abuse的请求了,啊拜托我服务器没开反代,不处理google请求,还有google_abuse又是什么鬼嘛。算了不管了,一天下来我的access.log居然有2GB,正常情况一天也就几kb。

到了第二天起来的时候不开代理又能访问blog了,基本恢复正常。

虽然这次被攻击基本上手足无措,没做什么有效的措施进行防御,也没学到什么有效的防御手段,然后自己最多也就加大Nginx的性能,再加个Cloudflare.再看一下攻击的流量,也就几十MBps,跟那种大规模的DDOS没法比,只能吃一堑长一智吧。