[网络] [iproute2] tc: Linux 带宽限制(Token Bucket Filter 和 HTB)使用指南

news/2025/10/21 23:14:10/文章来源:https://www.cnblogs.com/migrator/p/18835696
[网络] [iproute2] tc: Linux 带宽限制(Token Bucket Filter 和 HTB)使用指南

参考:

  • iproute2: 网络管理利器
  • iproute2和流量控制(ip和tc工具)---iproute2/ip/tc/qdisc实现Linux下的QoS控制
  • DeepSeek
  • Grok

01 背景

1.1 功能介绍

在 Linux 系统中使用 tc(Traffic Control)命令结合 TBF(Token Bucket Filter)和 HTB(Hierarchical Token Bucket)模块限制网络带宽,包括上传、下载、特定 IP 和特定端口的带宽控制。所有示例以网络接口 eth0 为例,适用于测试网络性能或模拟特定网络环境。

1.2 前提

  • 权限:所有 tc 命令需以 root 权限执行(使用 sudo)。
  • 工具:确保安装 iproute2 包(包含 tc 命令)。
    安装步骤请参考: [网络] [iproute2] tc命令:Linux网络异常模拟(Network Emulation, netem)指南 的 第二章:前提条件

02 限制上传带宽(使用 TBF)

命令:

sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

功能
限制 eth0 的出口带宽(上传)为 1Mbps,允许 32Kb 的瞬时突发流量,最大排队延迟 400ms。
适用于需要平滑流量的场景(如限制上传带宽),同时允许短暂突发。

参数说明

  • tbf:令牌桶过滤器(Token Bucket Filter),通过令牌控制数据发送速率。系统以固定速率生成令牌,每个令牌允许发送一定数据,未拿到令牌的数据包会被延迟或丢弃。
  • rate 1mbit:长期平均带宽限制为 1Mbps。
  • burst 32kbit:令牌桶最大容量,允许瞬时突发流量至 32Kb。
  • latency 400ms:数据包最大排队延迟,超时则丢弃。较小的 latency 减少延迟但可能增加丢包,较大的值增加延迟但提高吞吐量。

验证

# 查看规则
tc qdisc show dev eth0
# 测试上传带宽(需外部服务器运行 iperf)
iperf -c <server_ip>

清除规则

sudo tc qdisc del dev eth0 root

03 限制下载带宽(使用 IFB 模块)

命令

# 加载 ifb 模块
sudo modprobe ifb
# 启动虚拟网卡 ifb0
sudo ip link set dev ifb0 up
# 将 eth0 的入口流量重定向到 ifb0
sudo tc qdisc add dev eth0 handle ffff: ingress
sudo tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
# 限制 ifb0 的出口带宽(即 eth0 的下载带宽)
sudo tc qdisc add dev ifb0 root tbf rate 1mbit burst 20kbit latency 500ms

功能:
通过 IFB(Intermediate Functional Block)虚拟网卡限制 eth0 的入口带宽(下载)为 1Mbps,允许 20Kb 突发流量,最大延迟 500ms。
适用于测试网络拥塞或模拟低速下载环境。

参数说明

  • ifb:虚拟网卡模块,将入口流量重定向为出口流量以便限制。
  • ingress:捕获 eth0 的入口流量。
  • u32 match u32 0 0:匹配所有 IP 流量。
  • action mirred egress redirect dev ifb0:将入口流量重定向到 ifb0 的出口。
  • tbf rate 1mbit burst 20kbit latency 500ms:在 ifb0 上限制出口带宽为 1Mbps。

验证

# 检查 ifb 模块
lsmod | grep ifb
# 查看规则
tc qdisc show dev eth0
tc qdisc show dev ifb0
# 测试下载带宽
iperf -c <server_ip>

清除规则:

sudo tc qdisc del dev eth0 ingress
sudo tc qdisc del dev ifb0 root
sudo ip link set dev ifb0 down

注意

  1. tc 无法直接限制入口流量,需通过 IFB 将下载流量转为出口流量处理。
  2. 确保 ifb 模块已加载(modprobe ifb)。
  3. 效果为模拟限速(可能引入延迟或丢包),而非物理层带宽控制。

04 限制特定 IP 带宽(使用 HTB)

命令

