一般的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就够了。