找回密码
 立即注册
img_loading
智能检测中

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 3743|回复: 56

停电来电后openwrt无法自动获IPv6-PD地址的解决-升级

  [复制链接]
发表于 2024-7-23 11:27 | 显示全部楼层 |阅读模式
本帖最后由 2562733675 于 2024-12-19 14:16 编辑

关联:
    IPV6公网 Nas 打开防火墙单个设备设置方法
    IPv6公网动不动就被运营商限制的解决方案

   如果家里停电,由于主路由的启动速度比光猫快会导致路由器无法自动获取IPv6-PD地址,这时候人在外面用IPv6公网连接又没有别的打洞服务就失联了。为了解决这个问题,我写了一个IPv6-PD地址监控脚本,10min检测一次是否有IPv6-PD地址,发现没有IPv6-PD就定时5min后重启路由器。我个人觉重启要好一些,所有的服务都会顺畅的打开。
   注意:脚本应该在调试完毕,可以正确获取IPv6-PD地址后使用。
   20241219 增加条件判断,我的ipv6正常时是1个128和pd 64,所以判断
   1:有/128地址和缺乏pd地址时重启,防止未联网时循环重启;
# 当 ifstatus wan6 | jsonfilter -e '@["ipv6-address"][0].mask' 等于 128 且 ipv6-prefix=$(ifstatus wan6 | jsonfilter -e '@["ipv6-prefix"][0].address') 等于 0 时重启;
   2:增加重启条件,当有多余的/64地址和只有/64地址时重启;
# 当 ifstatus wan6 | jsonfilter -e '@["ipv6-address"][1].mask' 等于 64 或ifstatus wan6 | jsonfilter -e '@["ipv6-address"][0].mask'等于 64时重启 ;

我的正常情况如图:



这是IPv6-PD地址监控脚本,不想要重启的朋友可以把 reboot 更换成别的命令:

下面旧监控脚本,如果没有pd地址会一直重启:
  1. #!/bin/sh /etc/rc.common

  2. # 定义启动顺序
  3. START=99
  4. STOP=10

  5. # 脚本名称
  6. SCRIPT_NAME="IPv6-Monitor"

  7. # 定义检查 IPv6 地址的函数
  8. check_ipv6() {
  9.     # 获取 wan6 接口的 IPv6 地址
  10.     ipv6_address=$(ifstatus wan6 | jsonfilter -e '@["ipv6-prefix"][0].address')

  11.     # 检查地址是否为空
  12.     if [ -z "$ipv6_address" ]; then
  13.         return 1  # 地址为空
  14.     else
  15.         return 0  # 地址不为空
  16.     fi
  17. }

  18. start() {
  19.     echo "$SCRIPT_NAME is starting"

  20.     # 循环检查
  21.     while true; do
  22.         if check_ipv6; then
  23.             #echo "IPv6 address exists, continue monitoring..."
  24.             sleep 1
  25.         else
  26.             #echo "IPv6 address is empty, start timer..."
  27.             sleep 300  # 等待 5 分钟 可以根据需求自己更改

  28.             # 再次检查 IPv6 地址
  29.             if check_ipv6; then
  30.                 #echo "The IPv6 address is restored to normal without restarting."
  31.                 sleep 1
  32.             else
  33.                 #echo "IPv6 address is still empty, restart the system..."
  34.                 reboot  # 重启系统
  35.             fi
  36.         fi

  37.         sleep 600  # 每 10 分钟检查一次 可以根据需求自己更改
  38.     done &
  39. }

  40. stop() {
  41.     killall IPv6-Monitor
  42.     echo "$SCRIPT_NAME is stopping"
  43.     # 这里可以添加停止逻辑
  44.     # 如果需要停止脚本,可以使用 kill 命令来终止后台进程
  45. }

  46. restart() {
  47.     echo "$SCRIPT_NAME is restarting"
  48.     stop
  49.     start
  50. }
复制代码

