博客遭受 DDoS 攻击

事情起始于两天前,监控工具提示我博客不能访问了。我一开始没有留意,因为有时候工具会出现一些网络抖动,过一段时间会自己恢复。然后今天早上收到朋友的邮件说博客挂了。半夜里爬起来看了一眼。

先是去看了主 HTTP 服务器(WordPress)和数据库,貌似都没有问题。然后又瞄了一眼缓存服务器,发现三台 Varnish 缓存服务器挂了两台,剩下的一台由于访问量过高响应非常慢。挂掉两台 Varnish 服务器原因暂时未知,因为最近一个月都没有动过服务器了。

三台缓存服务器都恢复之后,GCE 的负载均衡又重新开始工作了。监控显示流量峰值超过 25000 RPS (Request per second),稳定值约为 15000 RPS。

不是很理解为什么有人要拿我的博客练手,我最近也只写了一篇博客而已。如果你对我的博客有意见,可以私下联系,有事好商量。

博客满血复活

中断更新六个月之后,又可以继续写博客了。中断的原因基本上是因为手贱、懒,加上一些额外的状况。

分别说一下三个原因:

  1. 手贱:去年 8 月份的时候,把主机的系统升级到了 Linux 4.x(原先是 3.x)。升级完成之后发现 GCS Fuse 不能用了,导致所有图片加载不出来。
  2. 懒:由于当时工作比较忙,没什么时间研究 GCS Fuse 不能用的原因,就暂时先把图片做了本地备份,让 Apache 可以正常地输出图片。由于当时觉得 Google Cloud 的新功能 GCS Backend 快要发布了,可以跳过 GCS Fuse 直接上 GCS Backend,维护起来也轻松很多。于是打算等 GCS Backend 发布。
  3. 然后 GCS Backend 就跳票了……一直跳到现在终于可以用了。

做了一些调整之后,图片上传功能已经迁移完成。现在所有的图片都是从 Google Cloud 直接输出,不经过我自己的主机。攻击者们也可以不用想着通过下载图片来攻击我的博客系统了。

启用 CloudFlare 作为主 DNS 服务器

之前写过一系列文章介绍自己搭建 DNS 服务器的方法,我自己也这么用了一段时间。效果很好,DNS 解析一直都没出什么问题。但是这个自建的 DNS 服务器却成了最容易受攻击的一环。

博客的 HTTP 服务器躲在了 Google 的负载均衡服务后面,几乎不会被攻击。而 DNS 服务器却没有这一层保护。不知道为何,对于 53 端口的负载平均我一直都没有成功配置出来。于是就一直在使用裸机作为 DNS 服务器。所幸的是,一直以来也没有受到过攻击。

实际上我一直在等 Google 的 Cloud DNS 提供自定义域名的功能,但是这个新功能死活不开放给公众使用。我也没什么办法,纠结了一会之后,就转投 CloudFlare 了。

虽然 CloudFlare 是一个 CDN 提供商,但它也可以配置成只做 DNS 解析,而不用于 CDN 的方式。CloudFlare 提供的 DNS 服务器使用了 AnyCast 技术,看上去没有被墙,可以正常解析。并且它家也提供了 DNSSEC 机制,可以从一定程度上降低 DNS 劫持的风险。

从今天起新的 DNS 设置已完全生效,本博客可以全面抵挡任何类型的攻击。要练手的同学可以试一下。

站点启用 Certificate Transparency

之前一直都以为 Certificate Transparency 这个东东是给 EV 用的,没想到今天看了篇文章,说是个人站点也可以用。于是就去申请了一下。

先简单说说 SSL 证书的安全性。SSL 的机制是一个简单的信任链关系,浏览器并不能区分两个受信任的 CA 对同一域名签发的证书。比如本站的证书是由 DigiCert 签发的,如果另一个 CA 有意或无意也签发了一个对于 leonax.net 的证书,浏览器在访问网站的时候并不知道哪个证书是“真的”,哪个是“假的”。于是如果有两个网站,使用了不同 CA 签发的证书,且都说自己是 leonax.net,那么浏览器都会显示出“安全”的图标。现在 SSL 证书泛滥,部分 CA 为了降低证书申请的门槛,并没有做到严格的域名审核步骤,导致一些恶意分子有机可趁,伪造证书来骗取用户的信任。

简单来说 Certificate Transparency 是一个用于增强 SSL 证书安全性的东西,它可以确保 CA (Certification Authority) 不乱发证书。CT 的做法是通过一个第三方的验证机制,来判断证书的改动有没有出现异常。比如上述情况,会有两个 CA 同时向验证服务器提交信息,或是一个提交了,浏览器却收到了另一个的证书,这样便可以区分出“真假证书”了。

