:globalIsRuntrue
#循环检测WAN口流量间隔秒数
:globalInvs5;
#循环检测WAN口流量次数
:globalChkTimes60
#初始限定的单IP下行带宽(1M)
:globalRxCurSet100000
#单IP最大下行带宽(10M)
:globalRxMaxRate1000000
#单IP最小下行带宽(50K)
:globalRxMinRate50000
#总下行流量上阀值(10M)
:globalRxUpSwRate10000000
#总下行流量下阀值(6M)
:globalRxDwSwRate6000000
#初始限定的单IP上行带宽(1.2M)
:globalTxCurSet1200000
#单IP最大上行带宽(200k)
:globalTxMaxRate200000
#单IP最小上行带宽(100K)
:globalTxMinRate100000
#总上行流量上阀值(10M)
:globalTxUpSwRate10000000
#总上行流量下阀值(6M)
:globalTxDwSwRate8000000
#合法用户地址列表名称
:globalListName"userlist"
#临时存放地址列表项的变量
:globalul
#临时存放地址的变量
:globaltadd
#临时的循环变量
:globali0
#检测的下行总流量合计
:globalRxCurRate0
#检测的上行总流量合计
:globalTxCurRate0
#临时存放总流量的变量
:globalCurRate0
#下行步进值
:globalRxStepRate0
#上行步进值
:globalTxStepRate0
#临时存放旧下行限定
:globalOldRxSet0
#临时存放旧上行限定
:globalOldTxSet0
:while($IsRun)do={
:if(($OldRxSet!=$RxCurSet)||($OldTxSet!=$TxCurSet))do={
:setRxStepRate($RxCurSet/3);
:setTxStepRate($TxCurSet/3);
:foreachulin=[/ipfirewalladdress-listfindlist=userlist]do={
:settadd[/ipfirewalladdress-listget$uladdress]
:if([:len[/queuesimplefindname=$tadd]]>0)do={
/queuesimpleset$taddtarget-addresses=[:tostr($tadd."/32")]\
limit-at=[:tostr($TxCurSet."/".$RxCurSet)]\
max-limit=[:tostr(($TxCurSet+$TxStepRate)."/".($RxCurSet+$RxStepRate))]\
burst-limit=[:tostr(($TxCurSet2)."/".($RxCurSet2))]\
burst-threshold=[:tostr(($TxCurSet-$TxStepRate)."/".($RxCurSet-$RxStepRate))]\
total-queue=ethernet-default\
burst-time=30/30
}else={
/queuesimpleaddname=$taddtarget-address=[:tostr($tadd."/32")]\
limit-at=[:tostr($TxCurSet."/".$RxCurSet)]\
max-limit=[:tostr(($TxCurSet+$TxStepRate)."/".($RxCurSet+$RxStepRate))]\
burst-limit=[:tostr(($TxCurSet2)."/".($RxCurSet2))]\
burst-threshold=[:tostr(($TxCurSet-$TxStepRate)."/".($RxCurSet-$RxStepRate))]\
total-queue=ethernet-default\
burst-time=30/30
}
}
}
:setRxCurRate0
:setTxCurRate0
:forifrom=1to=$ChkTimesdo={
/interfacemonitor-trafficWanoncedo={:setCurRate$"received-bits-per-second"
:setRxCurRate($RxCurRate+$CurRate)
/interfacemonitor-trafficWanoncedo={:setCurRate$"sent-bits-per-second"
:setTxCurRate($TxCurRate+$CurRate)
:delay$Invs
}
:setRxCurRate($RxCurRate/$ChkTimes)
:setTxCurRate($TxCurRate/$ChkTimes)
:setOldRxSet$RxCurSet
:setOldTxSet$TxCurSet
:if($RxCurRate<$RxDwSwRate)do={:setRxCurSet($RxCurSet+$RxStepRate);}
:if($RxCurRate>$RxUpSwRate)do={:setRxCurSet($RxCurSet-$RxStepRate);}
:if($TxCurRate<$TxDwSwRate)do={:setTxCurSet($TxCurSet+$TxStepRate);}
:if($TxCurRate>$TxUpSwRate)do={:setTxCurSet($TxCurSet-$TxStepRate);}
:if($RxCurSet<$RxMinRate)do={:setRxCurSet$RxMinRate;}
:if($RxCurSet>$RxMaxRate)do={:setRxCurSet$RxMaxRate;}
:if($TxCurSet<$TxMinRate)do={:setTxCurSet$TxMinRate;}
:if($TxCurSet>$TxMaxRate)do={:setTxCurSet$TxMaxRate;}
} |
|