解决OpenWrt掉IPv6公网的问题
背景:电信宽带,已改桥接,有公网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.
许可协议:
CC BY 4.0