找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7283|回复: 10

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

[复制链接]
发表于 2008-11-28 15:42:44 | 显示全部楼层 |阅读模式

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

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

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

#脚本在全局变量“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=[/ip firewall address-list find list=userlist] do={
      :set tadd [/ip firewall address-list get $ul address]
      :if ([:len [/queue simple find dst-address=$tadd]] > 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)
}
routeros
发表于 2008-11-29 00:26:51 | 显示全部楼层
谢谢分享
routeros
回复

使用道具 举报

 楼主| 发表于 2008-12-4 08:17:51 | 显示全部楼层
不客气,但愿对大家有所帮助.
routeros
回复

使用道具 举报

发表于 2008-12-4 12:46:38 | 显示全部楼层
看不懂。但是学习了
routeros
回复

使用道具 举报

发表于 2008-12-5 09:34:07 | 显示全部楼层

疑问,赐教。

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

dst-address,能解释一下吗?
routeros
回复

使用道具 举报

发表于 2008-12-5 10:40:40 | 显示全部楼层
相当的复杂!!!!学习下
routeros
回复

使用道具 举报

 楼主| 发表于 2008-12-8 11:37:24 | 显示全部楼层
原帖由 hailong2004qq 于 2008-12-5 09:34 发表
/queue simple add name=$tadd dst-address=$tadd \
为什么是dst-address?我认为应该是target-addresses。
照你的脚本测试,好像没效果。改成target-addresses效果明显了。

dst-address,能解释一下吗?


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

使用道具 举报

发表于 2008-12-9 11:49:53 | 显示全部楼层
谢谢楼主共享
routeros
回复

使用道具 举报

 楼主| 发表于 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=[/ip firewall address-list find list=userlist] do={
      :set tadd  [/ip firewall address-list get $ul address]
      :if ([:len [/queue simple find dst-address=$tadd]] > 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;}
}
routeros
回复

使用道具 举报

 楼主| 发表于 2008-12-18 08:43:49 | 显示全部楼层

用法解释

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

使用道具 举报

 楼主| 发表于 2008-12-21 17:41:40 | 显示全部楼层
这个脚本应该是一个一个加IP,因为每个IP都要限速的,如你有十台电脑上网IP为:192。168。0。1-----192。168。0。10
应使用命令:ip fir add  add list=userlist address=192.168.0.1
ip fir add  add list=userlist address=192.168.0.2
ip fir add  add list=userlist address=192.168.0.3
........
ip fir add  add list=userlist address=192.168.0.10
依次添加每个地址
routeros
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 09:52 , Processed in 0.061848 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

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