本站已经全面部署IPv6

作为一个相当折腾的人,总要折腾出一些什么东西来才能够掩盖我战略上的懒惰。于是这就干脆把博客给IPv6化了,今后就算是纯IPv6网络的用户也能够访问我的博客了!

但是把博客全面部署IPv6的过程却充满了曲折。

腾讯云IPv6申请失败,转向阿里云

我的博客一开始是用Hexo生成,然后部署到腾讯云的服务器上的。然后腾讯云服务器的IPv6正在公测,于是我便以需要开发iOS应用的理由(其实我根本不会iOS应用的开发
)向腾讯云提交了公测申请,结果直接被驳回,原因是名额已满……名额已满你早说啊!

于是乎,我转向了另一家国内的大型云服务厂商——阿里云,还是我实习时的东家(说起来也是神奇,我在阿里云实习,结果平时玩云服务器都是用的腾讯云)。然后一看,阿里云的IPv6服务也在公测……抱着试试看的心态,我在阿里云进行了公测申请,结果过了几个小时,通过了!

通过了之后,就可以创建一台ECS(阿里云的云服务器),第一步基础配置按需求来,但是选择实例类型那里要注意“IPv6”的选项必须为“是”,而且目前只有北京、呼和浩特、杭州、上海、深圳、香港的地域才支持IPv6。下一步就是网络与安全组。

在网络与安全组里,如果要启用IPv6,必须自己创建一个专有网络和交换机。在第一个项网络那里,有个“前往控制台创建”的链接,点进去就会进入“专有网络控制台”。首先创建一个专有网络,别的看情况随便填,但是一定要在IPv6网段那里要选择“分配”。其余的网段啥的和这个交换机下可用的IP数目以及实际分配到的IP地址有关,不管它也行。

创建好专有网络和交换机后,刷新一下(不是页面,是选择专有网络和交换机的两个刷新按钮),选择刚刚创建好的专有网络和交换机。

在下面的IPv6一栏,点一下“分配IPv6地址”,会出现一些提示,总之勾选“免费分配IPv6地址”即可。

分配IPv6地址

为了方便调试,强烈建议勾选“分配公网IPv4地址”。

进入下一步,系统配置。把密钥对或者密钥啥的填好,点一下那个高级选项,有一项是实例自定义数据,这一部分不同的操作系统其操作不相同,因此建议直接点击这个链接去看具体操作。

写好脚本,或者说决定创建完ECS实例后再操作,就可以提交订单,然后给阿里云交笔钱,开通一台有着私网访问权限的IPv6地址的云服务器就是这么朴实无华且枯燥。

现在你可以用IPv4的公网IP或者阿里云的控制台登录到机器上,如果之前没有配置,就用上面的链接配置好,用ifconfig来查看IPv6地址,很好,ECS上的IPv6就不需要操心了!

在这个实例的配置信息处,有一个项叫IPv6地址,展示了绑定到该ECS实例的IPv6地址。但现在这个地址并不能公网访问,我们要点击这个地址,到IPv6网关那里去购买IPv6的公网带宽。在这里应该有一个IPv6网关了,只要单击右边的管理,就会转到另一个页面,左边可以选择IPv6公网带宽,之后会有一个IPv6地址列表,在最右边的操作一栏,有一个开通公网带宽,然后又是购买带宽(不得不吐槽一句,国内的带宽是真的贵),把钱献给阿里云,这个IPv6地址就可以被公网访问了!

不对,还有一件事!我们要配置这个ECS实例的安全组,让它能够放行IPv6在80端口和443端口的流量,不然IPv6来访问我们的网站请求就会被防火墙拦截掉。配置ECS实例的安全组规则,在入方向处,手动添加几条,授权策略“允许”,优先级随意,协议类型自定义TCP,目的选择80和443,源那里填入(注意是填入):::/0,以放开来自所有IPv6地址的连接(它默认的::/128不行!这样只有ECS本地才能访问),添加,完成。如果需要IPv6地址能ping通服务器,协议类型选择“全部ICMP(IPv6)”,源为::/0即可。

现在一切正常了,可以用纯IPv6网络访问位于这台ECS上的HTTP服务了。

但是,还有一件事!要用域名来访问网站才行啊!因此还需要在域名解析商那里加上专门解析到IPv6地址的AAAA记录。把记录类型选择为AAAA,把内容填上ECS绑定的那个IPv6地址,让它解析到我们的ECS实例!全部搞定!

现在可以测试一波了,如果你既有IPv4地址,又有IPv6地址,Windows系统下你可以将网卡属性里的“Internet 版本协议4(TCP/IPv4)”取消勾选,来看看纯IPv6网络是有多么的不便。(逃

腾讯云的CDN不支持IPv6,遂转向阿里云

准确说,腾讯云CDN的IPv6正在公测中……而阿里云CDN的IPv6已经可以一键开启!(可能是我申请公测通过了所以才能一键开启?)于是我把自己的CDN从腾讯云又迁移到了阿里云,顺便把存在对象存储上的一些数据也放到了阿里云上……于是事情就这么成了!腾讯云负责管IPv4,阿里云全权负责IPv6,鉴于有的IPv4不用白不用,便拿来在DNSPod(现在就是腾讯云DNS解析)里负载均衡了一下,之前的Jenkins脚本也改动了不少用来进行双机部署,我这么一个小破站居然用到了两个云服务商,简直就是暴殄天物。之后我会把整个站点,包括解析全部都放在阿里云上,腾讯云再见了,虽然你的免费CDN流量确实很香(

评论系统后台也不支持IPv6

我博客的评论系统Valine是依赖于LeanCloud的服务的,但是经过我的测试,LeanCloud的那个API域名avoscloud.com并不支持IPv6……这个没办法了,只好利用阿里云那台既有IPv4地址,又有IPv6地址的ECS实例用nginx做一个对avoscloud.com的反向代理了。

Nginx部分配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 443 ssl http2;

server_name www.example.com;

...

location /avos {
proxy_pass https://avoscloud.com/;
proxy_set_header Host avoscloud.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

总之,按照常见的Nginx反向代理的套路来,但是务必要注意proxy_pass https://avoscloud.com/proxy_set_header Host avoscloud.com这两条,前者用于将请求转发给avoscloud.com,后者用来欺骗LeanCloud,让它认为用户直接访问了avoscloud.com,而不是先访问我们的www.example.com/avos,然后被转发给它的。如果不这么做,LeanCloud将会提示未配置该域名的错误。

另外,记得设置一下Valine.js的serverURL,改成/avos,如果用的是类似于aaa.example.com的形式反代,就改成//aaa.example.com,这样Valine.js才会访问我们的服务器,让服务器接受来自IPv6地址的请求,通过nginx以IPv4地址访问avoscloud.com,然后把结果返回给原来的IPv6地址,而不是直接访问avoscloud.com然后吃闭门羹。

总结

整个把站点部署给IPv6的过程,其实无外乎就两个:把站点部署到有公网访问权限的IPv6地址的服务器上(国外的vultr就支持,而且不要阿里云这样弯弯绕),把服务迁移到有IPv6接入的服务。如果有的服务实在无法迁移,但我们只通过REST API的形式与其通信,那么就利用有IPv4和IPv6两个地址的服务器进行反向代理,记得设置Host欺骗原来的服务让它们认为是直接访问。

现在站点的IPv6体验应该很完美了,除了链接里的那些外链。许多链接只有用IPv4才能访问。当然,我可以用反向代理解决,但是这太消耗我的资源了……