V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GrayXu
V2EX  ›  宽带症候群

求路由系统推荐,需求是能实现某特定 IP 出口的所有流量都是低优先级 ,会被其他流量抢占带宽

  •  
  •   GrayXu · 2023-02-18 17:57:18 +08:00 · 2310 次点击
    这是一个创建于 648 天前的主题,其中的信息可能已经有所发展或是发生改变。
    其实就是类似 QoS 流控的需求,但我这里的场景有个不同的是,我的外网出口带宽是动态的,比如可能有时是 30mbps ,有时是 50mbps 或 100mbps 。

    试过 openwrt 、高恪、爱快(智能模式和手动模式)。但有效果的管控策略,都需要提前为带宽设置一个阈值,如爱快的智能流控模式下,我设置带宽阈值为 100mbps ,那在带宽 100mbps 时,抢占分配就工作的很好。但当带宽回落到 30mbps 之后,高优先级的数据包就无法正常抢占低优先级的数据包。

    求支招!
    14 条回复    2023-02-21 17:54:22 +08:00
    GrayXu
        1
    GrayXu  
    OP
       2023-02-18 18:01:52 +08:00
    问这个问题,也是觉得这个需求看起来对于路由系统来说似乎是并不难实现的 feature 。但确实没有找到能满足需求的方案。
    neroxps
        2
    neroxps  
       2023-02-18 18:43:41 +08:00 via iPhone   ❤️ 1
    你这个问题是路由如何感知准确的出口宽带。这是个悖论。
    如果路由定时测速来获得准确的出口宽带,那么肯定会影响网络体验。
    billlee
        4
    billlee  
       2023-02-18 20:30:26 +08:00 via Android   ❤️ 1
    这个就是很难实现。因为限速就是靠丢包实现的,QoS 需要把限速设置得比运营商提供的带宽小,自己主动选择丢哪些包,避免运营商随便丢。
    piku
        5
    piku  
       2023-02-18 20:33:33 +08:00 via Android
    没理解,根据来源 ip 给数据包打优先级不是路由器的基本功能吗?队列又不是限速,和带宽有什么关系?
    fortitudeZDY
        6
    fortitudeZDY  
       2023-02-18 21:04:00 +08:00 via Android   ❤️ 1
    试试 tc hfsc
    hfl1995
        7
    hfl1995  
       2023-02-18 23:46:49 +08:00
    不如这些 ip 分流到国外。
    datocp
        8
    datocp  
       2023-02-19 02:00:08 +08:00 via Android   ❤️ 1
    openwrt 下的 qos 有带有 prio 优先级的 htb ,还有一个高深莫测的 hfsc 。最终我认为便于理解的只有 htb 简单到设置 prio 0 ~ 9 ?优先级就可以了。去年发现 hfsc 没有优先级概念,不能有效的分配有限的带宽,后来上行又改回 htb 。hfsc 是一个太数学化的东西,我看了 N 遍文档依然不大会设置,特别是如何测定准确的延迟。hfsc 实现了精确的延迟设置,htb 实现的是模糊的流量和延迟对比关系。其实如果你能悟到 adsl 线路,当前带宽 60%实现低延迟,80%达到流量和延迟的平衡。于是会发现 htb 比 hfsc 简单,在 20m 光纤能实现,随着带宽到了 100m/1000m 更是量更足一切都能按预定的优先级限速跑,高优先级的流量也更有保障。
    然后这么多年玩下来,真正能用于学习的 qos 规则,我是从 tomato 开始学习的。其它的如果站在 tomato 的规则来看其它家的 qos 实现上多少有缺陷。即便大家用 htb 写得规则也是各异,性能也因为规则耗 cpu 性能导致各种呑吐异常。
    爱快是没有 ssh 的吧,那么想尝试用 shell 脚本去改这个应该是不可能的。
    使用 htb,现实情况会出现多并发的低优级流量和低并发的高优先级流量抢夺。从经验上判断,如果之前设定总带宽大,后来带宽变小了,此时低优先级的设置值可能能达到变化后的低带宽的 100%,才有可能出现迅雷淹没了高优先级的游戏数据。不然 prio 对于低并发的不同优先级流量应该还是能正常工作的。
    我觉得这对于会写 qos 规则+shell 应该是小菜一碟,至于下行的测试可以随便在凌晨。iptables 只允许,im.qq.com 下载。通过 iptables connbytes 是非常简单的事。
    life90
        9
    life90  
       2023-02-19 19:53:06 +08:00 via Android
    mikrotik ROS 可以实现你的需求。需要会写脚本。不难的
    ericbize
        10
    ericbize  
       2023-02-19 22:09:04 +08:00
    你可能研究一下这个功能能不能满足

    https://wiki.mikrotik.com/wiki/Manual:Queue

    HTB Properties
    parent (Name of parent simple queue, or none) : assigns this queue as a child queue for selected target {{{...}}}. Target queue can be HTB queue or any other previously created simple queue. In order for traffic to reach child queues, parent queues must capture all necessary traffic.
    priority (1..8) : Prioritize one child queue over other child queue. Does not work on parent queues (if queue has at least one child). One is the highest, eight is the lowest priority. Child queue with higher priority will have chance to reach its max-limit before child with lower priority. Priority have nothing to do with bursts.
    EvineDeng
        11
    EvineDeng  
       2023-02-20 14:14:36 +08:00   ❤️ 1
    如果你用爱快的话,这个脚本中可以通过其他 Linux 机器设置 crontab 来自动检测上行带宽:

    ```
    #!/usr/bin/env bash

    ## netlimit.sh 用法:
    ## ./netlimit.sh <限速值,单位 KB/s> 如 ./netlimit.sh 12800
    ## 脚本依赖于以下软件包,请自行安装好:curl openssl

    ## 限速上限,可以依靠其他脚本测得限速上限,然后以参数 1 传入
    upload_limits="$1"

    ## 爱快用户名
    ik_username=""

    ## 爱快密码
    ik_password=""

    ## 登陆爱快网址,形如: http://192.168.1.1:10000
    url_ikuai=""

    ## 这个 body 是设置“智能流控”模式的提交 body ,请先通过浏览器开发工具在爱快的“流控分流->智能流控”这里抓取你爱快系统的 body ,修改为你的 parent/interface/download/id 等
    data_raw="{\"func_name\":\"layer7_intell\",\"action\":\"set_iface\",\"param\":{\"parent\":\"wan1\",\"interface\":\"wan1\",\"upload\":\"$upload_limits\",\"download\":128000,\"qos_switch\":1,\"comment\":\"\",\"id\":39358639}}"

    ## 登陆
    ik_login() {
    local ik_username="$1"
    local ik_password="$2"
    local passwd=$(echo -n "$ik_password" | openssl md5 -hex | awk '{print $2}')
    local pass=$(echo -n "salt_11${ik_password}" | base64)
    local cookie=$(curl $url_ikuai/Action/login -Ssi --data "{\"username\":\"$ik_username\",\"passwd\":\"$passwd\",\"pass\":\"$pass\",\"remember_password\":\"true\"}" | awk '/Set-Cookie:/{print $2}' 2>/dev/null)
    [[ $cookie ]] && echo $cookie
    }

    ## 获取 cookie
    login_cookie=$(ik_login "$ik_username" "$ik_password")

    ## 设置限速
    if [[ $login_cookie ]]; then
    echo -n "设置爱快限速为 $upload_limits KB/s ,结果:"
    curl $url_ikuai/Action/call --header "Cookie: $login_cookie" --data-raw "$data_raw"
    else
    echo "未能成功登陆爱快"
    fi


    ```
    EvineDeng
        12
    EvineDeng  
       2023-02-20 14:15:56 +08:00   ❤️ 1
    说错了,通过其他 Linux 机器设置 crontab 来自动检测上行带宽后设置爱快的智能模式的宽带上限。如何检测宽带上限你可以用其他现成的工具。
    GrayXu
        13
    GrayXu  
    OP
       2023-02-21 17:52:56 +08:00
    @piku 我一开始也是这么认为的,但看大家讲的,集中的问题应该就是路由层没法被动探测当前丢包情况,所以路由没法没信息地做主动管控。
    GrayXu
        14
    GrayXu  
    OP
       2023-02-21 17:54:22 +08:00
    @EvineDeng 感谢!最后选择了这个方法!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3991 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:21 · PVG 18:21 · LAX 02:21 · JFK 05:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.