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

Ledo
2019-02-21 / 18 评论 / 19,897 阅读 / 正在检测是否收录...

i> 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定时执行。
0

评论 (18)

取消
  1. 头像
    音控室
    Windows 7 · Google Chrome

    |´・ω・)ノ ̄﹃ ̄

    回复
  2. 头像
    OK’Blog
    Windows 10 · Google Chrome

    ヾ(≧∇≦*)ゝ

    回复
    1. 头像
      刘大喵 作者
      Windows 10 · FireFox
      @ OK’Blog

      ~.~

      回复
  3. 头像
    有今生丶没来世
    Windows 10 · Google Chrome

    ROS大法好呀

    回复
  4. 头像
    子午物联网
    Windows 7 · FireFox

    太专业,看不懂

    回复
  5. 头像
    Mr.Chou
    Windows 7 · Google Chrome

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

    回复
  6. 头像
    左岸
    MacOS · Google Chrome

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

    回复
    1. 头像
      刘大喵 作者
      Windows 10 · FireFox
      @ 左岸

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

      回复
      1. 头像
        左岸
        Android Pie · Google Chrome
        @ 刘大喵

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

        回复
  7. 头像
    夏天烤洋芋
    Windows 10 · Google Chrome

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

    回复
    1. 头像
      刘大喵 作者
      Android Oreo · Google Chrome
      @ 夏天烤洋芋

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

      回复
  8. 头像
    凉月
    Windows 10 · FireFox

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

    回复
    1. 头像
      刘大喵 作者
      Windows 10 · MicroSoft Edge
      @ 凉月

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

      回复
  9. 头像
    Mark
    Windows 10 · Google Chrome

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

    回复
    1. 头像
      刘大喵 作者
      Windows 10 · MicroSoft Edge
      @ Mark

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

      回复
      1. 头像
        Mark
        Windows 10 · Google Chrome
        @ 刘大喵

        一直用

        回复
  10. 头像
    Sam.Z
    Windows 10 · Google Chrome

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

    回复
    1. 头像
      刘大喵 作者
      Windows 10 · MicroSoft Edge
      @ Sam.Z

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

      回复