自从网络架构变更,ipv6分配地址改为DHCPv6之后,发现树莓派上eth0网卡上的ipv6地址经常不翼而飞。由于现在仅剩下ipv6全球单播地址这个公网ip,ip地址的丢失会导致dogcraft.top部分服务中断,一开始是用定时脚本自动添加写死的ipv6地址到网卡,虽然之前DHCPv6分配的ipv6地址一直没变,但是现在它变了,所以不得不用更高级的方法解决这个问题,顺便还需要更新dns服务商那里的AAAA解析记录。

dog6ipr.py这个是获取公网ipv6地址,然后写到文件里面,这个api接口是从NewFuture/DDNS里面找来的。这个脚本开机启动运行一次就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
from urllib.request import urlopen, Request
import time

url="https://api-ipv6.ip.sb/ip"
reg=IPV6_REG
res = urlopen(
Request(url, headers={'User-Agent': 'curl/7.63.0-ddns'}), timeout=60
).read().decode('utf8')
localtime = time.asctime( time.localtime(time.time()) )
# print(localtime+'\n'+res)
with open('dog6ip.ipaddr','w') as f:
f.write(localtime+'\n'+res)
pass

dog6ip.py 从文件里面读取ip地址,然后转化成标准输出。

1
2
3
4
5
#!/usr/bin/env python
with open('dog6ip.ipaddr') as f:
hu=f.readlines()
pass
print(hu[1].rstrip()+'/128')

最终使用脚本将IP地址添加进网卡定时运行,半小时运行一次。

1
2
3
4
#!/bin/bash
export DOG=$(/home/pi/dog6ip.py)
sudo ip -6 addr add $DOG dev eth0
sudo ip -6 route add default via fe80::6666 dev eth0 metric 256

开机脚本

1
2
3
sleep 60
ddns -c /home/pi/ddns/config.json
python3 /home/pi/dog6ipr.py

这样做暂时是有效的,但是治标不治本。深层次的原因可能是ip6table在启动nat之后或者linux在开启ipv6转发之后会自动屏蔽ipv6的dhcp数据包或者是自动禁用ipv6地址自动配置,而且上级网关发下来的ipv6地址有过期时间,这个可能是根本原因。但网上没有相关资料(或者是没找到),毕竟用树莓派+ip6tables+radvd搞ipv6-nat66的同时ISP通过dhcpv6分发ipv6地址而且过期时间短的应该不多。