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

2023-02-18 17:57:18 +08:00
 GrayXu
其实就是类似 QoS 流控的需求,但我这里的场景有个不同的是,我的外网出口带宽是动态的,比如可能有时是 30mbps ,有时是 50mbps 或 100mbps 。

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

求支招!
2109 次点击
所在节点    宽带症候群
14 条回复
GrayXu
2023-02-18 18:01:52 +08:00
问这个问题,也是觉得这个需求看起来对于路由系统来说似乎是并不难实现的 feature 。但确实没有找到能满足需求的方案。
neroxps
2023-02-18 18:43:41 +08:00
你这个问题是路由如何感知准确的出口宽带。这是个悖论。
如果路由定时测速来获得准确的出口宽带,那么肯定会影响网络体验。
1423
2023-02-18 18:56:42 +08:00
billlee
2023-02-18 20:30:26 +08:00
这个就是很难实现。因为限速就是靠丢包实现的,QoS 需要把限速设置得比运营商提供的带宽小,自己主动选择丢哪些包,避免运营商随便丢。
piku
2023-02-18 20:33:33 +08:00
没理解,根据来源 ip 给数据包打优先级不是路由器的基本功能吗?队列又不是限速,和带宽有什么关系?
fortitudeZDY
2023-02-18 21:04:00 +08:00
试试 tc hfsc
hfl1995
2023-02-18 23:46:49 +08:00
不如这些 ip 分流到国外。
datocp
2023-02-19 02:00:08 +08:00
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
2023-02-19 19:53:06 +08:00
mikrotik ROS 可以实现你的需求。需要会写脚本。不难的
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
2023-02-20 14:14:36 +08:00
如果你用爱快的话,这个脚本中可以通过其他 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
2023-02-20 14:15:56 +08:00
说错了,通过其他 Linux 机器设置 crontab 来自动检测上行带宽后设置爱快的智能模式的宽带上限。如何检测宽带上限你可以用其他现成的工具。
GrayXu
2023-02-21 17:52:56 +08:00
@piku 我一开始也是这么认为的,但看大家讲的,集中的问题应该就是路由层没法被动探测当前丢包情况,所以路由没法没信息地做主动管控。
GrayXu
2023-02-21 17:54:22 +08:00
@EvineDeng 感谢!最后选择了这个方法!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/917197

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX