ybb575 发表于 2008-11-28 15:42:44

ROS脚本编写的根据流量进行单IP限速脚本

#*********脚本功能**********

#脚本在全局变量“Invs”的控制下,每隔“Invs”秒获取一次wan口发送与收到的流量。

#连取10次后取平均值,即wan口在10次采样中的平均发送与收到流量。

#然后根据总上/下行流量阀值调整每个IP的限速值。

#*********使用方法**********

#网关广域网口名:wan   ;局域网口名: lan

#在 \ip firewall address-list> 下建立名称为“userlist”的地址列表

#当有新IP加入这个列表时会自动在 \queue simple>下建立相应的限速项目

#定义变量
#脚本停止开关
:global IsRun true
#循环间隔秒数除以10的数
:global Invs 10;
#当前下行总流量变量
:global RxCurRate 1000000
#当前限定的单IP下行带宽
:global RxCurSet 5000000
#单IP最大下行带宽
:global RxMaxRate 8000000
#单IP最小下行带宽
:global RxMinRate 500000
#总下行流量阀值
:global RxSwRate 18000000
#下行步进值
:local RxStepRate 10
#当前上行总流量变量
:global TxCurRate 1000000
#当前限定的单IP上行带宽
:global TxCurSet 5000000
#单IP最大上行带宽
:global TxMaxRate 8000000
#单IP最小上行带宽
:global TxMinRate 500000
#总上行流量阀值
:global TxSwRate 18000000
#上行步进值
:local TxStepRate 10
#合法用户地址列表名称
:global ListName "userlist"
#临时存放地址列表项的变量
:local ul
#临时存放地址的变量
:local tadd
#临时的循环变量
:local i 0
#临时存放总流量的变量
:local CurRate 10
#临时存放旧下行限定
:local OldRxSet 10
#临时存放旧上行限定
:local OldTxSet 10
:set RxStepRate ($RxCurSet / 10);
:set TxStepRate ($TxCurSet / 10);

:while ($IsRun) do={

:set OldRxSet $RxCurSet
:set OldTxSet $TxCurSet

:if ($RxCurRate<$RxSwRate) do={
    :if ($RxCurSet<$RxMaxRate) do={
      :set RxCurSet ($RxCurSet + $RxStepRate);
      :set RxStepRate ($RxCurSet / 10);}
} else={
    :if ($RxCurSet>$RxMinRate) do={
      :set RxStepRate ($RxCurSet / 10);
      :set RxCurSet ($RxCurSet - $RxStepRate)}}

:if ($TxCurRate<$TxSwRate) do={
    :if ($TxCurSet<$TxMaxRate) do={
      :set TxCurSet ($TxCurSet + $TxStepRate);
      :set TxStepRate ($TxCurSet / 10);}
} else={
    :if ($TxCurSet>$TxMinRate) do={
      :set TxStepRate ($TxCurSet / 10);
      :set TxCurSet ($TxCurSet - $TxStepRate)}}
      
:if (($OldRxSet!=$RxCurSet)||($OldTxSet!=$TxCurSet)) do={
    :foreach ul in= do={
      :set tadd
      :if ([:len ] > 0) do={
      /queue simple set $tadd limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
                   max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
                   burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
                   burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
                   burst-time=30/30
      } else={
      /queue simple add name=$tadd dst-address=$tadd \
                   limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
                   max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
                   burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
                   burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
                   burst-time=30/30
      }
    }
}

:set RxCurRate 0
:set TxCurRate 0
:for i from=0 to=9 do={
    /interface monitor-traffic wan once do={:set CurRate $received-bits-per-second}
    :set RxCurRate ($RxCurRate + $CurRate)
    /interface monitor-traffic wan once do={:set CurRate $sent-bits-per-second}
    :set TxCurRate ($TxCurRate + $CurRate)
    :delay $Invs
}
:set RxCurRate ($RxCurRate / 10)
:set TxCurRate ($TxCurRate / 10)
}

dhp 发表于 2008-11-29 00:26:51

谢谢分享

ybb575 发表于 2008-12-4 08:17:51

不客气,但愿对大家有所帮助.

希希 发表于 2008-12-4 12:46:38

看不懂。但是学习了

hailong2004qq 发表于 2008-12-5 09:34:07

疑问,赐教。

/queue simple add name=$tadd dst-address=$tadd \
为什么是dst-address?我认为应该是target-addresses。
照你的脚本测试,好像没效果。改成target-addresses效果明显了。

dst-address,能解释一下吗?

gxlzz1 发表于 2008-12-5 10:40:40

相当的复杂!!!!学习下

ybb575 发表于 2008-12-8 11:37:24

原帖由 hailong2004qq 于 2008-12-5 09:34 发表 http://bbs.routerclub.com/images/common/back.gif
/queue simple add name=$tadd dst-address=$tadd \
为什么是dst-address?我认为应该是target-addresses。
照你的脚本测试,好像没效果。改成target-addresses效果明显了。

