Wondershaper网络限制脚本源码分析一(下载速度限制篇)

举报
笨笨小乌龟 发表于 2024/07/11 15:25:49 2024/07/11
【摘要】 ​ 目录Wondershaper 的核心特点包括:技术原理简述:源码分析:流程图:代码流程:虚拟网卡:Wondershaper 是一个简单的 Linux 命令行工具,用于自动管理和控制网络接口的上行和下行带宽,旨在为用户提供稳定的网络体验,尤其是在网络拥塞的情况下。它通过 Traffic Control (tc) 工具集实现这一功能,但与直接使用 tc 相比,Wondersbaper 提供了...

 目录

Wondershaper 的核心特点包括:

技术原理简述:

源码分析:

流程图:

代码流程:

虚拟网卡:


Wondershaper 是一个简单的 Linux 命令行工具,用于自动管理和控制网络接口的上行和下行带宽,旨在为用户提供稳定的网络体验,尤其是在网络拥塞的情况下。它通过 Traffic Control (tc) 工具集实现这一功能,但与直接使用 tc 相比,Wondersbaper 提供了更简洁易用的界面,特别适合没有深入网络管理知识的用户,但它其实就是由一个bash脚本组成,当然里面的思想非常精华。

当初我也是头痛不已,最终发现wondershaper居然可以限制下载速度,且用的居然也是tc!让我颇为震惊,但是苦于wondershaper并不支持限速特定的Ip,所以迫不得已只能去解析他的源码。

Wondershaper 的核心特点包括:

  1. 简单配置:用户只需要指定接口名称、上行速度和下行速度即可启动带宽整形,无需了解复杂的 tc 命令和配置。

  2. 保证交互性:它优先保证网络的交互性,比如网页浏览和SSH连接等,即使在大量下载或上传时也能保持良好的响应性。这是通过为交互式流量预留一部分带宽实现的。

  3. 易于安装和使用:Wondershaper 在许多Linux发行版的包管理器中都有,安装后只需几条命令就能开始工作。

  4. 透明运作:一旦设置好,Wondershaper 会在后台自动管理带宽,用户无需干预。

技术原理简述:

Wondershaper 主要通过以下方式工作:

  • HTB (Hierarchical Token Bucket):使用htb调度器为网络接口创建一个分层的令牌桶队列,实现带宽限制和优先级划分。
  • SFQ (Stochastic Fairness Queueing):在某些配置中,它可能还会使用SFQ(随机公平队列)来为不同流提供公平的带宽分配,确保网络交互性。
  • 预留带宽:为保证交互性,Wondershaper会为“交互”流量预留一部分带宽,这部分流量通常优先于其他流量传输,确保即使在带宽紧张时,用户界面操作也能快速响应。

对于tc来讲,正常我们限速网络的流程应该是创建根队列规则,创建分类,创建过滤器,匹配分类,完成限制。当然传统上tc的通病我相信用的朋友们也知道那就是限制发包但是不限制收包。这对我们去限制下载速度就很头疼了,就相当于我只管我自己发出去的,不管向自己发来过的包。

编辑

源码分析:

USPEED="88920"; 限制速率
IFB="ifb0"; 虚拟网卡名
infr="ens33" 真实网卡名
IP="77.77.77.100" 要限制的ip

if [[ -n "$DSPEED" ]]; then
            # 创建虚拟网卡并启用
            modprobe ifb numifbs=1;
            ip link set dev "$IFB" up;

            tc qdisc add dev "$intf" handle ffff: ingress
            tc filter add dev "$intf" parent ffff: protocol ip u32 match u32 0 0 \
                action mirred egress redirect dev "$IFB";

            tc qdisc add dev "$IFB" root handle 2: htb;
            tc class add dev "$IFB" parent 2: classid 2:1 htb rate "${DSPEED}kbit";

            tc filter add dev "$IFB" protocol ip parent 2: prio 1 u32 \
                match ip src "$IP" flowid 2:1;
fi;

流程图:

编辑

代码流程:

  1. 开始: 检查变量 DSPEED 是否设置。
  2. 检查 DSPEED: 如果设置了 DSPEED,则创建并启用虚拟网卡。
  3. 创建并启用虚拟网卡:(精华所在)
    • 加载 ifb 模块。
    • 启用虚拟网卡 IFB
  4. 添加入口队列规则: 在真实网卡 intf 上添加入口队列规则。
  5. 添加过滤器: 在真实网卡 intf 上添加过滤器,将流量重定向到虚拟网卡 IFB
  6. 添加根队列规则: 在虚拟网卡 IFB 上添加根队列规则。
  7. 添加类: 在虚拟网卡 IFB 上添加类,设置速率为 DSPEED
  8. 在 IFB 上添加过滤器: 最后在虚拟网卡 IFB 上添加过滤器。

虚拟网卡:

  • modprobe 是一个用于动态加载内核模块的命令。
  • ifb 是要加载的内核模块名称,代表Intermediate Functional Block。
  • numifbs=1 是向 modprobe 传递的参数,指定了要创建的 IFB 设备的数量,在这个例子中创建了1个IFB设备。

IFB 虚拟网卡通常不直接用于终端通信,而是作为网络数据包的一个中转站,使得管理员可以在这里应用服务质量(QoS)策略,比如限制或优先处理特定类型的网络流量,而不会干扰主网络接口的数据转发流程。这对于实现网络流量整形、带宽限制或者优化网络应用的体验非常有帮助。

上方就是wondershaper最核心的限制Ip的网络下载速度的精华。




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。