自由的生活_软路由论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 469|回复: 20

[脚本] 求助一个断线侦测脚本

[复制链接]
发表于 2020-2-26 09:51:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
好久没回来论坛逛逛了。好多论坛老玩家都还在吗?作为一个ROS的爱好者,在如今各种软硬路由推陈出新的年代,虽说没有了当年那么高的热情。但是一直都没放弃使用,只是折腾少了。
回归正题,玩了那么年基本原理操作都没问题,但苦于毕竟没有经过系统的学习过,脚本这方面多数是只能照搬各位网友制作好的的成品,从脚本上大致能理解是什么意思,就是不会写。哈

网络环境是这样,电信+移动分流,本来都是拨号模式的,用PCC脚本修改得来的脚本可以通过侦测PPPOE-OUT的活动来判断是否正常拨上号,年前电信换了5G套餐,但是有个奇葩现象,拨号模式跑出来的带宽超不过500M而且有时还会更低,电信装维师傅的答复是必须要更换光猫,10G的光猫可不便宜,但是如果把原用的光猫用路由模式,却可以达到接近满速。为什么会这样也懒得去猜了。至少能稳定达标。于是把在ROS里原来的电信拨号模式改为了固定IP模式,移动不变,其它参数也基本沿用原设置通过Address Lists分流。最近不知道什么原因,电信偶尔有断网。在断网的情况下,因为设定默认路由是电信,就会造成无法上网。想求教一断线自动切换默认路由为移动的脚本,通过ping百度的方法侦测电信线路是否连通状态,然后切换。

电信内网卡为TEL,标记路由L1,comment=tel
移动PPPOE-OUT2,标记路由L2
建立两条默认路由规则,电信的comment=tel,移动默认
我的理解为通过ping侦测L1连通状态,不能ping通百度时关闭路由表里comment=tel的项,关闭防火墙Mangel里面comment=cmcc移动的分流策略,全局走默认移动线路出局。待正常ping通自动恢复被关闭的项重新启动分流。

描述的可能有点乱,只能大概说出个过程,望多包涵。
原理其实很简单,但是脚本函数什么的不会就是不会,所以只能发帖求助了。还望各大神慷慨赐教,这样的网络环境应该还是蛮多人在用的吧。
routeros
 楼主| 发表于 2020-2-26 09:56:53 | 显示全部楼层
不知不觉也十年了,时间过得好快。
routeros
发表于 2020-2-27 17:43:24 | 显示全部楼层
本帖最后由 技术支持 于 2020-2-27 17:44 编辑

1.建议用netwatch进行监测,在up和down里添加脚本
2.脚本参考(这是个根据IP地址变化修改回流IP的脚本):
:do {
:local ether
#以下不需要修改
:set ether "pppoe-internet"
:local oldip [/ip firewall nat get [/ip firewall nat find to-ports ="9031" chain=dstnat to-addresses =192.168.31.200 in-interface !="dcn" and in-interface !="wlan" comment="sgw" ] dst-address ]
:local newip [/ip address get [/ip address find interface=$ether ] address ]
:set newip [:pick $newip 0 [:find $newip "/"]]
:if ($oldip != $newip) do={
#修改49、50号防火墙规则,能够回流9031、10000端口流量,允许192.168.68.0地址段
/ip firewall nat set [/ip firewall nat find  to-ports ="9031" chain=dstnat to-addresses =192.168.31.200 in-interface !="dcn" and in-interface !="wlan" comment="sgw" ] dst-address=$newip
/ip firewall nat set [/ip firewall nat find dst-port ="10000" to-ports ="443" chain=dstnat to-addresses =192.168.31.111  comment="sgw1" ] dst-address=$newip
:log error ("oldip: ".$oldip." newip: ".$newip)
:log error ("firewall rule 49,50 dst-address updated!")
  } else={
:log error ("firewall rule 49,50 dst-address need not update!") }
}
routeros
发表于 2020-2-28 09:44:56 | 显示全部楼层
如果只是 2条线路 不需要排除 账号过期没网(可以拨上去没网) 的情况只需要路由表做下策略即可 其他策略不需要管也不需要使用脚本
nat 策略方面不建议使用 in-interface 参数绑定
可使用以下 方式

/ip route
add distance=1 gateway=pppoe-out1
add distance=2 gateway=pppoe-out2

如果存在拨上去没网可适当 需要其他方式辅助如调度脚本 或 /tool netwatch
routeros
 楼主| 发表于 2020-2-28 18:18:23 | 显示全部楼层
技术支持 发表于 2020-2-27 17:43
1.建议用netwatch进行监测,在up和down里添加脚本
2.脚本参考(这是个根据IP地址变化修改回流IP的脚本):
...

