yenan111 发表于 2007-1-19 11:43:29

发个根据流量判断断线并切换的脚本,虽然麻烦但实用

因为个人认为netwatch并不是太适用,而且对于外线是某些数据公司提供的时候,仅netwatch判断
网关是无法判断出是否断线的,因为还有可能就是数据公司的出口问题造成断网的,所以写了这个脚本,
有点麻烦,但还实用。总体思路是当外线流量降低到某值时,开启检测功能ping网关以及指定网站(我这里用的是163的),判断
断线后自动切换。不足之处望多多指点。

      1.首先建立traffic monitor监视网卡流量
      添加一条名称:WangTong,接口选外线为网通的网卡,流量指定为1000000,接收数据,低于,触发事件
代码为:
#标记,不用多说
:log info "【----WT below 1Mbps----】"
#取得检测计划任务运行状态
:local CheckSch disabled]
#如果已运行则空,否则开启该检测计划任务
:if ($CheckSch) do={/system scheduler set
disabled=no
#计划任务运行次数
:global CheckTimeWT 0
#ping次数
:global PingCount 3
#该线路的首选网站IP
:global WebWT 202.108.9.32
#另一条线路的首选网站IP(我这里设的是一样的)
:global WebDX 202.108.9.32
#该网通网关
:global GatewayWT ***.***.***.***
#另一条线路电信网关
:global GatewayDX ###.###.###.###}

      2.添加计划任务,名字为:CheckWTstatus ,interval 为30秒,触发事件代码为:
#判断本计划任务是否已经运行10次,超过则停止本计划
:if ($CheckTimeWT>10) do ={/system scheduler set
disabled=yes}
#返回ping网站的成功次数
:local ResultWeb
#返回ping网关的成功次数
:local ResultGateway
:set CheckTimeWT ($CheckTimeWT + 1)
#如果本线路已经判断为down则空,否则继续
:if ($WTstatus!=down) do={
:if (($ResultWeb=0 && $ResultGateway=0) || ($ResultWeb=0 && $ResultGateway>1)) do ={
:global WTstatus down
#切换网关
/ip route set gateway=$GatewayDX
/ip route set gateway=$GatewayDX
:log info "【----GatewayWT Down,GatewayDX Running----】"
#增加指定路由
/ip route add dst-address=($WebWT . "/32") gateway=$GatewayWT scope=255 target-scope=10
comment="TempWT" disabled=no
#增加检测本线路恢复的计划任务
/system scheduler add name=CheckWTup interval=10 on-event=CheckWTup
}}

    3.添加脚本CheckWTup,代码为:
#返回ping网站的成功次数
:local ResultWeb
#返回ping网关的成功次数
:local ResultGateway
#如果都通表明线路恢复
:if ($ResultWeb>1 && $ResultGateway>1) do ={
:set WTstatus up
#还原网关
/ip route set gateway=$GatewayWT
#删除执行路由
/ip route remove
:log info "【----GatewayWT Up,GatewayWT Running----】"
#删除本计划任务
/system scheduler remove
}


以上是判断该线路是否断线并自动切换网关 ,网络恢复后还原网关,如果判断另外一条线路操作一样,只是稍加修改即可。

[ 本帖最后由 yenan111 于 2007-1-19 11:45 编辑 ]

lishinian1 发表于 2007-1-19 12:30:02

:o

jacky 发表于 2007-1-19 12:56:11

:o

hp12514 发表于 2007-1-19 15:21:14

楼猪, pf pf,这么长的脚本你是怎么调试出来的,真是生猛

younger 发表于 2007-1-19 18:45:15

根据流量判断也不是最好的办法。
1、网络流量不是固定的,有突发的、连续的。所取的流量只是瞬时流量
2、因为我们用的是NAT共享上网,一旦建立连接,如果那条线的流量大了,也不可能再重新走流量小的那条线,否则会无法正常通讯而断线。

yenan111 发表于 2007-1-19 20:31:35

原帖由 younger 于 2007-1-19 18:45 发表
根据流量判断也不是最好的办法。
1、网络流量不是固定的,有突发的、连续的。所取的流量只是瞬时流量
2、因为我们用的是NAT共享上网,一旦建立连接,如果那条线的流量大了,也不可能再重新走流量小的那条线, ...

traffic monitor的监控是触发式的,设置值后流量只有在该值上下波动时才会连续触发traffic monitor的event,网络流量当然不是固定的,但断网的过程肯定是流量急剧下降,当下降到某一阀值立即启动计划任务判断当前网络是否通畅,如果掉线则进行切换,完全可以有备无患,
再说这里没有切换流量大小的意图,又不是根据负载来平衡的没有楼上说的那种问题,那条线流量满满的我才高兴了,表明没有问题啊

zycn 发表于 2007-1-21 22:33:20

:local ResultGateway
:if ($ResultWeb>1) do ={
:log info "【----GatewayWT Up,GatewayWT Running----】"
}
怎么在log里看我到"【----GatewayWT Up,GatewayWT Running----】"呀
网关是通的

yenan111 发表于 2007-1-21 23:30:06

:if ($ResultWeb>1) do ={}就表明网关是通的,$resoult的值为ping通的次数

9939781 发表于 2007-1-21 23:30:18

够长的,服了:L

lenfen 发表于 2007-1-22 11:24:40

参考参考!!!!!!!!!!!!!

zycn 发表于 2007-1-22 21:34:38

:local ResultGateway
:if ($ResultWeb>1) do ={
:log info "【----GatewayWT Up,GatewayWT Running----】"
}
怎么在log里看我 不 到"【----GatewayWT Up,GatewayWT Running----】"呀
网关是通的
页: [1]
查看完整版本: 发个根据流量判断断线并切换的脚本,虽然麻烦但实用