Contents
  1. 1. 隧道申请
  2. 2. VPS配置
    1. 2.1. tb_userspace
    2. 2.2. 确认完成
  3. 3. 可以用它来干嘛

一般的VPS只有一个IPv4地址,如果想要拥有IPv6地址,必须使用隧道,隧道是一种overlap技术,即将IPv6的包用IPv4进行再次封装,在两个v4网络的端点间传输,在其它使用网络服务的进程看来与真实的IPv6没有任何区别。

此教程也不限于在VPS上使用,在其它Linux和Mac OS主机上也是可用的,但前提是电脑有公网IPv4地址,MAC OS可能细节稍有不同。

为什么要为VPS创建v6隧道,场景有二:1)利用IPv6从绕过校园网计费网关连接到VPS,进而接入世界;2)IPv4用户也能享用IPv6的PT资源。

先来看建立v6隧道之前的VPS网络情况,顺带一提我给VPS装的CentOS6系统:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:27661 errors:0 dropped:0 overruns:0 frame:0
TX packets:27661 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:81575090 (77.7 MiB) TX bytes:81575090 (77.7 MiB)
venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:127.0.0.1 P-t-P:127.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:156925340 errors:0 dropped:0 overruns:0 frame:0
TX packets:298546103 errors:0 dropped:11986 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:157483015316 (146.6 GiB) TX bytes:164615931237 (153.3 GiB)
venet0:0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:104.194.xx.xx P-t-P:104.194.xx.xx Bcast:104.194.xx.xx Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1

隧道申请

首先你要有一个隧道服务的提供商,推荐tunnelbroker.net,本人长期使用,比较稳定。
注册完成以后,点击Create Regular Tunnel,在IPv4 Endpoint (Your side)填入你的VPS的IPv4地址,在列表中选择一个离你的VPS最近的Server创建隧道,尽量使延迟最小。

我的VPS在LA机房,自然选择LA站点来创建。

填完以上两项就可以点击create tunnel了,创建完成以后,main page会显示你刚创建的隧道,点击进入详情,主要留意以下信息,server端v4地址和client的v6地址一会将用到。

1
2
3
4
5
IPv6 Tunnel Endpoints
Server IPv4 Address:66.220.18.xx
Server IPv6 Address:2001:470:x:xxx::1/64
Client IPv4 Address:104.194.xx.xx
Client IPv6 Address:2001:470:x:xx::2/64

至此隧道申请完成,亦即Server端已经配置好,现在要到Client端(VPS)作相应配置。

在此之前,看一下隧道Server端到VPS的延迟吧,如果太大,可以考虑换一个Server哦。
在VPS上ping server的v4地址:

1
2
[root@localhost ~]# ping 66.220.18.xx
64 bytes from 66.220.18.xx: icmp_seq=1 ttl=59 time=0.581 ms

不到1ms,说明Server选择没问题。

VPS配置

如果是的云主机是VM,那么十分简单,tunnelbroker提供相应的脚本,粘贴执行即可。
tunnel details页点击example configuration,Linux可以选择linux-route2,会显示类似以下代码:

1
2
3
4
5
6
modprobe ipv6
ip tunnel add he-ipv6 mode sit remote 66.220.18.42 local 104.194.xx.xx ttl 255
ip link set he-ipv6 up
ip addr add 2001:470:x:xxx::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6
ip -f inet6 addr

将其复制到VM的terminal执行即可。

VPS不同于VM的是它共享宿主机内核,也就是你无权限执行内核模块加载modprobe ipv6这样的操作,还好我们可以用户态的程序来代替。

tb_userspace

tb_userspace就是这样的一个工具,非常小巧,只有不到7kB,而且自2010年就停止更新了,看来作者也认为没有修改的必要了。连续运行两月的实际情况来看,它确实运行完美!

下载地址:https://code.google.com/p/tb-tun/

如果打不开这个地址,自行搜索替代下载资源吧。

下载之后解压可以得到源文件和可执行文件,不用自己build了,如果有兴趣可以查看源码,相信对学习Linux网络协议栈函数调用是很有帮助的:

1
2
-rwxr-xr-x 1 root root 9.6K 4月 9 03:37 tb_userspace
-rwxr-xr-x 1 root 513 7.8K 6月 19 2010 tb_userspace.c

好的,以下就是你要在VPS运行的命令,与之前给的差不多,只是将ip tunnel替换成了tb_userspace:

1
2
3
4
5
setsid /root/tb_userspace tb 64.62.xx.xx 104.194.xx.xx sit > /dev/null 2>&1 &
ifconfig tb up
ifconfig tb inet6 add 2001:470:x:xxx::2/64
ifconfig tb mtu 1480
route -A inet6 add ::/0 dev tb

确认完成

好的,至此VPS应该已经具有IPv6的地址了,运行ifconfig,较之前多出了一个网络接口:

1
2
3
4
5
6
7
tb Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet6 addr: 2001:470:x:xxx::2/64 Scope:Global
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

测试可用性,从VPS用ipv6 ping google:

1
2
3
4
5
[root@localhost ~]# ping6 google.com
PING google.com(lax02s22-in-x0e.1e100.net) 56 data bytes
64 bytes from lax02s22-in-x0e.1e100.net: icmp_seq=1 ttl=58 time=0.987 ms
64 bytes from lax02s22-in-x0e.1e100.net: icmp_seq=2 ttl=58 time=1.64 ms
64 bytes from lax02s22-in-x0e.1e100.net: icmp_seq=3 ttl=58 time=1.68 ms

好的,真快不是吗:P

如果本地机器具有ipv6地址,可以测一下到本地的连通性。

从本地用IPv6 Ping VPS:

1
2
3
4
chen@vaio:~$ ping6 2001:470:x:xxx::2
PING 2001:470:x:xxx::2(2001:470:x:xxx::2) 56 data bytes
64 bytes from 2001:470:x:xxx::2: icmp_seq=1 ttl=49 time=147 ms
64 bytes from 2001:470:x:xxx::2: icmp_seq=2 ttl=49 time=147 ms

147ms还是可以接受的了,但是毕竟在太平洋对面呢:P

可以用它来干嘛

好的,自此VPS就已经接入v6世界了,下一步做什么呢,当然是在IPv6上搭shadowsocks和openVPN了。shdowsocks非常易用,它是Python的;openVPN由于使用了非对称加密,生成密钥之类比较麻烦一点,不过如果你理解公钥,私钥和证书的原理,操作起来也不会太糊涂哦。

与使用IPv4的ss和vpn不同之处在于,server clinet都要使用ipv6地址,为了方便,可以将VPS的v6地址写进本地电脑的hosts文件。

如果你本地电脑不在IPv6世界,在创建完VPS到本地的VPN之后,你可以再利用VPN的IP来创建IPv6隧道,从而将本地电脑连接v6世界。为什么会这么麻烦,主要是一般我们的电脑是不具有公网v4地址的,否则直接tunnelbroker就够了。

Contents
  1. 1. 隧道申请
  2. 2. VPS配置
    1. 2.1. tb_userspace
    2. 2.2. 确认完成
  3. 3. 可以用它来干嘛