因为没有开通IPV4公网地址,我家里的树莓派一直没法远程连接,所以一直使用的域名AAAA方式映射IPV6地址进行的外网访问。

但前两天,我的树莓派突然出现了一个很诡异的情况,使用ipv6对树莓派进行远程访问的时候发现连不上了,连上SSH输入ip addr一看,好家伙,外网ipv6地址突然消失不见了!

我尝试重启,结果就回来了。我以为只是突然抽风,就没管了。没想到,过了几分钟又连不上了!

开始进行故障排查

首先使用curl -6 ip.sb尝试获取ipv6地址,显示not reachable,是无法连接到ipv6的

接着使用ip addr,观察结果,发现在eth0网卡下实际上还是有inet6本地地址的(fe80开头的就是本地ipv6地址),那么就可以排除是本地网卡的问题了。

使用route -6查询路由追踪,结果发现能正常弹出一系列的路由表,但是网关的外网地址(比如2a01开头)以及后续追踪到的ip的flag都是”!n”,也就是访问被拒绝。这就奇怪了

谷歌搜了一下,发现了这篇文章:点我去看,尝试跟着下面的解决方法,编辑了sysctl.conf,但重启后仍然过了一段时间就断开了。

正当我百思不得其解的时候,我注意到了文章中有写到可能是网关的问题,于是我又去检查了一下路由器中的ipv6设定,其中的一个设定引起了我的注意:

IPV6的配置设置

就是上面这个statefulstateless的设置,引起了我的注意。这个我之前一直没有改过,一直使用的都是默认的stateless,所以当时的ipv6地址都是全位的(每一位都有值,不存在xxx:0000:xxx的情况)注意,这里是个伏笔。我搜了一下这两个方法的区别,大概能明白的是,这个stateless就是让ipv6大部分都交给ISP来处理,而这个stateful则是把ipv6大部分交给路由器来处理(本人也不是很清楚,如果说错了请见谅)。于是乎尝试修改为Stateful模式,又进行了一次重启。

接下来,一小段时间内,似乎是没有任何问题了。

出现了另一个问题

但是,过了比之前更久的时间后,我又无法通过ipv6地址连接上我的树莓派了!无奈,只能再连上SSH查看ip addr。这一看,我才发现另一件事:我的IPV6地址变了!在这之前,地址都是全位的,但改过这个Stateful,并且等待了一段时间让路由器重新连接IPV6之后,我发现所有的IPV6地址都变了,中间少了许多位,并以”::”代替。

经过搜索,明白了ipv6地址中的::表示中间省略掉重复的0(或者0000),也就是说,比如2a01::98c7这样的地址,实际上就等于2a01:0:0:0:0:0:98c7!通过新的IPV6地址,就可以访问了,并且后续这个新的IPv6地址也没有变化了。