利用TunnelBroker给阿里云ECS配置公网IPv6


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。

(这里借一张网上的图,比如下面这样的↓

icmp_block

Available Tunnel Servers 里选择离你服务器较近的,可以在服务器上ping试一试。

现在显示 Los Angeles, CA, US Not Available (Full),洛杉矶的都满了233.

Asia 有 HK、SG、JP 这三个节点,不过据网上说貌似速度也不怎么样了,具体自己看看吧。

选择好之后就点击创建隧道就申请好了。

tunnel_details

这里的 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的。

interface_configuration

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

如果不成功可以重启系统试试。


当然,你也可以尝试在命令行中进行配置(略)。

interface_configuration2

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::6666240c::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

ipv6test


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

记一次给线上服务器添加IPv6支持的步骤

He.net DNS域名解析申请使用-免费DDNS、IPv6 地址和Slave DNS

申请 HE.NET IPv6 隧道以使主机支持 IPv6

Servarica IPv6 Only VPS折腾体验

如何给阿里云ecs开启ipv6访问

阿里云centos6.8开启ipv6通过appstore审核的方法

阿里云服务器以及CDN支持IPV6的方法

Dyn-compliant Endpoint Updates

etc.


文章作者: MiaoTony
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 MiaoTony !
评论
 上一篇
CTF | JetBrains Quest 1&2 WriteUp/攻略 CTF | JetBrains Quest 1&2 WriteUp/攻略
体验了一下JetBrainsQuest1&2,白嫖了3+3个月的JB家全产品授权,这里记录一下通关过程,也算是攻略/WriteUp吧。
2020-03-12
下一篇 
光猫折腾记 | 获取超级管理员密码&开启telnet&IPv6&桥接宽带 光猫折腾记 | 获取超级管理员密码&开启telnet&IPv6&桥接宽带
最近折腾了一下家里的光猫,获取了超级管理员密码,开启了Telnet管理,启用IPv6,并尝试了宽带桥接的改造等等。
2020-02-27
  目录