Wondershaper 是一个简单的 Linux 命令行工具,用于自动管理和控制网络接口的上行和下行带宽,旨在为用户提供稳定的网络体验,尤其是在网络拥塞的情况下。它通过 Traffic Control (tc) 工具集实现这一功能,但与直接使用 tc 相比,Wondersbaper 提供了更简洁易用的界面,特别适合没有深入网络管理知识的用户,但它其实就是由一个bash脚本组成,当然里面的思想非常精华。
当初我也是头痛不已,最终发现wondershaper居然可以限制下载速度,且用的居然也是tc!让我颇为震惊,但是苦于wondershaper并不支持限速特定的Ip,所以迫不得已只能去解析他的源码。
Wondershaper 的核心特点包括:
-
简单配置:用户只需要指定接口名称、上行速度和下行速度即可启动带宽整形,无需了解复杂的 tc 命令和配置。
-
保证交互性:它优先保证网络的交互性,比如网页浏览和SSH连接等,即使在大量下载或上传时也能保持良好的响应性。这是通过为交互式流量预留一部分带宽实现的。
-
易于安装和使用:Wondershaper 在许多Linux发行版的包管理器中都有,安装后只需几条命令就能开始工作。
-
透明运作:一旦设置好,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;
流程图:
代码流程:
- 开始: 检查变量
DSPEED
是否设置。 - 检查 DSPEED: 如果设置了
DSPEED
,则创建并启用虚拟网卡。 - 创建并启用虚拟网卡:(精华所在)
- 加载
ifb
模块。 - 启用虚拟网卡
IFB
。
- 加载
- 添加入口队列规则: 在真实网卡
intf
上添加入口队列规则。 - 添加过滤器: 在真实网卡
intf
上添加过滤器,将流量重定向到虚拟网卡IFB
。 - 添加根队列规则: 在虚拟网卡
IFB
上添加根队列规则。 - 添加类: 在虚拟网卡
IFB
上添加类,设置速率为DSPEED
。 - 在 IFB 上添加过滤器: 最后在虚拟网卡
IFB
上添加过滤器。
虚拟网卡:
modprobe
是一个用于动态加载内核模块的命令。ifb
是要加载的内核模块名称,代表Intermediate Functional Block。numifbs=1
是向modprobe
传递的参数,指定了要创建的 IFB 设备的数量,在这个例子中创建了1个IFB设备。
IFB 虚拟网卡通常不直接用于终端通信,而是作为网络数据包的一个中转站,使得管理员可以在这里应用服务质量(QoS)策略,比如限制或优先处理特定类型的网络流量,而不会干扰主网络接口的数据转发流程。这对于实现网络流量整形、带宽限制或者优化网络应用的体验非常有帮助。
上方就是wondershaper最核心的限制Ip的网络下载速度的精华。