刘大喵

Mikrotik RouterOS家用动态限速方案(小型企业也适用)
RouterOS是一款非常灵活的路由器,功能上也可以代替运营商bras,大喵在2012年使用到至今;家里的手机电...
扫描右侧二维码阅读全文
21
2019/02

Mikrotik RouterOS家用动态限速方案(小型企业也适用)

RouterOS是一款非常灵活的路由器,功能上也可以代替运营商bras,大喵在2012年使用到至今;家里的手机电脑越来越多,这个家用动态限速方案比什么限速小包优先效果都好。

mikrotik routeros家用动态限速方案

第一步

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

第二步

  • 再增加同一网段的所有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";}

第三步

  • 然后再在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}

第四步

  • 最后一部分就是限速部分,需要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真的挺强的。
  • 最后记得手动添加scheduler定时执行。
If you think my article is useful to you, please feel free to appreciate

Leave a Comment

17 comments

  1. OK’Blog     Windows 10 /    Google Chrome

    ヾ(≧∇≦*)ゝ

    1. 刘大喵     Windows 10 /    FireFox
  2. 有今生丶没来世     Windows 10 /    Google Chrome

    ROS大法好呀

  3. 子午物联网     Windows 7 /    FireFox

    太专业,看不懂

  4. Mr.Chou     Windows 7 /    Google Chrome

    家用的100M移动光纤啥也没设置,都是全速大家用感觉不出来响应慢..不像以前只有几M的小水管。
    没折腾过你这玩意..

  5. 左岸     MacOS /    Google Chrome

    我在用lede+aikuai,RouterOS看过教程功能也很强大,不过不打算折腾了,这两个对于我来说够用了

    1. 刘大喵     Windows 10 /    FireFox
      @左岸

      感觉 lede或者爱快其中一个就够了~同城两个组合的都是esxi方案吧?

      1. 左岸     Android Pie /    Google Chrome
        @刘大喵

        协同工作,一个主路一个副路,另外一开始我也用的esxi几个月前转到ProxmoxVE了

  6. 夏天烤洋芋     Windows 10 /    Google Chrome

    ( ,,´・ω・)ノ"(´っω・`。) 小米路由器里,有类似的智能调速功能。我开启,然后莫名其妙的掉线?我以为是这样的。
    然后我关闭了,发现依然会莫名其妙的掉线。
    都已经换了无数个路由器了。

    1. 刘大喵     Android Oreo /    Google Chrome
      @夏天烤洋芋

      表示没用过小米୧(๑•̀⌄•́๑)૭ 不过功能应该都是大同小异

  7. 凉月     Windows 10 /    FireFox

    我现在用的是 lede 改的 openwrt,感觉也还行,不知道RouterOS用起来怎么样

    1. 刘大喵     Windows 10 /    MicroSoft Edge
      @凉月

      性能、占用资源来说应该大体差不多吧,相比 来说ros功能比较多 维多利亚有专业的团队,op的话毕竟是开源,插件也多可玩性高 国内我只知道著名的大佬L大

  8. Mark     Windows 10 /    Google Chrome

    难得见到博客主也用RouterOS,支持一下。

    1. 刘大喵     Windows 10 /    MicroSoft Edge
      @Mark

      莫非大佬也使用ros?博客中实在难得遇见。

      1. Mark     Windows 10 /    Google Chrome
        @刘大喵

        一直用

  9. Sam.Z     Windows 10 /    Google Chrome

    大(>^ω^<)喵,是RouterOS吧,软路由,自由度高。

    1. 刘大喵     Windows 10 /    MicroSoft Edge
      @Sam.Z

      对,写漏了 平时都说ros的,有硬有软。