本站的证书是在 DigiCert 申请的。DigiCert 对 Certificate Transparency 的介绍可以看这里。实际上它废话了一堆,只是告诉你要去联系客服开启 CT 即可。于是我就去找了客服,十分钟搞定,当中还绕来绕去说了一些废话,可能是因为美国当地时间是夜里,客服不太清醒的缘故。不过事情也不复杂,很快客服就给我重新签发了证书。拿到新的证书之后,再上传到网站服务器即可。

开启了 CT 之后,在 Chrome 的网站信息中就可以看到类似上图的字样。说是网站已提供有效的 Certificate Transparency 数据。

博客 2015 年度访问数据统计

这大概是我第一次发布如此的统计,细心的读者大概可以发现本博客最早的文章发表于 2004 年,只是好多年来,访问量实在不值一提。直到去年,博客的访问量终于有实质的上升了。

2015 年全年博客的页面点击量(Pageview)为 2,217,504,比 2014 年上升了 42%。总访问人次为 804,116,比 2014 年上升 47%。也就是说,差不多平均一个人浏览 2、3 个页面就离开了。这符合博客的特性,毕竟我的博文都是全文输出,文章内容不分页,也没有其它骗点击的小把戏。大家看完一篇文章后,再回首页看看,然后就结束访问了。

看了坛子的文章,发现月光博客在 2015 年的文章访问量只有 75 万多一点。这么说来,我的博客还比月光博客热门那么一点。是不是该高兴一下下?

在 200 多万的页面访问中,有超过 80% 的用户来自中国(包括台湾和香港),剩下最多的是来自美国的访客(5%)。看来有能力出国的同学们,所阅读的技术文章都已转向了英文,我的博客自然对他们没什么吸引力了。

访客所使用的浏览器前三名分别 IE(52%)、Chrome(25%)、Safari(7%)。除了 Safari 比起 2014 来上升了 2% 之外,前两位的比例没有明显的变化,IE 依然是大众的主流浏览器。操作系统方面,Windows(76%)、Android(8.96%)和 iOS(8.75%)占据前三位,Mac OS X 只占了 3%,Windows Phone 更是只有可怜的 0.06%。在移动时代全面到来的时候,Windows 家族大势已去了。

博客的页面平均加载时间从 2014 年的 3.01 秒下降到了 1.90 秒,速度提升 37%。这和我在 2014 年底把博客迁移至 Google Cloud 密不可分。Google Cloud 的总体表现令人满意,希望在 2016 年全面使用 Google CDN 之后,页面的加载时间可以降到 1 秒以下。

新的一年,我会致力于改进用户体验,随着访客上网设备的改变,访客所浏览到的内容形式也在慢慢地变化。博客不能一直受限于文字模式,提供用户喜闻乐见的内容,才是博客存在的意义。

上线了三台 CDN 服务器

我对 KeyCDN 的服务感到非常失望,它家的缓存算法和缓存服务器速度都存在相当多的问题,导致本博客基本上每次访问都会回源,反而增加了加载时间。为了提高全球访客的浏览体验,本博客新增了三台 CDN 服务器,分别位于比利时、美国爱荷华州和中国台湾。

CDN 服务器会缓存所有的博客页面,直到页面有更新,比如新增博文或评论,才会刷新。这样做相当于做了全站静态化,并把静态页面事先加载到三个主要的大洲。世界各地的来访请求,会被 Google Cloud 的负载平衡引擎导向最近的静态页面,使得加载时间降到最低。距离 CDN 服务器较近的用户,可以获得小于 100ms 的页面下载时间。

目前由于价格的原因,图片资源依然放在 KeyCDN。Google Cloud 的 CDN 项目正在内测中,明年年初公测之后,如果价格合适,就会全部转向 Google Cloud。

有兴趣的同学们,欢迎测速 :)

CDN 似乎工作不正常

由于大家都懂的原因,这几天发生了不少事情,本站所使用的 CDN 也受到了一定程度的影响。这几天已有至少两位用户表示图片打不开或加载缓慢。

对于这种情况,暂时的解决方案是:

  1. 在你的浏览器中清空本站的 Cookie,这样可以触发 CDN 探测,如果 CDN 访问不了,则会切回源站;
  2. 升级你的浏览器至最新版本,如 Chrome 45、IE 11 / Edge、Firefox 40 等。

另外我还在考察国内的 CDN 服务,如果有合适的,过段时间会切换到国内 CDN。