0 概述
这次安装he隧道的过程真的是充满了艰辛,来来回回折腾了好几天,各种查资料和发邮件发帖求教,相当心累了。
先大概说下我对he隧道的理解吧,这是一个6in4的协议,即把ipv6数据包封装在ipv4包里进行通信。流程简述如下:
- 客户端发送ipv6的请求,通过he隧道将ipv6请求封装在ipv4的数据包中
- 客户端通过本地的ipv4网卡发送上述数据包到隧道服务器
- 隧道服务器将ipv6的数据从ipv4的包中解析出来,再由服务器的ipv6地址去路由找到剩下的内容
- 隧道服务器将找到的内容再次封装成ipv4的数据,原路返回客户端
要完成这个过程需要以下几个地址都是可访问的:
- 服务器的ipv4地址,即server ipv4 address,用于帮客户端找到服务器
- 服务器的ipv6地址,即server ipv6 address,用于同外部的ipv6进行通信
- 客户端的ipv4地址,即client ipv4 address, 用于帮服务器找到发起隧道请求的客户端
至于最后客户端的ipv6地址,用途是给外网的ipv6服务器做身份标识,比如在test-ipv6.com的测试中,展示的本机ipv6地址就是这个client ipv6 address。
说完大致的原理,来看下给树莓派创建he隧道的过程。
1 创建he隧道
先保证自己有一个可ping通的公网ip,详情可以咨询自己的运营商。
登录he的官网: tunnelbroker.net,注册账号啥的就不说了,直接点击创建隧道,这里有两种,我们选第一个regular tunnel就可以了。然后是填公网ip和服务器地址,事先可以测试一下各个服务器的延迟,具体教程很多这里就不重复了。
然后是重点:隧道创建完成后一定要先确认server ipv6 address是外网可Ping通的,不然结局就是我们本地可以发送ipv6数据到服务器,但是收不到任何响应,因为服务器的ipv6不通就表示外网的服务进不来。
推荐一个测试网站:http://www.ipv6now.com.au/pingme.php。
这里以ipv6.google.com为例,把自己的server ipv6 address输进去点击Ping now之后就能看到结果,基本和普通的ping测试没啥区别。
如果自己的server ipv6 address没法ping通,要么发邮件到he的开发团队让他们帮忙看,要么自己再向运营商换个公网ip然后重新创建个tunnel,不过一般重启下光猫就能有个新的公网ip了。
2 给树莓派设置静态ip
我的光猫只给了一个千兆口和一个百兆口,但家里的设备较多,又想让它们都能用满我200M宽带的全部带宽,就接了一个千兆路由器。但这里要注意的是,he隧道虽然可以支持nat穿透,但为了避免麻烦,最好只有一层穿透,即内网都在同一个网关后面,这就需要把光猫出来的网线插到路由器的LAN口,让路由器只充当一个交换机的角色。
所以我的网络连接就是,光猫通过光纤接外网,把千兆LAN口接到路由器的LAN口上,其他所有的设备都接到路由器上,不管有线还是无线(有线当然也只能接路由器的LAN口哈)。这个连接下,我所有的设备都同处一个网段,后期方便使用局域网的文件共享服务。
接着登陆光猫的管理界面,找到树莓派,复制其mac地址。
然后找到光猫对应的静态ip设置界面,将该mac地址与ip绑定。
当然设置静态ip的事也可以通过树莓派自身来完成,不过我觉得相比而言更麻烦一点,就直接在光猫统一管理了。
补充一点,如果光猫有IPV6 DHCP服务,最好让其处于默认状态,不确定的设置前可以先重置一下光猫。我之前不小心设置了一下忘了还原,就也一直连接不上。
3 登录树莓派并配置he隧道
在局域网内,用其他电脑ssh登录进树莓派,当然如果你的树莓派本身也接了显示器键鼠啥的用它自己也行。
在tunnelbroker的页面,打开刚刚创建的tunnel,在example configurations里选择Debian/Ubuntu,然后复制里面的内容。(假设里用的就是树莓派的默认系统raspbian)
编辑树莓派的/etc/network/interfaces文件,把刚刚复制的内容粘贴进去,同时把local后面的地址改成内网刚刚配的静态ip。
我的配置文件如下,已隐去ipv6地址,实际中替换为自己的真实地址即可
# interfaces(5) file used by ifup(8) and ifdown(8)
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
address 2001:470:XXX:XXX::2
netmask 64
endpoint 66.220.18.42
local 192.168.1.10
ttl 255
gateway 2001:470:XXX:XXX::1
保存文件,重启网络,可以用命令 sudo system networking restart,当然也可以直接重启树莓派。
重启之后用ifconfig看看,如果有he-ipv6这个隧道就说明创建成功了。
pi@raspberrypi:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::e9c3:109e:90b0:e90f prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:4b:44:80 txqueuelen 1000 (Ethernet)
RX packets 2648 bytes 211645 (206.6 KiB)
RX errors 0 dropped 5 overruns 0 frame 0
TX packets 353 bytes 38884 (37.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
he-ipv6: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1480
inet6 fe80::c0a8:10a prefixlen 64 scopeid 0x20<link>
inet6 2001:470:xxx:xxx::2 prefixlen 64 scopeid 0x0<global>
sit txqueuelen 1000 (IPv6-in-IPv4)
RX packets 26 bytes 2648 (2.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 29 bytes 2952 (2.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:1e:11:d5 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4 检查隧道的连通性
最直接的方式就是用ping6这个命令看看通不通。
pi@raspberrypi:~ $ ping6 ipv6.baidu.com
PING ipv6.baidu.com(2400:da00:2::29 (2400:da00:2::29)) 56 data bytes
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=2 ttl=40 time=456 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=3 ttl=40 time=456 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=4 ttl=40 time=456 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=5 ttl=40 time=456 ms
^C
--- ipv6.baidu.com ping statistics ---
6 packets transmitted, 4 received, 33.3333% packet loss, time 47ms
rtt min/avg/max/mdev = 455.605/456.204/456.471/0.352 ms
pi@raspberrypi:~ $ ping6 ipv6.google.com
PING ipv6.google.com(tsa03s01-in-x0e.1e100.net (2404:6800:4008:802::200e)) 56 data bytes
64 bytes from tsa03s01-in-x0e.1e100.net (2404:6800:4008:802::200e): icmp_seq=1 ttl=55 time=306 ms
64 bytes from tsa03s01-in-x0e.1e100.net (2404:6800:4008:802::200e): icmp_seq=2 ttl=55 time=307 ms
64 bytes from tsa03s01-in-x0e.1e100.net (2404:6800:4008:802::200e): icmp_seq=3 ttl=55 time=313 ms
64 bytes from tsa03s01-in-x0e.1e100.net (2404:6800:4008:802::200e): icmp_seq=4 ttl=55 time=307 ms
^C
--- ipv6.google.com ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 6ms
rtt min/avg/max/mdev = 306.193/307.996/312.721/2.759 ms
然后可以用第1步提到的测试网站看看自己的client ipv6 address能不能通,以保证在之后的访问中其他网站的服务器可以识别自己的身份。
5 Debug
如果上面没有ping通的话,可以再用ifconifg看看各个接口的信息,注意he-ipv6那部分,有两个重要字段,即RX packets 和 TX packets,下面简称RX和TX。
- 如果RX、TX都是0,多半说明隧道没配成功,可以仔细对比下配置文件是否有错误
- 如果RX为0,但TX不为0,多半是服务器没正常启用,因为本地已经可以发送了,但服务器没法和外部通信,也就没法返回后续的内容。参考第1步里最后测试server ipv6 address的部分
一般现代的操作系统不管是树莓派、路由器、还是光猫,它们都是支持ipv6的,包括这种6in4协议,如果发现自己连不通可以试试重装系统,恢复出厂设置等方式。
6 后续
由于ipv6是公网地址,直接暴露在网上还是挺危险的,可以考虑加一些防火墙,详情可以参考其他的文章。