如题所示,楼主经常被ipv6问题所烦扰,楼主的ipv6前缀并没有固定,因此每一段时间,路由器就会更新ipv6地址。
每当路由器ipv6地址更新时,wan6接口的ipv6-pd就会掉,必须重启wan6接口才能重新获取pd。而且可能因为租期的问题,在路由器获取了ipv6-pd,也不会及时下发ipv6公网地址。
因此楼主问了gpt,写了一个脚本来实现:当路由器ipv6地址更新时,重启路由器wan6接口以重新获取ipv6-pd,并且重启dhcp以及时下发公网ipv6地址。
脚本如下:
#!/bin/sh
# 记录文件路径
STATE_FILE="/tmp/last_ipv6_addr"
# 获取当前WAN6的IPv6地址(外网地址)
CURRENT_IPV6=$(ip -6 addr show dev wan6 | grep -oP '(?<=inet6\s)[0-9a-f:]+(?=/64)' | grep -v '^fe80' | head -n1)
# 如果没获取到IPv6地址则退出
[ -z "$CURRENT_IPV6" ] && exit 0
# 如果没有旧记录,则创建
if [ ! -f "$STATE_FILE" ]; then
echo "$CURRENT_IPV6" > "$STATE_FILE"
exit 0
fi
# 读取上一次的IPv6
LAST_IPV6=$(cat "$STATE_FILE")
# 对比
if [ "$CURRENT_IPV6" != "$LAST_IPV6" ]; then
logger -t ipv6check "IPv6 address changed from $LAST_IPV6 to $CURRENT_IPV6, restarting wan6..."
ifdown wan6 && sleep 3 && ifup wan6
sleep 5
/etc/init.d/odhcpd restart
echo "$CURRENT_IPV6" > "$STATE_FILE"
else
# 未变化则忽略
:
fi
把上面的脚本保存为:
/usr/bin/check_ipv6_change.sh(给执行权限 chmod +x /usr/bin/check_ipv6_change.sh)
定时任务添加:
#每隔五分钟检测Ipv6地址是否更新,若更新则重启Wan6以重新获取Ipv6-PD并且重启DHCP
*/5 * * * * /usr/bin/check_ipv6_change.sh
如果有精通脚本语言的可以提出建议,或者有更好的办法,也可以跟楼主说说。