感谢您的恢复,我的不是专线固定IP的,回流这些也用不上。
纯粹就是个大内网,现在是光猫拨号模式,假设光纤没断,处于已经拨上号连接的状态,但是无数据流,或者被阻断。netwatch是侦测不到的。就算获取到内网拨号获取到的IP也不能判断网络是否处于正常通讯状态。所以还是建立在ping侦测才比较合理。我是这样理解的。
routeros
 楼主| 发表于 2020-2-28 18:28:23 | 显示全部楼层
47771885 发表于 2020-2-28 09:44
如果只是 2条线路 不需要排除 账号过期没网(可以拨上去没网) 的情况只需要路由表做下策略即可 其他策略不 ...

谢谢阿湘版主的回复,以前看您的帖子比较少,哈。

因为有个前提,如果是PPPOE拨号上去的话,就不存在问题了。因为论坛里很早就有很多种解决的方法可以借鉴解决。

现在是因为不换电信指定型号的光猫,用原配的普通千兆光猫,PPPOE拨号速度在300M-500M波动,达不到千兆。
但是把光猫桥接改成路由模式,ROS的PPPOE改成固定IP上网设置就能跑满极限900多兆。这两天没见断流现象了。前些时候在断流的情况下进光猫去看是处于正常拨通状态的,没有断开,间隔几分钟,又或者十几分钟就恢复正常,也不能排除是不是机房调试。
换过光猫也是一样的情况。桥接模式是跑不满电信千兆的。

因此才会有我文中提到的想法,策略分流,电信为主。电信断流的情况下,整个网络是瘫痪的,无法切换到移动,也就是热备线路。
routeros
 楼主| 发表于 2020-2-28 18:35:59 | 显示全部楼层
