ROS软路由论坛 ROSABC.com 网络方案网络工程交流

 找回密码
 会员注册

QQ登录

只需一步,快速开始

查看: 3350|回复: 1

[原创] [分享经验]小小网管分享一个ROS动态限速方案.(2)

[复制链接]
发表于 2017-8-4 12:21:11 | 显示全部楼层 |阅读模式

马上注册成为ROSABC会员,随时发帖回复。

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

x
贴吧也发布了此方案。


当网管也有几年的经验了,现在网吧都关了,我也成了无业游民了。没工作做了之后自己买了一个ROS rb750gr3。给家里用,家里的手机电脑等数量还真不少,所以根据学到的知识写了一个动态限速方案,在这里分享给大家。(仅作参考)



声明:该脚本使用ros 6.36.1环境下。如使用在其它版本,脚本语法可能有些不同。脚本若有错别字请自行更正或修正。我没有检查。设备是rb750gr3.


前排提示,所有代码都可以粘贴到new terminal执行




1)首先,需要将内网中,在线的主机IP,都保存到/ip firewall address-lists里面,下面会有用到,timeout就设为10分钟吧。

/ip firewall mangle add chain=forward src-address="192.168.88.0/24" in-interface=Lan action=add-src-to-address-list address-list=onlineAddress address-list-timeout=00:10:00




2)再增加同一网段的所有IP的标记,in-interface src-address和out-interface dst-address分别设置。所有标记都启用,并且关掉passthrough。

:for item from=1 to=254 do={/ip firewall mangle;add chain=forward src-address="192.168.88.$item" in-interface=Lan action=mark-packet new-packet-mark="192.168.88.$item" passthrough=no comment="192.168.88.$item";add chain=forward dst-address="192.168.88.$item" out-interface=Lan action=mark-packet new-packet-mark="_192.168.88.$item" passthrough=no comment="_192.168.88.$item";}




3)然后再在queue tree里面,增加同一网段所有IP的queue包含up和down,一共254*2+2个队列需要增加。每一queue的包标记使用对应的包名称。 增加好后除了down和up这两个主队列,其它都先禁用。主队列使用paren=global,max-limit=你的最大带宽。所有子队列的max-limit=最大带宽*0.8。

/queue tree;add name=down parent=global max-limit=100000000;add name=up parent=global max-limit=2000000;:for item from=1 to=254 do={add name="_192.168.88.$item" parent=down max-limit=80000000 packet-mark="_192.168.88.$item" disable=yes;add name="192.168.88.$item" parent=up max-limit=1600000 packet-mark="192.168.88.$item" disable=yes}




4)最后一部分就是限速部分,需要system scripts和scheduler来完成。计划写两个脚本,其中一个总开关检查功能。先介绍总开关功能,总开关将声明一个全局变量,用来存放上一次执行时的在线主机IP列表。总开关每三十秒运行一次(scheduler定时执行),每次运行都获取一次在线主机IP列表,将这列表与全局变量保存的IP列表对比,判断新旧在线主机IP列表是否有变化,是否有下线的主机IP(若有下线的,直接执行disable=yes关了对应的queue),若IP列表有变化,运行另外一个执行脚本,剩余的事都交给另外一个脚本了。 介绍第二个脚本功能,第二个脚本功能获取当前在线主机IP的数量,用来计算一会要使用到的limit值。建议limit=最大带宽*0.7/当前在线主机数量。

事实上脚本的实际写法要比上文的介绍要复杂一些,多了一些判断什么的,但是全介绍出来的话太累人了,自行看脚本吧。

代码如下:
/system script;add name=onlineAddressChack source=":global onlineAddressBak;:local onlineAddressObj [/ip firewall address-list find list=onlineAddress];:local onlineAddress \"\";:foreach item in=\$onlineAddressObj do={:set onlineAddress (\$onlineAddress . \",\" . [/ip firewall address-list get \$item address]);};:set onlineAddress [:toarray \$onlineAddress];:local Tswitch 0;:if ([:typeof \$onlineAddressBak] = \"array\") do={:if (\$onlineAddress != \$onlineAddressBak) do={:set Tswitch 1;:foreach item in=\$onlineAddressBak do={:local Sswitch 1;:foreach item2 in=\$onlineAddress do={:if (\$item = \$item2) do={:set Sswitch 0;};};:if (\$Sswitch = 1) do={:local tempAddress [:tostr \$item];/queue tree set [find name=\$tempAddress] disable=yes;/queue tree set [find name=\"_\$tempAddress\"] disable=yes;:set Tswitch 1;};};};} else={:set Tswitch 1;};:if (\$Tswitch = 1) do={:set onlineAddressBak \$onlineAddress;/system script run [find name=onlineAddressChange];};";add name=onlineAddressChange source=":global onlineAddressBak;:local numOfOnlineAddress [:len \$onlineAddressBak];:local limitUp (1400000 / \$numOfOnlineAddress);:local limitDown (70000000 / \$numOfOnlineAddress);:foreach item in=\$onlineAddressBak do={/queue tree set [find name=\$item] dis=no limit-at=\$limitUp;:delay 500ms;/queue tree set [find name=\"_\$item\"] dis=no limit-at=\$limitDown;:delay 500ms;}";






第二个脚本中,每执行一次queue操作,后面都有一个delay 500ms。 若各位在线设备大于30台,建议此延时值改小一点,例如400ms? 最低不要低于100ms,除非你CPU真的挺强的。(我的设备测试得到运行脚本时CPU占用10%左右,若此时宽带满载的话,那CPU就占用很高了)




此方案也可以修改为 网页优先,游戏优先等。 做法就是改变queue tree结构,和改变
mangle的标记方式。






发表于 2018-12-9 10:08:26 | 显示全部楼层
感谢,学习中
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

不良信息举报Q:2000617

软路由

不良信息举报Q:2000617|Archiver|ROS软路由论坛 ROSABC.com 网络方案网络工程交流

GMT+8, 2024-5-19 16:46 , Processed in 0.102303 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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