新脚本升级判断条件:

  1. #!/bin/sh /etc/rc.common
  2. # 当 ifstatus wan6 | jsonfilter -e '@["ipv6-address"][0].mask' 等于 128 且 ipv6-prefix=$(ifstatus wan6 | jsonfilter -e '@["ipv6-prefix"][0].address') 等于 0 时重启。
  3. # 当 ifstatus wan6 | jsonfilter -e '@["ipv6-address"][1].mask' 等于 64 或ifstatus wan6 | jsonfilter -e '@["ipv6-address"][0].mask'等于 64时重启 。

  4. # 定义启动顺序
  5. START=99
  6. STOP=10

  7. # 脚本名称
  8. SCRIPT_NAME="IPv6-Monitor"

  9. # 定义检查 IPv6 地址的函数
  10. check_ipv6() {
  11.     # 获取 wan6 接口的 IPv6 地址和掩码
  12.     ipv6_address0_mask=$(ifstatus wan6 | jsonfilter -e '@["ipv6-address"][0].mask')
  13.     ipv6_address1_mask=$(ifstatus wan6 | jsonfilter -e '@["ipv6-address"][1].mask')
  14.     ipv6_prefix=$(ifstatus wan6 | jsonfilter -e '@["ipv6-prefix"][0].address')

  15.     # 检查地址和掩码是否符合重启条件
  16.     if [ "$ipv6_address0_mask" = "128" ] && [ "$ipv6_prefix" = "0" ]; then
  17.         return 0  # 符合重启条件
  18.     elif [ "$ipv6_address1_mask" = "64" ] || [ "$ipv6_address0_mask" = "64" ]; then
  19.         return 0  # 符合重启条件
  20.     else
  21.         return 1  # 不符合重启条件,不重启
  22.     fi
  23. }

  24. start() {
  25.     echo "$SCRIPT_NAME is starting"

  26.     # 循环检查
  27.     while true; do
  28.         check_ipv6
  29.         if [ $? -eq 0 ]; then
  30.             echo "Reboot condition met, waiting for 5 minutes before final check..."
  31.             sleep 300  # 等待5分钟
  32.             echo "Final check after delay..."
  33.             check_ipv6
  34.             if [ $? -eq 0 ]; then
  35.                 echo "Reboot condition still met, restarting system..."
  36.                 reboot  # 重启系统
  37.             else
  38.                 echo "Reboot condition no longer met, skipping reboot."
  39.             fi
  40.         else
  41.             # 如果不符合重启条件,则不执行任何操作,等待下一次检查
  42.             :
  43.         fi
  44.         sleep 600  # 每10分钟检查一次
  45.     done &
  46. }

  47. stop() {
  48.     killall IPv6-Monitor
  49.     echo "$SCRIPT_NAME is stopping"
  50.     # 这里可以添加停止逻辑
  51.     # 如果需要停止脚本,可以使用 kill 命令来终止后台进程
  52. }

  53. restart() {
  54.     echo "$SCRIPT_NAME is restarting"
  55.     stop
  56.     start
  57. }
复制代码


具体用法:


游客,如果您要查看本帖隐藏内容请回复



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
发表于 2024-7-23 18:01 | 显示全部楼层
没搞懂你问什么,还有就是为什么要重启,不是重新启用一下wan口就行了吗

点评

看来名字取得不对,得改。  详情 回复 发表于 2024-7-23 20:11
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-23 20:11 来自手机 | 显示全部楼层
ranmaozhi 发表于 2024-7-23 18:01
没搞懂你问什么,还有就是为什么要重启,不是重新启用一下wan口就行了吗

看来名字取得不对,得改。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-23 20:48 | 显示全部楼层
其实只要 ifdown wan; sleep 2; ifup wan 就可以了这样比较快,怕有问题可再 /etc/init.d/dnsmasq restart 一次

当然重启也没有问题,只不过建议用脚本检测是否有 pd(自己用无所谓,发出来就要防呆)

点评

为什么要采用重启,我还有个alyun webdav这中情况也无法正常启动。之前,单独刷新wan6有些问题,所有觉得重启比较好。  详情 回复 发表于 2024-7-24 04:43
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-24 04:43 来自手机 | 显示全部楼层
superzjg 发表于 2024-7-23 20:48
其实只要 ifdown wan; sleep 2; ifup wan 就可以了这样比较快,怕有问题可再 /etc/init.d/dnsmasq restart  ...

为什么要采用重启,我还有个alyun webdav这中情况也无法正常启动。之前,单独刷新wan6有些问题,所有觉得重启比较好。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-25 13:12 | 显示全部楼层
感谢分享,刚好遇到过停电需要手动重启的情况
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-25 13:40 | 显示全部楼层
本帖最后由 bennyzhou 于 2024-7-25 14:34 编辑


可以把reboot改成重启wan6
  1.                 ifdown wan6 && ifup wan6  # 重启wan6
复制代码




还可以试试官方方法


以下方法为5分钟刷新1次。且不需要重启路由器

光猫下挂二级路由器的确会产生ipv6前缀丢失的问题。原因就是光猫刷新了pd段但是路由器没有及时更新

修改/etc/config/dhcp

config dhcp 'lan'
//加入下面关键几句
        option ra_slaac '1'
        option preferred_lifetime '5m'
        option ra_lifetime 3000

注意不要加ra_useleasetime。官网原文如下
The preferred_lifetime option only takes effect if ra_useleasetime is disabled.

点评

测试了,不行  详情 回复 发表于 2024-8-29 09:14
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-30 14:03 | 显示全部楼层
感谢分享,办法不错,把reboot改成/sbin/ifup wan会不会好些
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-31 14:11 | 显示全部楼层
看怎么弄?
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-31 14:20 | 显示全部楼层
办法不错
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-31 18:02 | 显示全部楼层
看看帖子里藏了啥好东西~~~
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-31 18:30 | 显示全部楼层
是IPv6-PD地址监控脚本,不想要重启的朋友可以
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-8-21 09:28 | 显示全部楼层
IPv6-PD地址监控脚本
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-8-22 12:57 来自手机 | 显示全部楼层
看看研究下
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-8-24 17:28 | 显示全部楼层
感谢分享!
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛

只谈技术、莫论政事!切勿转播谣言!为了你也为了他人。
只谈技术、莫论政事!(点击见详情) 切记不要随意传播谣言,把自己的日子过安稳了就行,为了自己好也为了大家好。 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。

查看 »

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2025-6-8 20:49

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表