本帖最后由 version666 于 2024-8-5 15:52 编辑
=================================================================================
注:如果大家图片参数看不清楚,可以关注我的公众号进行查看,如果有遇到其他Routeros/Openwrt的技术问题,本人可有偿解决问题!
=================================================================================
Routeros/Openwrt技术交流群:414678725
==============================================================================
公众号二维码:
==============================================================================
==============================================================================
- RouterOS 中一个脚本配置构成由控制命令和表达式(ICE - internal console expression 内部控制台表达式)。
- RouterOS 操作命令,例如:/ip firewall filter add chain=forward protocol=gre action=drop 这个是描述在防火墙中过滤gre协议的操作,即通过“/”来达到命令执行的目的。在脚本ICE表达式前缀需要用 “ : ”并能在任何目录路径下操作。
- 一个事件(event)用来触发脚本执行,在 RouterOS 下包括:System Scheduler, Traffic Monitoring Tool,Netwatch Tool 。
功能包需求: system 操作路径: /system script
脚本编写需要进入 script 目录下,在 script 菜单中我们可以定义多条脚本规则,写完脚本后点击Apply保存,然后通过Run Script 命令运行当前写的脚本,在 Run Count 中会纪录脚本运行的总次数:
- :for e from 1 to 254 do={ /queue simple add target=("192.168.88." . $e) max-limit=5000000/5000000 }
复制代码
- :for x from 1 to 254 do={ /queue simple add target=("172.20.3." . $x) max-limit=30000000/8000000 packet-marks=QOS-D,QOS-U }
复制代码
注:运行脚本后会针对匹配到专线专包进行限速,不会影响其他线路数据包的传输,一般在特殊环境线路分流时常用此种方法进行限速,下图运行脚本后可以看到是针对专包进行限速。
下图中的配置就是针对专线专包进行QOS限速,In.internet与Out.internet分别选择你要限速的接口即可,需要在标记器中建立两条标记,分别对应上行和下行。
prerouting对应In.internet,postrouting对应Out.internet,然后分别对此进行包标记,标记名称自己随意,建议简洁明了,一目了然,不要用特殊字符,防止转译时出现问题。
当然此种方法还是不够智能化,毕竟还要人为手动点击运行脚本,实在是比较呆,下面给大家传授一种自动化QOS,用下面代码或者图形化页面操作都一样。
- /system scheduler add interval=24h name="QOS_10M" start-time=9:00:00 on-event=start_QOS10
复制代码
进入脚本菜单,或者命令行直接用代码也是一样的,新建脚本命令,脚本名称要与上面计划任务中调用的名称要一致。
- /system script add name="start_QOS10" source={:for x from 1 to 254 do={ /queue simple add target=("172.20.3." . $x) max-limit=10000000/10000000 packet-marks=QOS-D,QOS-U } }
- #进入脚本菜单,添加名称为start_QOS10,代码解释参考前面的,不多废话。
复制代码
等待设定的时间点到达,QOS限速脚本会自动执行,效果如下图所示,很方便。
当然,除此之外,还可以根据时间段进行限速,限速之前,需要先清除之前的限速命令,防止多条队列重合,当然也可以写个判断语句进行自动化处理。
- /queue simple remove [find type=queue9527 ]
- #进入queue菜单,找到类型为queue类型,找到后删除类型为queue(简单队列)9527条,根据自己的实际情况写数字
复制代码首先添加两个计划任务,分别设定时间段,以24h为一个循环每天定时执行时间段限速脚本,图形化配置如图,命令行代码我已经写好。
- /system scheduler add interval=24h name="QOS_10M" start-time=9:00:00 on-event=start_QOS10
- 早上9点执行start_QOS10这个脚本,上下行10M,周期为24h,计划任务名字可随意,脚本名称必须要一致!
- /system scheduler add interval=24h name="QOS_20M" start-time=18:00:00 on-event=start_QOS20
- 下午6点执行start_QOS20这个脚本,上下行限速20M,周期为24h,计划任务名字可随意,脚本名称必须要一致!
复制代码再添加两个限速脚本,分别为上下行10M与20M,每天循环执行限速脚本,图形化配置如图,命令行代码我已经写好,可直接复制使用。
- :if ([/queue simple remove [find type=queue9527 ]]<0) do={ :for x from 1 to 254 do={ /queue simple add target=("172.20.3." . $x) max-limit=10000000/10000000 packet-marks=QOS-D,QOS-U } }
- #if条件语句. 如果一个逻辑判断为真,这时执行do分程序块中的命令,否则选择 else 分程序块中的执行,此处直接用if和do就完全够用了,除非有特殊情况;此处我写的代码逻辑很简单,首先进入queue菜单,找到类型为queue的所有简单队列,然后删除类型为queue(简单队列)9527条,删除后总数肯定小于0,然后代码会执行do分程序中的程序;分程序中只需要重新执行一次脚本就可以了。
复制代码最终实践效果达到预期的目标,打完收工,看不清楚图片的,可以关注我的微信公众号,定期分享Routeros和Openwrt、Python的硬核技术!
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|