设为首页收藏本站

恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 24430|回复: 187

【再次更新】【添加老毛子固件支持】openwrt 自动内网重拨 切换并保持公网IP的脚本

  [复制链接]
发表于 2015-8-24 20:52 | 显示全部楼层 |阅读模式
本帖最后由 VBasic 于 2017-8-13 00:43 编辑

年度更新请往下看:

pppoe拨号 ,设置了动态dns,但是获取到的ip老会变成10开头的内网ip,有没有什么方法能判断当前获取的是内网ip就重新拨号直到获取到公网IP的脚本或软件?
感谢大神ssitssit,搞定了。

参考:
http://www.right.com.cn/forum/forum.php?mod=viewthread&tid=100274
http://www.right.com.cn/forum/thread-139379-1-1.html

使用方法:

winscp /usr/bin目录下新建文件redial.sh,打开文件把脚本复制进去,属性设置777

QQ截图20150826233204.png

在计划任务 crontab中每小时调用执行一次这个脚本:
  1. 0 */1 * * * sh /usr/bin/redial.sh
复制代码
效果图:
QQ截图20150829231136.png

==============================================

年度更新

==============================================

16年 8/9发布 改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件 拨公网地址脚本
使用方法:

QQ图片20160809132357.png

由于老毛子固件重拨较久,这里使用了sleep 10来减少错误发生的概率。可以根据需要自行调整。

关于获取IP不准的情况:这里提供了下面一系列获取外网IP的网址(来自老毛子固件),可以根据需要自行替换:

checkip.dyndns.org
checkip.dyndns.org:8245
echo.tzo.com
ip.dnsexit.com
ip.changeip.com
myip.dnsomatic.com
ip1.dynupdate.no-ip.com
checkip.dns.he.net
checkip.zerigo.com
checkip.two-dns.de
ipv4.wtfismyip.com/text
ipv4.nsupdate.info/myip
myip.dtdns.com
members.3322.org/dyndns/getip

