流量

奇怪流量的终结

曾经有爆流量记这一篇博文提到之前租的空间被下 Win7 的请求爆流量, 在迁到自己的 VPS 后发现还是有对 Win7 的请求, 还附加了一个奇怪的隔一小会就发个 HEAD 请求, UA 中带 QQDownload 的奇怪来源 (BuyVM VPS 安装优化记)

作为日志洁癖者看着 nginx 的 access.log 里都是这种请求那自然是各种不爽, 之前一直怀疑 Win7 的请求来自旋风或迅雷, 但苦于木有证据, 这次特意又去查了下旋风和迅雷的离线服务器列表 (比如百度空间上用于 eMule 避免吸血的这篇: http://hi.baidu.com/asp502010/item/44ac169b289dd2d91a49df6d), 对比了下 IP 范围, 还是不在里面, 有点失望

不过这次有意外发现, 那就是 UA 里带 QQDownload 的那个, 虽然我知道这个 UA 串未必就是旋风发来的, 可能也只是老版本旋风 (这次 UA 是里版本号是 713, 我看了下最新的旋风应该是 783) 安装后改了系统的 UA 串, 但不管怎样总是有可以胡搅蛮缠的由头, 于是通过之前在旋风实习过的 momodi 联系上旋风的工程师, 直接吐槽

叶文/Snoopy阿排 15:43:29
hi, 非常抱歉冒昧打扰

我碰到的问题是这样的:
我自己有一个域名 yewen.us, 曾经指向我前公司内网里的一台机器, 提供前公司可激活的 windows 7 iso 文件下载, 可能被前同事用不同的下载工具 (如旋风, 迅雷等) 下载过, 并被计入链接库, 于是一直有外部请求来下这个文件
但是我一年多前就移除了这个文件, 对应的下载请求都返回 404, 但一直还在被抓 (后来没办法还改过 302, 416 等错误返回码, 都无效)

最近我仔细看了下我 nginx 的日志, 最近有大量带 QQDownload 标识的请求, 同时请求那个 win7 iso 的量也很大, 所以怀疑是不是 QQ 旋风没有正确处理错误返回码, 一直没把这个已失效的地址去除

之前写过一篇 blog 来分析: http://www.yewen.us/blog/2012/02/overflow/

从昨天晚上到今天上午的 nginx 日志分析:
$ grep “QQDownload” vyewenus.access.log | awk ‘{cnt[$1]++};END{for(ip in cnt){print ip, cnt[ip]}}’ | sort
101.226.68.137 196
140.207.54.139 195
183.195.232.138 196
$ grep “cn_windows_7_professional_x86_dvd_x15-65790” vyewenus.access.log | awk ‘{cnt[$1]++};END{for(ip in cnt){print ip, cnt[ip]}}’ | sort
122.141.67.50 329
123.185.52.73 54
14.114.226.18 150
14.114.226.194 14677
14.115.129.55 4040
180.117.68.185 361
59.33.63.137 1476

抽几条完整日志如下:
101.226.68.137 – – [21/Apr/2013:19:44:18 +0800] “HEAD / HTTP/1.1” 200 0 “-” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; QQDownload 713; .NET CLR 2.0.50727; InfoPath.2)”
14.115.129.55 – – [21/Apr/2013:19:44:18 +0800] “GET /ftp/Win7_rtm_with_loader/cn_windows_7_professional_x86_dvd_x15-65790.iso HTTP/1.1” 416 615 “http://yewen.us/” “Mozilla/4.0 (compatible; MSIE 9.0; Windows
NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)”
14.115.129.55 – – [21/Apr/2013:19:44:22 +0800] “GET /ftp/Win7_rtm_with_loader/cn_windows_7_professional_x86_dvd_x15-65790.iso HTTP/1.1” 416 615 “http://yewen.us/” “Mozilla/4.0 (compatible; MSIE 9.0; Windows
NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)”
14.115.129.55 – – [21/Apr/2013:19:44:25 +0800] “GET /ftp/Win7_rtm_with_loader/cn_windows_7_professional_x86_dvd_x15-65790.iso HTTP/1.1” 416 615 “http://yewen.us/” “Mozilla/4.0 (compatible; MSIE 9.0; Windows
NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)”
叶文/Snoopy阿排 15:44:00

请帮验证下那几个大量请求的 IP 地址是否是旋风离线服务器发起的

QQ旋风 15:44:19
你能否自己屏蔽了?

叶文/Snoopy阿排 15:46:01
我现在已经返回 416 错误码了, 流量也不是太大问题, 只是很奇怪为什么我都返回错误码一年多了还在被抓, 而且 IP 不一定固定 (我怀疑可能存在 “某下载工具的地址库存了这个链接, 用户可能会直接请求” 的情况)

