avatar

LeapHeap Journal

Record moments.

  • 首页
  • 归档
  • 分类
  • 标签
  • 关于
主页 解决OpenWrt掉IPv6公网的问题
文章

解决OpenWrt掉IPv6公网的问题

发表于 2026-07-30 更新于 2026-07- 30
作者 LeapHeap
10~13 分钟 阅读

背景:电信宽带,已改桥接,有公网v6。由于存在v6续约超时的bug,所以写一个脚本自动重启wan接口。

创建watchdog主程序

nano /usr/bin/ipv6-watchdog

写入内容:

#!/bin/sh

############################################
# IPv6 Watchdog for OpenWrt / ImmortalWrt
############################################

CHECK_INTERVAL=30

FAIL_THRESHOLD=3

RECOVERY_TIMEOUT=30

fail_count=0
recovery_count=0

logger -t ipv6-watchdog "IPv6 Watchdog started."

while true
do
    # Check if br-lan has a public IPv6 address (2000::/3, i.e., 2xxx or 3xxx).
    if ip -6 addr show dev br-lan | \
        awk '$1=="inet6" && $2 ~ /^[23]/ { found=1 } END { exit !found }'
    then
        if [ "$fail_count" -gt 0 ]; then
            logger -t ipv6-watchdog "IPv6 recovered before restart."
        fi

        fail_count=0
    else
        fail_count=$((fail_count+1))

        logger -t ipv6-watchdog \
            "IPv6 GUA missing (${fail_count}/${FAIL_THRESHOLD})"

        if [ "$fail_count" -ge "$FAIL_THRESHOLD" ]; then

            recovery_count=$((recovery_count+1))

            logger -t ipv6-watchdog \
                "Restarting WAN (attempt #${recovery_count})..."

            START_TIME=$(date +%s)

            ifdown wan
            sleep 5
            ifup wan

            recovered=0

            for i in $(seq 1 "$RECOVERY_TIMEOUT")
            do
                sleep 1

                if ip -6 addr show dev br-lan | \
                    awk '$1=="inet6" && $2 ~ /^[23]/ { found=1 } END { exit !found }'
                then
                    recovered=1
                    break
                fi
            done

            END_TIME=$(date +%s)
            ELAPSED=$((END_TIME-START_TIME))

            if [ "$recovered" -eq 1 ]; then
                logger -t ipv6-watchdog \
                    "IPv6 restored successfully in ${ELAPSED}s."
            else
                logger -t ipv6-watchdog \
                    "IPv6 recovery timeout (${ELAPSED}s)."
            fi

            fail_count=0
        fi
    fi

    sleep "$CHECK_INTERVAL"
done

赋予执行权限:

chmod +x /usr/bin/ipv6-watchdog

创建procd服务

nano /etc/init.d/ipv6-watchdog

写入内容:

#!/bin/sh /etc/rc.common

START=99
USE_PROCD=1

start_service() {

    procd_open_instance

    procd_set_param command /usr/bin/ipv6-watchdog

    # restart when crashed
    procd_set_param respawn

    procd_close_instance
}

授权执行:

chmod +x /etc/init.d/ipv6-watchdog

启动服务

启用:

service ipv6-watchdog enable

启动:

service ipv6-watchdog start

查看状态:

service ipv6-watchdog status

停止:

service ipv6-watchdog stop

重启:

service ipv6-watchdog restart

查看日志

日志全部进入系统日志:

logread | grep ipv6-watchdog

正常情况下只有:

IPv6 Watchdog started.

如果偶尔丢一次:

IPv6 GUA missing (1/3)

恢复:

IPv6 recovered before restart.

如果连续三次:

IPv6 GUA missing (1/3)

IPv6 GUA missing (2/3)

IPv6 GUA missing (3/3)

Restarting WAN (attempt #1)...

IPv6 restored successfully in 8s.
日志, 技术
OpenWrt
许可协议:  CC BY 4.0
分享

相关文章

8月 8, 2026

[备忘] ddns-go docker容器内获取服务器主网卡的稳定ipv6

排除临时v6地址的noprefixroute标记即可。在获取v6地址方式选择by command,使用以下命令: ip -6 addr show dev enp6s0 scope global | awk '/inet6/ && $0 !~ /noprefixroute/ && $2 !~ /^fd

8月 7, 2026

[备忘] OpenClash部署配置简记

背景:2026年8月5日晚从nikki因版本过旧原因迁移到OpenClash新版端。以下是在官方默认配置下做的改动。 插件设置 操作模式 由于个人有依赖UDP的FH5联机需求,所以设置为fakeip-mixed,TUN栈选择Mixed,这样保证UDP流量进TUN透明代理。这也是之前某Youtuber

7月 30, 2026

解决OpenWrt掉IPv6公网的问题

背景:电信宽带,已改桥接,有公网v6。由于存在v6续约超时的bug,所以写一个脚本自动重启wan接口。 创建watchdog主程序 nano /usr/bin/ipv6-watchdog 写入内容: #!/bin/sh ######################################

下一篇

[备忘] OpenClash部署配置简记

上一篇

《红猪》观影笔记

最近更新

  • [备忘] ddns-go docker容器内获取服务器主网卡的稳定ipv6
  • [备忘] OpenClash部署配置简记
  • 解决OpenWrt掉IPv6公网的问题
  • 《红猪》观影笔记
  • Alicks杂记

热门标签

Halo 服务器 Web 博客 OpenWrt

目录

©2026 LeapHeap Journal. 保留部分权利。

使用 Halo 主题 Chirpy