# 创建 HTB 根队列
sudo tc qdisc add dev eth0 root handle 1: htb default 10
# 添加父类(总带宽 10Mbps)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
# 添加子类(限制目标 IP 带宽为 2Mbps,可借用至 3Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit ceil 3mbit
# 添加过滤器(匹配目标 IP 192.168.1.100)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10

功能
使用 HTB(Hierarchical Token Bucket)限制 eth0 上目标 IP(192.168.1.100)的出口带宽为 2Mbps,允许借用至 3Mbps。
适用于对特定设备或 IP 的流量进行精细控制。

参数说明

  • htb:分层令牌桶算法,支持分层带宽分配。
  • handle 1::根队列标识符(主句柄为 1)。
  • default 10:未匹配规则的流量默认进入子类 1:10。
  • classid 1:1:父类标识符,限制总带宽为 10Mbps。
  • classid 1:10:子类标识符,限制目标 IP 带宽。
  • rate 2mbit:保证带宽为 2Mbps。
  • ceil 3mbit:允许借用带宽至 3Mbps(当网络空闲时)。
  • u32 match ip dst 192.168.1.100:匹配目标 IP 为 192.168.1.100 的流量。
  • flowid 1:10:将匹配流量导向子类 1:10。

验证

tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
iperf -c 192.168.1.100

清除规则

sudo tc qdisc del dev eth0 root

05 限制特定端口带宽(使用 HTB)

命令

# 清除现有规则
sudo tc qdisc del dev eth0 root
# 创建 HTB 根队列
sudo tc qdisc add dev eth0 root handle 1: htb default 20
# 创建父类(总带宽 100Mbps)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
# 创建子类(限制 HTTP 端口 80 为 1Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit
# 添加过滤器(匹配目标端口 80)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10
# 添加默认子类(其他流量 50Mbps,可借用至 100Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 50mbit ceil 100mbit

功能:
使用 HTB 限制 eth0 上目标端口(HTTP 端口 80)的出口带宽为 1Mbps,其他流量保证 50Mbps(可借用至 100Mbps)。
适用于限制特定服务(如 Web 服务)的带宽。

参数说明:

  • htb default 20:未匹配规则的流量进入子类 1:20。
  • classid 1:1:父类,设置总带宽为 100Mbps。
  • classid 1:10:子类,限制端口 80 带宽为 1Mbps。
  • classid 1:20:默认子类,其他流量保证 50Mbps。
  • match ip dport 80 0xffff:匹配目标端口 80(16 位精确掩码)。
  • protocol ip:匹配 IPv4 流量(IPv6 需改为 protocol ipv6)。

验证

tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
curl http://<server_ip>

清除规则

sudo tc qdisc del dev eth0 root

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++编程练习

// 阿汪面前有两只盲盒,每只盒子打开都有两种可能:或者装了 X 克狗粮,或者是一只容量为 Y 克的狗粮储蓄盒。如果是狗粮,阿汪可以快乐地吃掉;如果是空储蓄盒,那就倒霉了,阿汪必须想办法找到狗粮把这只储蓄盒装满…

newDay14

1.做了几个Java的小练习,背背单词,写了一些英语作业,时间还是不太够 2.明天课就少了,继续往下学 3.自己c++还是太差了,java学得差不多就回去补c++

L07_在RuoYI项目中添加自己的接口并实现CRUD功能(轻松+AI版)

这里是废话部分 从来没有写过如此轻松的作业,上课两个多小时就听进去了几分钟的东西,这几分钟的东西还是操作,其他是半点都没入入脑,靠着这几分钟的东西,轻松的完成了作业的1/2。 在L06中折磨的看了三天的文档,大…

大二to大三暑假大三上前半学期总结

比赛,学习,刚谈上恋爱,可是然后呢?其实心态得到了比较大的改变,比大二下的时候好受了很多,可能是逐渐接收了事实了。 比较大的事情其实也没几个,第一是和同学一起去打了一个超算比赛 是并行应用挑战赛2025,去鄂…

带权拉格朗日中值定理的证明

