为你的 网站/APP 做好 ipv6 Only 准备

前言

尽管在 2010 左右 IPV6 就开始刷存在感了,但是直到美帝把 IPV4 的资源都分配完了,IPV6 依旧没有获得很好的支持。

但是最近在开发者的圈子里,IPV6 开始怒刷存在感,因为苹果现在开始需要每一个 APP 都支持 IPV6-Only 环境下的使用。我觉得这是一件好事,如果不好好推动一把, IPV6 的体验始终不会跟上去。所以,如果苹果不推,那么迟早谷歌也会强推 IPV6。

就像谷歌

IPv6-Only

IPv6-Only 意味着网络下只能连接上 IPv6 地址,没有 IPV4 的存在,这也就意味着 DNS 缓存服务器也必须是 IPv6 地址,只能连接上支持 IPv6 的服务器。如果要解析一个域名,域名本身及其所属的根域名的 DNS 服务器也必须统统支持 IPv6。

  1. 域名所属的根域名的 DNS 服务器 支持 IPv6
  2. 域名使用的 DNS 解析和 DNS 服务器 支持 IPv6
  3. 服务器 支持 IPV6,并拥有 IPV6 ip 资源
  4. 服务器系统和 Web 软件 支持 IPV6

域名和 DNS 服务

顶级域名的 IPV6 支持报告 中,我们可以看到截止本文发布,仅 98.1% 的顶级域名都已经支持 IPV6 的解析了。像:com、net、biz、cloud、top 都是支持的。

然后是 DNS 服务器了,国外的例如 CloudFlare、NS1、Rage53、DNSimple、Rage4 等,国内的 DnsPod、百度云加速、sDNS 都已经支持了。 不过截止本文发布,阿里云 DNS、Cloudxns 还不支持 IPV6-Only。

DNS 解析 IPV6,对应的是 AAAA 记录。 IPV4 对应的是 A 记录。

服务器支持 IPV6

目前,国外的 DigitalOcean、Vultr、Linode 都是默认分配 IPV6 IP 的,很多一些 VPS 品牌甚至会赠送一个段的 IPV6 资源。而在国内目前看来,无论是 阿里云、青云、腾讯云 还是其他,都并没有很好的 IPV6 支持。

如果我们的网站或应用托管在阿里云或者其他云上,那么要让其支持 IPV6-Only,那么目前有两种可行的方案就是:

  1. 服务器在第三层(网络层)使用隧道传输来曲线支持 IPV6
  2. HTTP Proxy ,让支持 IPV6 的服务器做反向代理,将 AAAA 记录解析到代理服务器上
  3. 使用 CDN 缓存,像 CloudFlare 这样的 CDN 只要使用就可以支持 IPV6

不过,上述的三种,都有一定缺陷,其中第一种缺陷最少,几乎原生;而反代受限于反代服务器的延时,而且建设成本也挺高的;CDN 缓存么,像 Cloudflare 在国内速度并不理想

隧道传输支持 IPV6

这里介绍使用 Hurricane Electric Free IPv6 Tunnel Broker 来拓展服务器支持 IPV6.Tunnel Broker 相当于建立在网络层(第三层)上的代理,需要你的服务器的操作系统支持,而且服务器必须要有一个固定的 IPv4 地址。

一、注册,https://www.tunnelbroker.net/ 记得,别忘了验证邮箱 二、创建隧道,https://www.tunnelbroker.net/new_tunnel.php 三、IPv4 Endpoint (Your side): 输入服务器的 IP ; Available Tunnel Servers: 这里选择一个延时最低的地域。经过测试亚洲的 香港、新加坡、日本 国内访问还都挺糟糕的。 推荐 Fremont。 四、点击 Create Tunnel 就创建好了,

五、修改网络参数,使系统支持 IPV6。编辑 /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

修改为

net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

再运行 sysctl -p 的命令,启用IPv6

root@MF8.BIZ:~# sysctl -p
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

六、在 HE 哪里,点击 Example Configurations,然后选择自己的系统,这里以 Debian 8.5 为例。

修改 /etc/network/interfaces 文件,在下面加上,如图片中列出的代码

保存,然后重启系统。

七、确认开启。

执行 ifup he-ipv6 确认 IPv6 已启用。

root@MF8.BIZ:~# ifup he-ipv6
ifup: interface he-ipv6 already configured

ifup: interface he-ipv6 already configured

八、DNS 添加 AAAA 记录到分配的 IP 上。

Web 服务器软件确认开启

并不是服务器开启 IPV6,就一切 OK 了。在 Apache 、Nginx 这样的 WEb 服务器软件上依旧要进行相关设置。

Nginx

server {
  listen 80; // 监听 IPv4 的 80 端口
  listen [::]:80; // 监听 IPv6 的 80 端口
}

server {
  listen 443 ssl http2; // 监听 IPv4 的 443 端口
  listen [::]:443 ssl http2; // 监听 IPv6 的 443 端口
}

Apache HTTPD

Listen 服务器 IPV4 IP:8080
Listen [分配的 IPV6 IP]:8080

都别忘记重启!

检测

dig

支持 dig 的系统,可以使用 dig aaaa 来检测域名是否正确解析 IPV6

WWW.MF8.BIZ'S-NOTEBOOK:~ MF8$ dig mirrors6.tuna.tsinghua.edu.cn aaaa

; <<>> DiG 9.8.3-P1 <<>> mirrors6.tuna.tsinghua.edu.cn aaaa

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64171

;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:

;mirrors6.tuna.tsinghua.edu.cn. IN AAAA

;; ANSWER SECTION:

mirrors6.tuna.tsinghua.edu.cn. 300 IN CNAME mirrors6.a.s.tuna.tsinghua.edu.cn.

mirrors6.a.s.tuna.tsinghua.edu.cn. 300 IN AAAA 2402:f000:1:416:166:111:206:63

;; Query time: 623 msec

;; SERVER: 223.6.6.6#53(223.6.6.6)

;; WHEN: Tue Sep  6 11:55:31 2016

;; MSG SIZE  rcvd: 102

IPV6 test

http://ipv6-test.com/validate.php 可以很方便详细的检测 IPV6 的支持情况。

7 条评论

发表评论