后面的沟通基本就是礼节性的再提供点证据, 旋风的工程师没直说这几个请求是否是旋风自己的, 只说可能库里确实有脏数据, 给我看看, 至于老版本如果有缓存了这个信息, 那就没办法了. 隔天早上联系我说确实从库里找到这么一条记录, 已经删除, 让我再看看日志, 这次过去看了下, 果然对 win7 的所有请求都没了

这个事应该就算解决了, 之前虽然有怀疑但一直没去付诸行动, 果然有问题直接找到工程师才算比较快的解决方法, 像我这种 “刁民” 应该也会给他们带来计划外工作量, 不过确实是自家 bug 那也没什么好说的, 上次提到那个多说评论显示错误的问题, 最后也是找多说工程师直接解决. 旋风的哥们帮解决这个问题后还很好奇的问了句, 你还关注日志啊, er, 可以说这已经成职业病了么, 互相呵呵了下也就结了

过了两天发现那个奇怪的 UA 串发来的 HEAD 请求还有, 这次再问旋风那边他们就也不知道怎么回事了, 放 Google 搜了下找到 http://www.postsila.com/thread-193359-1-1.html 这么一篇, 跟我遇到一样的问题, 也不明所以, 不过还好这个请求来源比较固定, 从 access.log 里搜了下对应 IP 除了发 HEAD 请求没有任何正常用户行为, 那就开 iptables 屏蔽掉就行了

$ sudo /sbin/iptables -I INPUT -s 101.226.68.137 -j DROP

封了几天再看日志, 还在请求, 本来还想 ws 的通过 dnspod 能不能直接拒绝掉, 研究了下 dns 真干不了这事. 算了算了, 自己都屏蔽掉了那就这样吧, 看下日志还在涨

$ sudo /sbin/iptables -L -n -v --line-numbers
Chain INPUT (policy ACCEPT 529K packets, 835M bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     3311  199K DROP       all  --  *      *       183.195.232.138      0.0.0.0/0
2     3229  194K DROP       all  --  *      *       140.207.54.139       0.0.0.0/0
3     3304  198K DROP       all  --  *      *       101.226.68.137       0.0.0.0/0

除掉这俩后再看日志, 最大的来源就是 dnspod 的定时监控和各搜索引擎和 Feed 订阅器的抓站. 想了下小破站挂就挂, 没那么严苛的可用时间要求, 去 dnspod 把监控间隔调到最长, 搞定

最后, 看了下之前租的空间还有流量, 再打开日志, 发现都是来自 youdao 爬虫的数据, 话说我都换了域名 IP 指向一周了, 怎么你们还在抓以前 IP 啊, DNS 不更新么

爆流量记

缘起

过年回家那几天发现此博客垃圾评论暴涨, 从一周几条涨到一天一千多, 当时懒, 人肉删了就没管. 回北京后发现还是这样, 删是删不及了, 只能把 Akismet 打开, 拦的效果还不错, 再要求访客第一次发表评论的用户要过审核, 这下好了, 基本上能拦住, 偶尔一两条漏的人看一下也就砍掉.

这个空间买的就很便宜, 一个月 5G 流量对纯文本的 blog 来说完全够用. 在搞垃圾评论期间发现流量暴涨, 在一月还剩下没几天的时候收到邮件说流量达到 90%, 当时想了下估计是发垃圾评论的在抓站把流量搞的, 等我把垃圾评论处理了应该就没事, 看后台监控好像没怎么涨了就没继续关心. 第二天收到邮件说流量爆了, 而且登空间后台都登不上去. 没办法只能联系空间提供商 flyssh.net, 说我是被垃圾评论搞挂的, 让帮看看能不能处理, 那边很快回复说看我爆的还挺厉害, 但是因为我也是受害者, 免费给我加了 5G 流量, 但是垃圾评论这事他们搞不了, 祝我尽快搞定.

解决

我观察了下空间后台的流量监控, 发现不是实时更新, 而是一天一次. 另外由于服务器在美国, 上面的时区是 -5:00, 所以是每天下午一点结算, 我搞定了垃圾评论后每天流量还是非常夸张, 之前正常时一天不到 100M, 现在却一天 1.5G+. 想不清楚到底哪里有问题, 看了下后台有 Apache 的日志, 就抓下来分析了下, 这一看不要紧, 怎么 404 的次数这么多而且流量都这么大?

HTML 返回 次数 总字节 平均长度
200 4219 103,647,235.00 24,566.80
301 2597 1,750,723.00 674.13
500 4 13,882.00 3,470.50
302 62 49,992.00 806.32
403 4596 15,855,133.00 3,449.77
304 274 57,134.00 208.52
404 10555 1,488,782,649.00 141,050.00

从大到小挨个分析, 最大的是 404. 看错误绝大部分都是因为下 win7 未遂. 想起来 yewen.us 这个域名曾经在度娘内部提供过下载, 放的是度娘发的 X200/X201 可激活的 Win7 Pro, 估计有人用迅雷或旋风下载过, 结果被他们记住这个链接了. 但是我都返回 404 了居然还不停的请求, 真坑爹. 拦不了迅雷旋风就从自己这改变, 将那个 win7 的链接, 以及下载主入口都添加 301 跳转, 让去找正确的 ourfcr.info 下. 另一个 404 来源的大头是最近被搜索引擎抓站, 因为我没显式提供 robots.txt 也返回 404, 应对办法就是加了个空的 robots.txt 到根目录.

404 的另外一个问题是返回页怎么也都这么大? 本来应该跳转到 /404.shtml, 一个不到 1k 的文件, 实际却跳到了 /blog/404.php. 中间换过一次主题, 新主题的 404 页面包括了整个主题框架, 就因为这所以数据大? 在弄不明白为什么 404 不是跳到 /404.shtml 的情况下, 果断将 /blog/404.php 先改成了一个纯 html 的:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD><BODY>
<H1>404 Not Found</H1>
</BODY></HTML>

其次是 200 正常返回, 看了下 Agent, 不少还是垃圾评论发送者和搜索引擎的爬虫, 这没办法, 只能希望搜索引擎爬完后不再爬那些过期页面, 垃圾评论被 ban 掉后不再骚扰.

再一个大头 403, 看记录似乎是某些搜索引擎或垃圾评论发送者的爬虫逻辑写的有问题, 每访问我 blog 的一个页面都会再去访问一个受限的链接, 从而引起大量的 403 错误. 这个不知道怎么写 robots.txt, 就放那吧, 等他抓完了应该就好了.

上面的所有所有修改都完成后, 单天总流量下降到 77.0MB, 算下来是绝对不会超过每月 5000M 的限额了.

其他问题

搞定流量问题后, 还有剩下几个不紧急的问题:
1) 404 为啥是由 /blog/404.php 返回?
2) 开 Akismet 防垃圾评论是不是靠谱?
3) 垃圾评论和爆流量都是换主题后导致的, 中间有联系么?

