巧妙实现无BA迁移至国内主机

作者 Known Rabbit 日期 2017-01-03
巧妙实现无BA迁移至国内主机

最近频繁被抱怨网站速度垃圾。国外速度这么爆炸我也很绝望嘛,宝宝辛辛苦苦改主题不也是为了提速嘛毕竟……不过治标不治本而已啦。这回下定决心准备迁移回我的破机器上,反正流量小,学生鸡扛着住,唯一的问题就是:没,有,备,案。

为啥要备案?

这个问题很严重的你们造不造!在国内的机器上,老大哥会着重检查80端口流过的内容,毕竟明文传输嘛,很容易发现你干了什么羞羞的事情,但开了https就不一样了,除非老大哥刨开电脑看你硬盘,否则是不好的东西是没法被动监控发现的!所以每个http访问都会被检查,其目的网址所属的域名(就是header中的Host头)是否已经备案。

没有备案的话,80端口无法使用,输网址时候不加https,都会被拦下显示未xx,而且防火墙也会+1s,很多服务的域名验证也要求http访问,全部gg,而且国内的所有需要绑定域名的加速服务收费的免费的全部无法使用。呐,搜索引擎也不会搭理你,因为你80端口一直 403 Forbidden 呀。

一直很感叹,阿里云所有的主机都会受到这样一个监控,那其实这个系统在这么高的并发下还能达到秒级识别(第一个请求几到十几秒后再访问就会变成403返回未备案网页),是相当不容易超级牛逼的!不过唉,技术嘛,技术无罪。

为啥不备案?

问:那老大哥让你备案,你不备不就违法了么。

答:应该是吧,,虽然用了我这种方法暂时没有老大哥追查,不过万一哪天PV太高触发警报了,我再备案也好。我最怕的就是,某些奇行种对我个人隐私的侵犯。毕竟,圈子太小,更何况做这行的我,也要有些基本的素养嘛。

其实就是强迫症加懒啦,哪儿来那么多借口。

原理

我们要实现http也能访问,不如换一个思路,让访问http自动跳转到https,毕竟时髦嘛。我首先想到的是301缓存,不过301缓存不是所有浏览器都支持的,而且非常不稳定,什么管家清理垃圾就给它清没了。于是只有HSTS一种途径啦。HSTS不仅强制浏览器在给定时间内使用安全连接,还强制浏览器验证SSL证书的有效性,顺便防了MITM,非常棒。

读者可能会问,那我直接找个国外主机跳转不就行了?我也想过,可http国外、https国内完全不可能啊,毕竟都解析到一个IP上,DNS是不知道你要连接的端口的。只能退而求其次,用一个国外主机(地址用于手打)专门用来301跳转到国内的另一个地址(用来复制粘贴的网址)上,而且头缀上https,HSTS一声明,妥了,以后都用SSL了。

步骤

开启 SSL+HSTS

nginx开启ssl的教程网上都有,记住 listen 443 后面一定要有 ssl;ssl on;这句可不加,这一点有的教程不太对。
至于开启 HSTS 标准一句话,插到 server block 里。 31536000 按秒计是一年。

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

设置DNS经过CF

经过CloudFlare的意思,不仅仅是使用它作为我们的DNS服务器,更要让CF做我们的反向代理。在 https://www.cloudflare.com/a/dns/your.domain 设置DNS记录的时候把那个小云朵点上就好啦。

cloudflare中开启301跳转

CF的跳转隐藏在 Page Rules 里面,可以直接指定,当url match http://*.your.domain/* 的时候, Always Use HTTPS ,就会帮你自动设置301跳转了,当然,这里的rules只对经过CF的主机生效。

手动注册letsencrypt免费SSL证书

这一步算是比较麻烦的了。 注册时候因为我们的运行鸡与注册鸡不再一个笼子里,所以要使用 certbot auth --manual 手动注册。输入域名后会弹出一串 challenge 让我们放在网站的指定目录下,这里就体现我们前两步的作用了。让http访问强制跳转到https,然后在设置好的nginx目录下面放好challenge,点下一步,就会在它提示的目录里生成公网可用的SSL证书。当然,以后每三个月都要麻烦一回。毕竟谁也不愿用垃圾 WoSign 嘛。

向 nginx 拷贝有效证书

用nginx的时候,记得要拷贝 key 和 fullchain.pem 而不是 cert.pem,到nginx目录下,替换第一步随便搞来的证书,reload一下就好啦。

切换DNS跳过CF

在刚才那个页面 https://www.cloudflare.com/a/dns/your.domain 相应记录里点掉刚才那朵橙色的小云。让箭头绕过云彩,然后等DNS缓存刷新就好啦。哦对了,不是什么本地缓存,而是要等全网刷新。测试后发现 CF 的 Automatic TTL 大概在300,换算过来五分钟左右,不过我还发现本地的傻逼DNS会把他改成900,就是15分钟……我就是不懂堂堂一台服务器怎么可以懒成这样……然后在这样的思绪里等了这十五分钟。绕过CF以后,可以自行设置一个短TTL,方便调试时候来回切换,记录更新的也会蛮快的呢。