顺便提及一下,在断流的情况下,我是把电脑直接插到电信光猫其它LAN口上也是无法上网的。以及进到光猫操作界面确定是处于拨通状态。
routeros
 楼主| 发表于 2020-2-28 18:57:49 | 显示全部楼层
{
:local connect true
:for i from=1 to=3 \
    do={/interface pppoe-client monitor "pppoe-out$i" once \
               do={:set connect ($connect && $status="connected")}}

:if ($connect) \
    do={:for i from=1 to=3 \
            do={:set connect ($connect && [/ping www.baidu.com count=3 interface="pppoe-out$i"]>0)}}

:for i from=1 to=3 \
    do={:local array [/ip firewall mangle find comment="pcc$i"]
            :if ($connect) \
                do={:if ([/ip firewall mangle get $array new-routing-mark]!="L$i") \
                            do={/ip firewall mangle set $array new-routing-mark="L$i"}} \
                else={:if ([/ip firewall mangle get $array new-routing-mark]!="L$($i+3)") \
                             do={/ip firewall mangle set $array new-routing-mark="L$($i+3)"}}}

这是引用以前论坛里某位大兄弟的,不过这是用在PPPOE的PCC模式。借鉴这个应该可以实现的。我是不会写,会的就能写出来。就是ping不同百度就把策略里和路由表里把某条标记关闭,ping通了再开启。就这么简单。
routeros
 楼主| 发表于 2020-2-28 19:05:23 | 显示全部楼层
上面这个脚本因为需要改变PCC参数,所以还使用了变量。
我想达到的那个效果都用不到变量,最简单最有效。
ping不通,关闭策略和路由,让移动变成默认路由。
ping通了,恢复策略路由分流。
routeros
发表于 2020-2-28 22:38:31 | 显示全部楼层
本帖最后由 47771885 于 2020-2-28 22:46 编辑

这位朋友能记得阿湘的份上得安排

首先不要拨号自动添加网关
手动添加网络策略 其中默认网关备注 default
手动添加标记路由 备注 mak
/ip route
add distance=1 gateway=pppoe-out1 comment="default"
add distance=2 gateway=pppoe-out2

脚本 检测当前运行状态的pppoe-out 如果out1 在运行状态、且无网、且默认路由是out1 的情况下;修改为默认网关为out2 并禁用标记路由
如果当前检测的是out1 有网 但是默认网关为2 的情况下修改回为out1 并启用标记路由
实际运作有待测试

  1. {
  2. #www.ros.sh 20200228
  3. :local pingip "www.baidu.com"
  4. :local defgat [/ip route get [find comment="default"] gateway]
  5. :local lname
  6. /interface pppoe-client
  7. :foreach i in=[find running=yes] do={
  8. :set lname [get $i name]
  9. :if ([/ping $pingip count=3 interface=$lname]=0) do={
  10. :if ($defgat=$lname && $lname="pppoe-out1") do={
  11. /ip route set [find comment="default"] gateway="pppoe-out2"
  12. /ip route disable [find comment="mak"]
  13. }
  14. } else={
  15. :if ($defgat="pppoe-out2" && $lname="pppoe-out1") do={
  16. /ip route set [find comment="default"] gateway="pppoe-out1"
  17. /ip route enable [find comment="mak"]
  18. }
  19. }
  20. }
  21. }
复制代码


routeros
发表于 2020-2-28 23:16:15 | 显示全部楼层
看了下好像楼主的是电信是 dhcp或者静态IP 的二级路由一样的
那就要用这种了

{
#www.ros.sh 20200228
:local pingip "www.baidu.com"
:local telip "192.168.1.1"
:local defgat [/ip route get [find comment="default"] gateway]
:if ([/ping $pingip count=3 interface=TEL routing-table=L1]=0) do={
:if ($defgat=$telip) do={
/ip route set [find comment="default"] gateway="pppoe-out2"
/ip route disable [find comment="mak"]
}
} else={
:if ($defgat="pppoe-out2") do={
/ip route set [find comment="default"] gateway=$telip
/ip route enable [find comment="mak"]
}
}
}

注意如果电信是默认路由 域名可能无法解析建议使用ping IP 方式

:local telip 定义的是电信 网关Ip (光猫IP?)
routeros
 楼主| 发表于 2020-3-1 16:20:46 | 显示全部楼层
47771885 发表于 2020-2-28 23:16
看了下好像楼主的是电信是 dhcp或者静态IP 的二级路由一样的
那就要用这种了

再次感谢阿湘版主的耐心回复。并且连PPPOE模式的例子也写出来了。前些年鼓捣PCC的时候也遇到过类似我现在这种情况,就是拨号处于正常拨通的
状态,但是无数据,导致内网无法正常工作,于是就通过我贴出来的那个脚本来
侦测真实连通状态来修改PCC参数保持正常上网。现在随着带宽的增大,PCC应
用环境也少了。

我需要的就是第二种侦测方式,阿湘版主脚本里指出连同移动的PPPOE也一同侦测,我的理解是ROS默认路由只有一条生效,所以我建立两条默认路由,电信生效的情况下
移动的默认路由是无效的,数据走的是标记路由。所以没必要侦测移动线路的状态,您脚本里的大概意思我是理解的,但是只修改路由表里标注为default的项,网络应该还是有问题。
因为mangle里还有两条分流策略分别指向电信的L1和移动的L2,应该也要把这两条规则标注为default一同关闭,数据才能正常走默认路由出局,个人理解是这样还望您指正。
routeros
 楼主| 发表于 2020-3-1 16:26:38 | 显示全部楼层
本帖最后由 zh1000000 于 2020-3-1 16:29 编辑

确实如您所说的,电信用的是光猫的DHCP获取到的IP。至于DNS因为是不同的ISP分流,所以用了第三方的,应该不用考虑这个问题吧。指定用哪条线ping出去应该就满足侦测条件了。您写的这一段就指定了:if ([/ping $pingip count=3 interface=TEL routing-table=L1]=0),所以移动能否ping通,都不用去担心了,两条线路都不正常的话,什么脚本都是无功的,要往前端找原因了,这样理解对吧。
routeros
 楼主| 发表于 2020-3-1 16:49:33 | 显示全部楼层
班门弄斧一下,照葫芦画个瓢,老师来点评指正。

{
#www.ros.sh 20200228
:local pingip "www.baidu.com"
:local telip "192.168.1.1"
:if ([/ping $pingip count=3 interface=TEL routing-table=L1]=0) do={
/ip route disable [find comment="default"]
/ip fir man disable [find comment="default"]
}
} else={
/ip route enable [find comment="default"]
/ip fir man enable [find comment="default"]
}
}
}

点评

我上面给你弄这个有个获取默认网关数据对比的 也就是被修改过的才会去修改如果没有修改就不会修改 你改这个就不管上面状态都会有一个修改动作  发表于 2020-3-2 11:06
我上面给你弄这个有个获取默认网关数据对比的 也就是被修改过的才会去修改如果没有修改就不会修改 你改这个就不管上面状态都会有一个修改动作  发表于 2020-3-2 10:52
可以不过你这个 会一直修改机器会给你累死  发表于 2020-3-2 10:45
routeros
 楼主| 发表于 2020-3-9 19:12:24 | 显示全部楼层
间隔设个5分钟10分钟应该还好吧,哈。
routeros
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软路由论坛 ( 渝ICP备15001194号-1,渝公网安备 50011602500124号 )

GMT+8, 2020-4-2 16:40 , Processed in 0.151414 second(s), 23 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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