对 404 那个检查实验了半天, 应该是在 WordPress 开启固定链接时, 在根目录的 .htaccess 里加的 rewrite 参数将不存在的访问默认的都导向 /blog/ 来处理, 所以空间后台的错误页面管理失效, 我那个改动是正确的, 丑点就丑点吧, 反正正常人类浏览遇到 404 点下后退好了, 发垃圾评论什么的我才不管呢.

Akismet 固然是有效的, 但是很多时候也担心是否有性能和流量的问题, 搜了下果然还有更 ws 的解决方案, 那就是中文验证. 之前发到我 blog 的垃圾评论都是英文的, 而考虑到我的 blog 应该不会有全文非中文的评论, 所以只要限制评论必须带中文就行了. 修改主题的 functions.php, 在最前面加上这么一段

function scp_comment_post( $incoming_comment ) {
    $pattern = '/[一-龥]/u';

    // 禁止全英文评论
    if(!preg_match($pattern, $incoming_comment['comment_content'])) {
        wp_die("You should type some Chinese word (like "你好") in your comment to pass the spam-check, thanks for your patience! 您的评论中必须包含汉字!");
    }
    return( $incoming_comment );
}
add_filter('preprocess_comment', 'scp_comment_post');

这下整个世界清静了, 连偶尔一两条 Akismet 放过去, 但因为访客第一次发言进入审核队列的垃圾评论都没有了. (上面那段代码很好理解, 就是把汉字在 utf-8 里的编码位置开头结尾过一遍, 看评论中是否有文字在其中, 不在就报错)

对于换主题导致的问题, 不知道垃圾评论是否有关系, 这个主题用的人挺多, 作者还有几个其他主题也在被很多人用, 应该不至于在主题中嵌代码通报垃圾评论发送者, 只能说是个巧合, 或者说垃圾评论发送者对这个主题有匹配模板, 能快速从搜索引擎那搜到且自动发垃圾评论. 爆流量则是有一定关系了, 一是主题允许换色, 导致多个 css 加载, 二是 404.php 等处理页面太大, 换色的问题想了下让大家忍受下我的审美观, 不准换就行了, 404 的问题前面解决过了.

附小广告
flyssh.net 提供的 ssh/vpn 都挺靠谱, 推荐下, 要折扣优惠码的可以私聊我. 他家虚拟主机如果最便宜那几档还有卖的话也非常划算, 可惜现在最便宜的也是 100RMB/年. 管理员都很 nice, 出问题时都很快很友好的帮助, 都是搞技术的, 沟通特别舒畅.