2017/8/13 更新
1.Openwrt/Pandorabox 脚本,放到/etc/hotplug.d/iface 目录下,权限777,输出写入log文件/tmp/diag_log,无需设置crontab,重启即可。
  1. #!/bin/sh

  2. sleep 3
  3. wanip=$(ifconfig pppoe-wan 2> /dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
  4. #获取wan口ip
  5. sleep 2
  6. pubip=$(/usr/bin/wget -qO - ddns.oray.com/checkip|tr -cd [0-9.])
  7. #从网络获取公网IP

  8. echo "Public IP:" $pubip >> /tmp/dial_log
  9. echo "WAN IP:" $wanip >> /tmp/dial_log
  10. #显示IP

  11. if [ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  12.         #如果获取的IP是无效,记为错误
  13.         sleep 5
  14.         ifup wan
  15.         echo "IP error"
  16. elif [ "$pubip" = "$wanip" ]; then
  17.         #如果外网IP和本地IP相同,则保留IP
  18.         echo "dial success" >> /tmp/dial_log
  19. else
  20.         #如果获取的是内网IP,重拨
  21.         echo "Got Intranet IP:" $wanip "Redial ...">> /tmp/dial_log
  22.         ifup wan
  23.         sleep 2
  24. fi
复制代码
2.常规脚本,放到/usr/bin,权限777,增加了互斥锁。需设置crontab,同上文。
  1. #!/bin/sh
  2. if [ ! -z "/tmp/redial_ip_lock" ]; then
  3.         touch /tmp/redial_ip_lock
  4.         sleep 10
  5.         times='0'
  6.         for i in `seq 30`
  7.         #做50次拨号循环,30次如果都没拨上也停止
  8.         do
  9.                 sleep 2
  10.                 wanip=$(ifconfig pppoe-wan 2> /dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
  11.                 #获取wan口ip
  12.                 sleep 2
  13.                 pubip=$(wget -qO - ddns.oray.com/checkip|tr -cd [0-9.])
  14.                 #从网络获取公网IP

  15.                 echo "Public IP:" $pubip
  16.                 echo "WAN IP:" $wanip
  17.                 #显示IP

  18.                 if [ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  19.                         #如果获取的IP是无效,记为错误

  20.                         if [ "$times" -ge "3" ]&&[ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  21.                                 #如果连续3次都还是没有获取到ip,重拨
  22.                                 times='0'
  23.                                 ifdown wan | ifup wan
  24.                                 sleep 2
  25.                                 continue

  26.                         else
  27.                                 times=`expr $times + 1`;
  28.                                 echo "error times :" $times
  29.                                 echo "waitting two seconds"
  30.                                 sleep 2
  31.                         fi

  32.                 elif [ "$pubip" = "$wanip" ]; then
  33.                 #如果外网IP和本地IP相同,则保留IP
  34.                         echo "dial success"
  35.                         break

  36.                 else
  37.                 #如果获取的是内网IP,重拨
  38.                         echo "Intranet IP:" $wanip
  39.                         echo "Redial ..."
  40.                         ifdown wan | ifup wan
  41.                         sleep 2
  42.                 fi
  43.         done
  44.         rm -f /tmp/redial_ip_lock
  45. fi
复制代码



2017/7/19 更新,直接将此新脚本替换原内容(老毛子固件)。
  1. #!/bin/sh

  2. ### Custom user script
  3. ### Called after internal WAN up/down action
  4. ### $1 - WAN action (up/down)
  5. ### $2 - WAN interface name (e.g. eth3 or ppp0)
  6. ### $3 - WAN IPv4 address
  7. logger  "运行后 WAN 状态:" "WAN 状态:【$1】, WAN 接口:【$2】, WAN IP:【$3】"

  8. if [ $1 == "up" ] ; then

  9.     sleep 5
  10.     pubip=$(wget -qO - members.3322.org/dyndns/getip)
  11.     #从网络获取公网IP

  12.     wanip=$3
  13.     #获取wan口ip

  14.     logger "【公网脚本】出口IP:$pubip"
  15.     logger "【公网脚本】WAN口IP:$wanip"
  16.     #显示IP

  17.     if [ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  18.     #如果获取的IP是无效,记为错误
  19.         logger "【公网脚本】拨号失败,等待10秒"
  20.         sleep 10
  21.     elif [ "$pubip" = "$wanip" ]; then
  22.         #如果外网IP和本地IP相同,则保留IP
  23.         logger "【公网脚本】拨号成功,当前ip:$wanip"
  24.         /etc/storage/crontabs_script.sh up &
  25.     else
  26.     #如果获取的是内网IP,重拨
  27.         logger "【公网脚本】获取到内网ip:$wanip,重拨"
  28.         restart_wan
  29.     fi

  30. fi
复制代码
  1. sleep 10
  2. pubip=$(wget -qO - members.3322.org/dyndns/getip)
  3. #从网络获取公网IP

  4. wanip=$(nvram get wan0_ipaddr)
  5. #获取wan口ip

  6. echo "PUBLIC IP:" $pubip
  7. logger "出口IP:$pubip"
  8. echo "WAN IP:" $wanip
  9. logger "WAN口IP:$wanip"
  10. #显示IP

  11. if [ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  12. #如果获取的IP是无效,记为错误

  13. echo "Waitting 10 seconds"
  14. logger "等待10秒"
  15. sleep 10

  16. elif [ "$pubip" = "$wanip" ]; then
  17. #如果外网IP和本地IP相同,则保留IP
  18. echo "Dial success"
  19. logger "拨号成功,当前ip:$wanip"
  20. break

  21. else
  22. #如果获取的是内网IP,重拨
  23. echo "Intranet IP:" $wanip
  24. logger "获取到内网ip:$wanip,重拨"
  25. echo "Redial ..."
  26. restart_wan
  27. sleep 10
  28. fi
复制代码

=====================================================================================



8/29发布4.1版,更新少量内容:


1.修复循环重置计数
2.优化错误等待时间
3.修改提示内容


  1. #!/bin/sh
  2. times='0'
  3. for i in `seq 50`;
  4. #做50次拨号循环,50次如果都没拨上也停止
  5. do
  6. sleep 2
  7. wanip=$(ifconfig pppoe-wan 2> /dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
  8. #获取wan口ip
  9. sleep 2
  10. pubip=$(wget -qO - ddns.oray.com/checkip|tr -cd [0-9.])
  11. #从网络获取公网IP

  12. echo "Public IP:" $pubip
  13. echo "WAN IP:" $wanip
  14. #显示IP

  15. if [ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  16. #如果获取的IP是无效,记为错误

  17. if [ "$times" -ge "3" ]&&[ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  18. #如果连续5次都还是没有获取到ip,重拨
  19. times='0'
  20. ifdown wan | ifup wan
  21. sleep 2
  22. continue

  23. else
  24. times=`expr $times + 1`;
  25. echo "error times :" $times
  26. echo "waitting two seconds"
  27. sleep 2
  28. fi

  29. elif [ "$pubip" = "$wanip" ]; then
  30. #如果外网IP和本地IP相同,则保留IP
  31. echo "dial success"
  32. break

  33. else
  34. #如果获取的是内网IP,重拨
  35. echo "Intranet IP:" $wanip
  36. echo "Redial ..."
  37. ifdown wan | ifup wan
  38. sleep 2
  39. fi

  40. done
复制代码

经过测试,放出V4.0正式版:
更新内容:
1.根据4.0 Beta 修复 bug。
2.解决一处重复循环错误。
3.增加延时,避免本次重拨还没有完成,就进行下一次重拨的错误。
4.修复获取wan ip 和 公网 ip 为空的错误。


  1. #!/bin/sh
  2. times='0'
  3. for i in `seq 50`;
  4. #做50次拨号循环,50次如果都没拨上也停止
  5. do
  6. sleep 2
  7. wanip=$(ifconfig pppoe-wan 2> /dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
  8. #获取wan口ip
  9. sleep 2
  10. pubip=$(wget -qO - ddns.oray.com/checkip|tr -cd [0-9.])
  11. #从网络获取公网IP

  12. echo "Public IP:" $pubip
  13. echo "WAN IP:" $wanip
  14. #显示IP

  15. if [ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  16. #如果获取的IP是无效,记为错误

  17. if [ "$times" -ge "5" ]&&[ "$wanip" = "" ]||[ "$wanip" = "0.0.0.0" ]; then
  18. #如果连续5次都还是没有获取到ip,重拨
  19. ifdown wan | ifup wan
  20. sleep 2
  21. continue

  22. else
  23. times=`expr $times + 1`;
  24. echo "error times :" $times
  25. echo "waitting two seconds"
  26. sleep 2
  27. fi

  28. elif [ "$pubip" = "$wanip" ]; then
  29. #如果外网IP和本地IP相同,则保留IP
  30. echo "dial success"
  31. break

  32. else
  33. #如果获取的是内网IP,重拨
  34. echo $wanip
  35. ifdown wan | ifup wan
  36. sleep 2
  37. fi

  38. done
复制代码


8/26日晚再次更新,感谢@ssitssit 提供的新思路,更新内容V4.0 Beta


1. 重新构建脚本判断逻辑
2. 联网获取公网IP,更准确
3. 增大使用范围,目前支持任意的非公网IP
4. 优化软件错误处理
5. 精简代码

  1. #!/bin/sh
  2. times='0'
  3. for i in `seq 50`;
  4. #做50次拨号循环,50次如果都没拨上也停止
  5. do
  6. pubip=$(wget -qO - ddns.oray.com/checkip|tr -cd [0-9.])
  7. #从网络获取公网IP
  8. wanip=$(ifconfig pppoe-wan 2> /dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
  9. #获取wan口ip

  10. echo "Public IP:" $pubip

  11. echo "WAN IP:" $wanip

  12. if [ "wanip" = "" ]||[ "wanip" = "0.0.0.0" ];
  13. #如果获取的IP是无效,记为错误
  14. then

  15. times=`expr $times + 1`;
  16. echo "error times :" $times
  17. echo "waitting two seconds"
  18. sleep 2

  19. if [ "$times" -ge "5" ]&&[ "$wanip" = "" ]; then
  20. #如果错误次数达到5次,重播
  21. ifdown wan | ifup wan
  22. sleep 2

  23. fi

  24. elif [ "$pubip" = "$wanip" ]
  25. then
  26. #如果外网IP和本地IP相同,则保留IP
  27. echo "success"
  28. break

  29. else
  30. echo $wanip
  31. ifdown wan | ifup wan
  32. sleep 2
  33. fi

  34. done
复制代码

8/26更新V3.0 脚本:
更新内容:
1.修复判断错误bug。
2.增加错误计数机制,多次错误获取不到IP重置wan口
3.修复程序稳定性。



  1. #!/bin/sh
  2. j='0'
  3. for i in `seq 50`;
  4. #做50次拨号循环,50次如果都没拨上也停止
  5. do
  6. IP=$(ifconfig pppoe-wan 2> /dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
  7. #获取wan口ip
  8. IPP=${IP:0:2}
  9. #取wan口IP前二位
  10. echo "Current IP:"
  11. echo $IP

  12. if [ "$IPP" = "0." ]; then
  13. #如果没有获取到IP,延时2秒
  14. echo "please wait 2 second"
  15. sleep 2

  16. elif [ "$IPP" = "" ]; then
  17. #意外情况,等待2秒
  18. echo "error,please wait 2 second"
  19. sleep 2
  20. j=`expr $j + 1`;
  21. echo "error times :"
  22. echo $j
  23. if [ "$j" -ge "5" ]&&[ "$IPP" = "" ]; then
  24. ifdown wan | ifup wan
  25. sleep 2
  26. else
  27. continue
  28. fi

  29. elif [ "$IPP" = "10" ]; then
  30. #如果IP开头是10的话,重拨
  31. echo "Intranet IP:"
  32. echo $IP
  33. ifdown wan | ifup wan
  34. sleep 2


  35. else
  36. #保留IP,跳出循环
  37. echo "Public IP:"
  38. echo $IP
  39. break


  40. fi
  41. done
复制代码


8/25 更新:试用了一天的脚本,感觉还有些问题,现更新2.0版本。新手写shell脚本,老鸟请勿见笑
更新内容
1.修复一些逻辑错误
2.增加延时
3.增加错误处理

  1. #!/bin/sh
  2. for i in `seq 50`;
  3. #做50次拨号循环,50次如果都没拨上也停止
  4. do
  5. IP=$(ifconfig pppoe-wan 2> /dev/null | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
  6. #获取wan口ip
  7. IPP=${IP:0:2}
  8. #取wan口IP前二位
  9. echo "Current IP"
  10. echo $IP

  11. if [ "$IPP" = "0." ]; then
  12. #如果没有获取到IP,延时2秒
  13. sleep 2
  14. echo "please wait 2 second"

  15. elif [ "$IPP" = "" ]; then
  16. #意外情况,等待2秒
  17. echo "error,please wait 2 second"
  18. sleep 2


  19. elif [ "$IPP" = "10" ]; then
  20. #如果IP开头是10的话,重拨
  21. echo "Intranet IP"
  22. echo $IP
  23. ifdown wan | ifup wan
  24. sleep 2


  25. else
  26. #保留IP,跳出循环
  27. echo "Public IP"
  28. echo $IP
  29. break


  30. fi
  31. done
复制代码


加个回复可见吧,不然没人回帖。



















点评

不是一般的LOW,是LOW到极点,这问题是出在电信身上,电信要是弄死不分公网给你,随你把路由器拨号拨烂了都拿不到公网ip,终极解决办法是10000号投诉  发表于 2016-9-14 09:46
并且以后分配到的都是公网IP,是不会再分配到私网IP的。  发表于 2016-8-9 14:37
你这个方法真LOW,说实话。我这里有更好的方法。如果你是电信的,发现分配给自己的IP是10开头的内网IP,可以直接拨打10000号进行投诉。后台人员受理以后,给你设置一下,10分钟之后你重启光猫就会分配到公网IP  发表于 2016-8-9 14:36

评分

参与人数 7恩山币 +9 收起 理由
大梨子 + 3 一看就是觉得高端、大气、上档次!
wqiang + 1 联通好像没有用
liu66 + 1 城会玩 如果我想让路由每天某个时段检查ip.
好猫不一样 + 1 亲,你太牛逼了,走,我请你吃鳇鱼头去~~~
pro_drive + 1 一看就是觉得高端、大气、上档次!
随风飘逝ゞ + 1 城会玩
huatian + 1 城会玩

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2015-8-24 20:53 | 显示全部楼层
OPENWRT版本是这个  Powered by LuCI Trunk (0.12+git-14.328.33783-4d0a20b) PandoraBox R2 14.09
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2015-8-24 22:06 | 显示全部楼层
顶上去

点评

楼主啊,老毛子固件有没有获得指定IP段的脚本啊?  详情 回复 发表于 2016-12-28 18:50
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-8-24 22:09 | 显示全部楼层
投诉吧,我联通的,上个礼拜六也变10开头,投诉后今天又改回来了。

点评

湘潭联通投诉到工信部都没有用  详情 回复 发表于 2016-9-6 11:23
和他们说是对牛弹琴,根本不懂,然后就要你去办企业宽带,然后就没有然后了。。。  详情 回复 发表于 2015-8-24 22:25
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2015-8-24 22:25 | 显示全部楼层
wsh75 发表于 2015-8-24 22:09
投诉吧,我联通的,上个礼拜六也变10开头,投诉后今天又改回来了。

和他们说是对牛弹琴,根本不懂,然后就要你去办企业宽带,然后就没有然后了。。。

点评

不会的。电信联通这俩只要申诉就会给公网的。 跟你装傻你就申诉工信部啊。保证把你当大爷。  发表于 2015-11-1 19:23
哈哈,其实心如明镜,就是坑你而已  详情 回复 发表于 2015-8-25 13:55
装傻呢他们。建议直接报告宽带障碍。  详情 回复 发表于 2015-8-25 09:03
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-8-24 23:10 来自手机 | 显示全部楼层
有脚本,自动检测外网ip,不是就重播。

点评

在哪有,求教。。。  详情 回复 发表于 2015-8-24 23:20
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2015-8-24 23:20 | 显示全部楼层
ssitssit 发表于 2015-8-24 23:10
有脚本,自动检测外网ip,不是就重播。

在哪有,求教。。。

点评

谢啦,看到你发的帖子了  详情 回复 发表于 2015-8-24 23:30
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2015-8-24 23:30 | 显示全部楼层
VBasic 发表于 2015-8-24 23:20
在哪有,求教。。。

谢啦,看到你发的帖子了
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-8-25 09:03 | 显示全部楼层
VBasic 发表于 2015-8-24 22:25
和他们说是对牛弹琴,根本不懂,然后就要你去办企业宽带,然后就没有然后了。。。

装傻呢他们。建议直接报告宽带障碍。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-8-25 10:36 | 显示全部楼层
再不改直接工信部投诉
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-8-25 12:47 | 显示全部楼层
你的脚本有用了吗?

点评

有用啊  详情 回复 发表于 2015-8-26 19:55
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-8-25 13:55 | 显示全部楼层
VBasic 发表于 2015-8-24 22:25
和他们说是对牛弹琴,根本不懂,然后就要你去办企业宽带,然后就没有然后了。。。

哈哈,其实心如明镜,就是坑你而已
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2015-8-26 03:30 | 显示全部楼层
顶上去让更多人看到
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-8-26 18:30 | 显示全部楼层
如果能稳定保持外网IP那就很不错哦
我的恩山、我的无线 The best wifi forum is right here.
发表于 2015-8-26 18:47 | 显示全部楼层
我也要向要公网,可惜电信只给内网IP  郁闷死
我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|手机APP版|恩山无线论坛 ( 苏ICP备05084872号-1 )  

GMT+8, 2017-9-24 16:46

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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