dst-address,能解释一下吗?

target-addresses是指数据包的目的地址;
dst-address才是需限速的地址;

Guanglight 发表于 2008-12-9 11:49:53

谢谢楼主共享

ybb575 发表于 2008-12-17 21:08:46

回复 1# 的帖子

#最新改版
#定义变量
#脚本停止开关
:global IsRun true
#循环检测WAN口流量间隔秒数
:global Invs 5;
#循环检测WAN口流量次数
:global ChkTimes 60
#当前下行总流量变量
:global RxCurRate 10
#当前限定的单IP下行带宽
:global RxCurSet 10000000
#单IP最大下行带宽
:global RxMaxRate 20000000
#单IP最小下行带宽
:global RxMinRate 1000000
#总下行流量上阀值
:global RxUpSwRate 60000000
#总下行流量下阀值
:global RxDwSwRate 30000000
#下行步进值
:local RxStepRate 10

#当前上行总流量变量
:global TxCurRate 10
#当前限定的单IP上行带宽
:global TxCurSet 1000000
#单IP最大上行带宽
:global TxMaxRate 1000000
#单IP最小上行带宽
:global TxMinRate 500000
#总上行流量上阀值
:global TxUpSwRate 50000000
#总上行流量下阀值
:global TxDwSwRate 30000000
#上行步进值
:local TxStepRate 10

#合法用户地址列表名称
:global ListName "userlist"
#临时存放地址列表项的变量
:local ul
#临时存放地址的变量
:local tadd
#临时的循环变量
:local i 0
#临时存放总流量的变量
:local CurRate 10
#临时存放旧下行限定
:local OldRxSet 0
#临时存放旧上行限定
:local OldTxSet 0

:while ($IsRun) do={

:set RxStepRate ($RxCurSet / 3);
:set TxStepRate ($TxCurSet / 3);

:if (($OldRxSet!=$RxCurSet)||($OldTxSet!=$TxCurSet)) do={
    :foreach ul in= do={
      :set tadd
      :if ([:len ] > 0) do={
      /queue simple set $tadd limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
                   max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
                   burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
                   burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
                   burst-time=30/30
      } else={
      /queue simple add name=$tadd dst-address=$tadd \
                   limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
                   max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
                   burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
                   burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
                   burst-time=30/30
      }
    }
}

:set RxCurRate 0
:set TxCurRate 0
:for i from=1 to=$ChkTimes do={
    /interface monitor-traffic wan once do={:set CurRate $received-bits-per-second}
    :set RxCurRate ($RxCurRate + $CurRate)
    /interface monitor-traffic wan once do={:set CurRate $sent-bits-per-second}
    :set TxCurRate ($TxCurRate + $CurRate)
    :delay $Invs
}
:set RxCurRate ($RxCurRate / $ChkTimes)
:set TxCurRate ($TxCurRate / $ChkTimes)

:set OldRxSet $RxCurSet
:set OldTxSet $TxCurSet

:if ($RxCurRate<$RxDwSwRate) do={:set RxCurSet ($RxCurSet + $RxStepRate);}
:if ($RxCurRate>$RxUpSwRate) do={:set RxCurSet ($RxCurSet - $RxStepRate);}
:if ($TxCurRate<$TxDwSwRate) do={:set TxCurSet ($TxCurSet + $TxStepRate);}
:if ($TxCurRate>$TxUpSwRate) do={:set TxCurSet ($TxCurSet - $TxStepRate);}

:if ($RxCurSet<$RxMinRate) do={:set RxCurSet $RxMinRate;}
:if ($RxCurSet>$RxMaxRate) do={:set RxCurSet $RxMaxRate;}
:if ($TxCurSet<$TxMinRate) do={:set TxCurSet $TxMinRate;}
:if ($TxCurSet>$TxMaxRate) do={:set TxCurSet $TxMaxRate;}
}

ybb575 发表于 2008-12-18 08:43:49

用法解释

脚本开始处定义的全局变量,需要修改时不用停止脚本,可用TELNET登录或WINBOX中命令行(New Terminal),使用:set 命令修改(如:重设WAN口流量检测间隔为10秒命令[:setInvs 10])

ybb575 发表于 2008-12-21 17:41:40

这个脚本应该是一个一个加IP,因为每个IP都要限速的,如你有十台电脑上网IP为:192。168。0。1-----192。168。0。10
应使用命令:ip fir addadd list=userlist address=192.168.0.1
ip fir addadd list=userlist address=192.168.0.2
ip fir addadd list=userlist address=192.168.0.3
........
ip fir addadd list=userlist address=192.168.0.10
依次添加每个地址
页: [1]
查看完整版本: ROS脚本编写的根据流量进行单IP限速脚本