一直没有时间写文章,以为一个月写一篇文章是很容易的事情,结果,这一次我拖了一个多月才写个文章出来。今天,网站遭遇到了pingback攻击了。

所谓的pingback,是wordpress博客程序下的一种引用声明,别人引用了你的博客文章,wordpress会给你发一个pingback回来,告诉你说XXX引用了你的链接。理想状态下,这样会可以增加互联网的文章关联度,利于搜索引擎也利于浏览者来查找分类相关的文章资讯的。

但是这个好的初衷在恶劣的互联网环境下变味了,有些别有用心的逗逼利用wordpress这个机制来发评论广告。在他们不断pingack的情况下,我的vps宕机了好几次。小小的vps着实承受不起这么频繁的pingback。当然,发现这是pingback攻击的时候,已是后话。

8月1号,一早起来,监控宝连续发了几个警告邮件。我打开电脑,发现网站已经打不开了,很慢很慢,(之前我的博客都是秒开的)。

首先是登录到VPS,然后执行top命令,看看到底是哪个进程吃光了所有的资源,结果发现是php消耗掉96%的CPU。

我担心VPS被黑了,然后到群里问了一下,在群友的指导下,我先查看了日志,nginx的日志目录是/var/log/nginx ,里面有个access.log的文件,下载下来本地,分析了一下,发现有几个IP不断的POST数据到xmlrpc.php这个文件里面:

xmlrpc.php这个文件估计是用于接收pingback的(之前看到过一篇文章)。好了,现在知道问题的根源不是VPS被黑了,而是被人不断POST,造成了资源紧张而已。解决方法有几个:

1.最简单的方法是直接把xmlrpc.php改为其他的名字。

2.可以把那个作恶的IP加入黑名单。拒绝他访问。

3.可以把作恶的useragent加入黑名单。拒绝他访问。

对于方法2,很有可能会失效,因为攻击者切换IP的话就会造成防御失败。所以,我们来把作恶的useragent加到黑名单里面去。

打开nginx的站点配置目录 /etc/nginx/conf.d ,编辑站点的文件,举例:


vi blog.yanwen.org.conf

把这段代码加到location的括号里面去:


if ($http_user_agent ~* "Mozilla/4.0\ \(compatible:\ MSIE\ 7\.0\;\ Windows\ NT\ 6\.0\)" ) {
return 403;
}

这段代码的意思就是屏蔽掉”Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)“这个useragent。空格、分号和括号之前要加上反斜杠,以便nginx识别。保存退出vi之后,执行


nginx -s reload

用CURL模拟这个useragent来访问一下博客,看看有什么情况?执行命令

 curl -I -A "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)" blog.yanwen.org 

嗯嗯,看样子已经403拒绝成功了,再top一下,发现cpu降下来了。

这次被D的事件到这里,基本得到解决了。看到v2ex的一位朋友的情况,的确比我要惨烈多了。唉。。。VPS备份很重要。

藏剑山庄原创文章,未经允许,禁止转载!

原文链接:http://blog.yanwen.org/archives/2141.html