带权拉格朗日中值定理:设 \(f(x)\) 在 \([a, b]\) 连续,且 \(g(x)\) 在 \([a,b]\) 可积且不变号(恒大于零或恒小于零),那么存在 \(c\in [a,b]\),使得 \[\int^b_af(x)g(x)\text{d}x = f(c)\int^b_ag(x)\text{d}x …

Linux 下将程序打包为安装包

对于 Linux 下的程序打包,个人首推 FPM 构建工具。它比 dpkg、rpmbuild 要好用的多(至少 2021 年那会如此),并且它同时支持 deb、rpm 等包格式。 以下回顾一下以前写过的安装包构建脚本: #!/bin/bash#-----------…

低代码如何推动企业敏捷创新与业务赋能

在创新驱动发展的时代,企业需要更快地响应市场变化,更灵活地调整业务策略。然而,传统的软件开发模式往往无法满足这种敏捷性要求。低代码技术的出现,正在改变这一现状,成为推动企业敏捷创新的重要力量。低代码与敏…

hevc解码器下载

如果你使用的是品牌电脑,那电脑重装系统后会自动下载,无需手动安装,连机械革命都会自动安装的 如果不是,那么直接下载最新版(本文截稿于2025/10/21) Microsoft.HEVCVideoExtensions_2.4.23下载 双击打开即可安装…

低代码如何成为企业数字化转型的加速器

在当今快速变化的商业环境中,企业数字化转型已从"选择题"变成了"必答题"。然而,传统软件开发模式的高成本、长周期,让许多企业在数字化转型的道路上步履维艰。这时,低代码技术应运而生,正以其…

2025.10.18 刷题

2025.10.18 刷题1. P14253 旅行(trip) 一眼,区间肯定到结尾 然后从后面扫,随便统计一下个数即可 2. P14254 分割(divide) 刚看很难 再看诈骗 发现限制是要求同等深度,然后最小的必须有两个 然后这个是个独立问题…

[网络] [iproute2] tc命令:Linux网络异常模拟(Network Emulation, netem)指南

[网络] [iproute2] tc命令:Linux网络异常模拟(Network Emulation, netem)指南$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");目录01 简介02 前提条件2.1…

删除链表的倒数第N个结点-leetcode

题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1:输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]示例 2: 输入:head = [1], n = 1 输出:[]示例 3: 输入:head = [1,2], n =…

NOI 八

根号分治?+吉司机/扫描线/单调栈A. 先考虑 unordered_map 暴力记录的做法,容易发现 LCM 太大了存不下,状态数也不可接受。 LCM 考虑质因数分解,发现 \(V=300\) ,\(>17\) 的质因数只会至多出现一次。 这样的质…

2025.10.21总结

今天继续看软考相关内容,今天复习了计算机网络相关知识,和程序设计语言基础,还有汇编语言,汇编语言太晦涩难懂了,看了一部分,例题跟着过了一下就过了,系统的学的话需要很长时间,这部分以做题为主吧。 目前也还…

10.18测试

T1 Bug 题目描述 A 君在机缘巧合下得到了一把养蛊神器,于是 A 君希望培养出迄今为止战斗力最强的 Bug。A 君把现有的 \(n\) 个 Bug 排成一个序列 \(a_1, a_2, \dots, a_n\),其中 \(a_i\) 表示第 \(i\) 个 Bug 的战斗…

Day1标签的关系与vs的注释

<html><head></head><body></body> </html>标签之间的关系有两种,嵌套与并列关系,也可形象对的理解为父子与兄弟 在上述代码中,head与body都是html的子标,而head与body则是并…

软件工程学习日志2025.10.21

项目概述 在本次开发任务中,我使用Trae框架成功实现了一个功能完整的即时在线聊天软件。该应用支持文字和图片的实时发送与接收,界面简洁美观,充分体现了现代Web应用的设计理念。 技术架构 前端技术栈 • 核心框架:…

[PaperReading] DeepSeek-OCR: Contexts Optical Compression

目录DeepSeek-OCR: Contexts Optical CompressionTL;DRMethodDeepEncoderDeepDecoderDataExperiment总结与思考相关链接 DeepSeek-OCR: Contexts Optical Compression link 时间:25.10.20 单位:DeepSeek 作者相关工作…

Win10安装WindowsCamera相机

在一些很旧的win10非正式版中,相机可能缺失,很老的win10只能用过时的WindowsCamera相机。这里给出一个安装包,当然新系统也可安装 夸克网盘下载 首先,打开开发者模式(如果有),不然无法安装然后右键打开——以管…

简易的本地部署OI-Wiki方法 for CCSP

在联网环境下执行 git clone https://gitee.com/OI-wiki/OI-wiki.git -b gh-pages拷贝文件后,在离线环境下执行 cd OI-wiki python -m http.server即可本地运行OI-wiki, 默认在localhost:8000上运行