0x00 前言
目前 IPv6 用得挺广了吧,很多应用都支持 IPv6 了,三大运营商基本都支持了,联通的流量自带 IPv6,而且开热点的话还支持下发给其他设备。
不过其实很多服务器都没上 IPv6,比如阿里云的 ECS 一般公网只有 IPv4 地址(想拥有一个 IPv6 地址还得再花钱)。
于是最近就折腾了一下,利用 Hurricane Electric 提供的免费 IPv6 Tunnel Broker,让阿里云的 ECS 拥有了 IPv6 地址(非原生),理论上大部分服务器都适用的。
这里用到的是 IPv6 Tunnel,基于 protocol-41 (6in4),其实是把 IPv6 包通过 IPv4 包来传输,相当于建立在网络层上的代理,需要你的服务器的操作系统支持,而且要有一个相对固定的公网 IPv4 地址。
When using 6to4, you do not transmit IPv6 packets. Instead, special IPv4 packets are wrapped around IPv6 payloads. These packets have IPv4 protocol 41, as defined by RFC 2473.
当然,性能的话肯定比不上原生的 IPv6 了,不过自己玩玩还好,问题不大吧。
0x01 申请 IPv6 Tunnel Broker
前往 https://tunnelbroker.net,注册一个你自己的账号。
登录之后,点击左侧的 Create Regular Tunnel。
一个账号最多可以创建5条tunnel。
IPv4 Endpoint 里填服务器的公网地址,输入后会自动检查是否支持。
You are viewing from 显示的是你访问网站的公网 IPv4 地址,如果是在服务器上访问的话 Endpoint 就是这个了。
注意:服务器要允许来自 HE 的 ICMP 请求,也就是说不能禁止来自 HE 的 ping。
(这里借一张网上的图,比如下面这样的↓
Available Tunnel Servers 里选择离你服务器较近的,可以在服务器上ping试一试。
现在显示 Los Angeles, CA, US Not Available (Full)
,洛杉矶的都满了233.
Asia 有 HK、SG、JP 这三个节点,不过据网上说貌似速度也不怎么样了,具体自己看看吧。
选择好之后就点击创建隧道就申请好了。
这里的 Client IPv4 Address 是你之前填的地址,点击可以进行修改,
Client IPv6 Address 就是你服务器的公网IPv6地址了,如果需要DNS解析的话就给这个地址加个 AAAA 解析就行(注意不需要加上/64
)。
这里的 Routed IPv6 Prefixes 是该隧道可用于分配的 IPv6 地址段,可为内网机器都分配上唯一的 IPv6 地址。
可见分配的是 /64
,即 IPv6 地址的前缀长度为64位。后(128-64=)64位为网络接口ID(可理解为设备在网络上的唯一ID),因此你有2^64(1844亿亿)个可用的IP地址了。😉
当然你还可以申请一个/48
前缀的路由,这样可用的地址更多了。(2^80个)
0x02 阿里云 ECS 开启 IPv6
阿里云的硬盘镜像默认是把 IPv6 给关掉的,这里就手动打开好了。
vim /etc/sysctl.conf
在文件末尾的位置把ipv6设置中的1改成0,变成类似如下的亚子。
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.eth0.disable_ipv6 = 0
而后重新载入配置。
sysctl -p
然后使用ifconfig
看一看,就会发现支持 IPv6 了。
比如下面这个,有了inet6
这一项。
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.xxx.xxx.xxx netmask 255.255.240.0 broadcast 172.xxx.xxx.xxx
inet6 fe80::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether 00:16:xx:xx:xx:xx txqueuelen 1000 (以太网)
RX packets 1688753 bytes 328028654 (328.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1837158 bytes 637871915 (637.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
0x03 给 ECS 配置 IPv6 隧道
在Example Configuration 里有很多示例。
比如Ubuntu的。
vim /etc/network/interfaces
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
address 2001:470:xxxx:xxxx::2
netmask 64
endpoint 216.218.xxx.xxx
local 172.16.xxx.xxx
ttl 255
gateway 2001:470:xxxx:xxxx::1
将上面的配置粘贴到文件的最后。
注意一下,内网环境要用内网的IP!他这里也写清楚了的。
NOTE: When behind a firewall appliance that passes protocol 41, use the IPv4 address you get from your appliance’s DHCP service instead of the IPv4 endpoint you provided to our broker.
注意: 阿里云的 ECS 要将local中的IP修改为内网的IP,即私网IP地址,例如172.16.xxx.xxx
,而不是公网IP!!!
不清楚的话还可以参考Ubuntu的Wiki,戳这里。
而后让IPv6生效。
ifup he-ipv6
再看一下 ifconfig
,这时应该有一个 he-ipv6
的了!类似这样的。
he-ipv6: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1480
inet6 2001:470:xxxx:xxxx::2 prefixlen 64 scopeid 0x0<global>
inet6 fe80::xxxx:xxxx prefixlen 64 scopeid 0x20<link>
sit txqueuelen 1000 (IPv6-in-IPv4)
RX packets 11605 bytes 3127821 (3.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13811 bytes 2403522 (2.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
P.S.:
如果想让隧道失效(没有删除的话重启后还是会自动启用):
ifdown he-ipv6
如果想删除隧道:
ip tunnel del he-ipv6
如果已经生效了会提示:ifup: interface he-ipv6 already configured
。
如果设置出错了,或者想修改配置,需要先删除隧道,再重新生效就好。
现在就来测试一下吧!
root@miaoTony:~# ping6 -c 5 ipv6.google.com
PING ipv6.google.com(tsa03s02-in-x0e.1e100.net (2404:6800:4008:803::200e)) 56 data bytes
64 bytes from tsa03s02-in-x0e.1e100.net (2404:6800:4008:803::200e): icmp_seq=1 ttl=53 time=393 ms
64 bytes from tsa03s02-in-x0e.1e100.net (2404:6800:4008:803::200e): icmp_seq=2 ttl=53 time=390 ms
64 bytes from tsa03s02-in-x0e.1e100.net (2404:6800:4008:803::200e): icmp_seq=3 ttl=53 time=390 ms
64 bytes from tsa03s02-in-x0e.1e100.net (2404:6800:4008:803::200e): icmp_seq=4 ttl=53 time=393 ms
64 bytes from tsa03s02-in-x0e.1e100.net (2404:6800:4008:803::200e): icmp_seq=5 ttl=53 time=388 ms
--- ipv6.google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 388.107/391.132/393.213/1.914 ms
当然也可以 ping6 ipv6.baidu.com
。
如果不成功可以重启系统试试。
当然,你也可以尝试在命令行中进行配置(略)。
Windows 10 下的配置,在 cmd 中执行下面的命令。
netsh interface teredo set state disabled
netsh interface ipv6 add v6v4tunnel interface=IP6Tunnel localaddress=172.16.xxx.xxx remoteaddress=216.218.xxx.xxx
netsh interface ipv6 add address interface=IP6Tunnel address=2001:470:xx:xxxx::2
netsh interface ipv6 add route prefix=::/0 interface=IP6Tunnel nexthop=2001:470:xx:xxxx::1
注意修改对应的IP地址。
0x04 一些问题的解决
按照上面一番配置好之后,有可能还是访问不了 IPv6 的网站。
有可能需要如下处理吧。(谁知道会这么麻烦呢
要是没事了就直接往下看了。
- 需要放行服务器的41端口。毕竟流量是通过IPv4传输的啦。
例如:
ufw allow 41
或者
iptables -t filter -I INPUT -p 41 -j ACCEPT
iptables -t filter -I OUTPUT -p 41 -j ACCEPT
同时要记得在(阿里云的)安全组里放行。
- 配置好 IPv6 的 DNS
vim /etc/resolv.conf
在最后添加谷歌的DNS服务器
nameserver 2001:4860:4860::8888
nameserver 2001:4860:4860::8844
或者国内的公共DNS:240c::6666
或 240c::6644
- 添加路由
route -A inet6 add ::/0 dev he-ipv6
再 ping 一下应该可以了吧(
不行再重启试试(重启解决绝大部分问题呢
0x05 Nginx 支持 IPv6 访问
修改配置文件,监听 IPv6 端口。
server {
listen 80;
listen [::]:80; // 监听 IPv6 的 80 端口
# ...
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2; // 监听 IPv6 的 443 端口
# ...
}
然而,发现一个情况,只有当服务器访问IPv6的网站的时候,或者说有 IPv6 流量的时候,外网才能通过这个公网的IPv6地址访问到服务器emmm。(懵
于是加一个 cron 计划,定时ping一下好了。
crontab -e
添加一个计划。
*/1 * * * * ping6 -c 1 he.net
重启 cron 使其生效。
systemctl restart cron
每分钟执行一次 ping 操作,这样访问就没问题了。
(不过想不大明白为啥这个通道会自动断开。有人说与 ip6tables 有关,不大清楚。。 emmm
0x06 配置 DNS
配置一条AAAA记录指向公网的 IPv6 地址即可。可以试试开启CDN。
而后就可以通过域名访问网站了。
不过没有 CDN 的话只能通过 IPv6 进行访问。
0x07 检查网站是否支持 IPv6
利用 http://ipv6-test.com/validate.php
0x08 自动更新 Endpoint IP
前面说只要公网的IPv4地址相对固定就好了,这里就这个意思啦。
HE 还支持为动态 IPv4 地址建立 IPv6 通道,这里要用到他提供的API了。
We’ve added support for Dyn-compliant endpoint updates so that equipment talking this spec can very easily update your tunnel endpoint.
Update URL: https://ipv4.tunnelbroker.net/nic/update (ipv4 is important here, don’t remove it)
Username: Your Tunnelbroker.net username
Password: Tunnel specific authentication key (under Advanced on the tunnel information page) if one is set, otherwise your Tunnelbroker.net password.
Hostname:
- Numeric tunnel ID
- Numeric tunnel ID in “tunnel#.tunnelbroker.net” (This host does not actually exist)
- Tunnel reverse host, aka “user-#.tunnel.tserv#.loc#.ipv6.he.net”
或者也可以访问更新的URL。
就可以在服务器上写个脚本检查公网地址有没有更新就好了。
自动更新IPv4地址:
To auto-detect your IPv4 address:
https://<USERNAME>:<PASSWORD>@ipv4.tunnelbroker.net/nic/update?hostname=<TUNNEL_ID>
https://ipv4.tunnelbroker.net/nic/update?username=<USERNAME>&password=<PASSWORD>&hostname=<TUNNEL_ID>
手动指定更新的IPv4地址:
To manually specific your IPv4 address:
https://<USERNAME>:<PASSWORD>@ipv4.tunnelbroker.net/nic/update?hostname=<TUNNEL_ID>&myip=<IP ADDRESS>
https://ipv4.tunnelbroker.net/nic/update?username=<USERNAME>&password=<PASSWORD>&hostname=<TUNNEL_ID>&myip=<IP ADDRESS>
当然不想看的话就看完整版:
**TL;DR:**(Too long; Don't read
/ Too long; Didn't read
)
http[s]://[TB_USER:TB_PASS@]tunnelbroker.net/nic/update?[username=TB_USER&password=TB_PASS&]hostname=<TUNNEL_ID|tunnelTUNNEL_ID.tunnelbroker.net|TB_USER-TUNNEL_LABEL.tserv#.LOC#.ipv6.he.net>[&myip=IPV4]
后面可以试一试这个功能 hhhh
当然了,HE还自带了 DNS 解析,可以尝试一下呢。
下面还有一些关于 IPv6 的拓展的链接。
好了就这样吧。
(溜了溜了
Reference & Extensive Reading
He.net DNS域名解析申请使用-免费DDNS、IPv6 地址和Slave DNS
阿里云centos6.8开启ipv6通过appstore审核的方法
Dyn-compliant Endpoint Updates
etc.