路由器IPV6地址变动导致wan6掉pd解决方法

如题所示,楼主经常被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

如果有精通脚本语言的可以提出建议,或者有更好的办法,也可以跟楼主说说。