avatar

LeapHeap Journal

Record moments.

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

解决OpenWrt掉IPv6公网的问题

发表于 最近 更新于 最近
作者 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
分享

相关文章

7月 30, 2026

解决OpenWrt掉IPv6公网的问题

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

7月 8, 2026

解决WD机场的Mihomo订阅DNS无法查询的问题

目前WD下发的mihomo配置文件里的dns配置里有一句: proxy-server-nameserver: - udp://127.0.0.1:2053 这原本是为了防止代理服务器自身的域名被dns污染,默认你有一个mosdns/smartdns的本地dns分流器,新版mihomo

3月 7, 2026

在PVE里使用虚拟串口与虚拟机进行命令行交互

起因 在pve中,如果给虚拟机直通了物理显卡,此虚拟机在加载显卡驱动后就会默认使用直通显卡输出视频流,因此pve对于这个虚拟机的基于虚拟显卡的VNC控制台就无法使用了,虚拟机进入“Headless”状态。因此,为了在这种情况下仍然能通过控制台与虚拟机交互,就需要使用虚拟串口。 实战操作 添加硬件接口

下一篇

上一篇

《红猪》观影笔记

最近更新

  • 解决OpenWrt掉IPv6公网的问题
  • 《红猪》观影笔记
  • Alicks杂记
  • 解决WD机场的Mihomo订阅DNS无法查询的问题
  • 目前家庭服务器的基本状况

热门标签

Halo 服务器 Web 博客 OpenWrt

目录

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

使用 Halo 主题 Chirpy