Linux中如何使用iptables实现流量整形与限速
利用iptables与tc工具组合实现Linux流量整形:先创建HTB队列规则和带宽类,再用iptables在mangle表中标记数据包,最后通过tc过滤器将标记流量绑定到指定类。可基于端口或源IP限速,需root权限并建议测试环境验证。
在 Linux 系统中进行流量整形时,iptables 与 tc 堪称黄金搭档。前者负责为数据包添加标记,后者则依据标记执行精确的带宽控制。要将两者协同使用,只需按以下步骤操作即可实现高效的 Linux 流量整形与带宽管理。

1. 安装必要的软件包
首先需确认系统中已安装这两个工具。大多数 Linux 发行版默认均已预装。若未安装,通过包管理器快速安装即可:
sudo apt-get install iproute2 iptables # Debian/Ubuntu
sudo yum install iproute iptables # CentOS/RHEL
2. 配置网络接口
确定需要施加流量控制的网络接口,例如最常见的 eth0,确保其处于激活状态:
ip link set eth0 up
3. 创建队列规则
使用 tc 命令在目标网卡上附加一个队列规则,这相当于搭建流量调度的基础框架:
sudo tc qdisc add dev eth0 root handle 1: htb default 30
这里选用 HTB(分层令牌桶)算法,适用于带宽限制与优先级管理,是实现 Linux 流量整形的主流方案。
4. 创建类
框架建立后,接下来划分不同带宽通道——各类流量各行其道。例如为 HTTP 流量设置专用子通道:
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 2mbit
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 512kbit ceil 1mbit
此命令含义清晰:父类保障至少 1Mbps,最高可至 2Mbps;子类则以 512Kbps 为基本带宽,上限 1Mbps。参数 rate 与 ceil 分别定义了带宽的“保底线”与“爆发线”。
5. 使用 iptables 标记流量
现在轮到 iptables 登场,它的任务是为目标数据包打上标记,告诉 tc “此包需特殊处理”:
sudo iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 10
该规则将所有目标端口为 80 的 TCP 流量标记为“10”。mangle 表专用于修改数据包,PREROUTING 链确保数据包在路由前即被标记,这是 iptables 与 tc 配合的关键环节。
6. 将标记的流量绑定到类
标记完成后,最后一步是将标记与已创建的类关联,使带有标记“10”的流量自动进入 1:10 子通道:
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:10
7. 监控和调整
一切就绪后,需要验证整形效果是否达标。通过 tc 可随时查看队列与类的实时状态:
sudo tc -s qdisc ls dev eth0
sudo tc -s class ls dev eth0
这些命令会显示发送字节数、丢包、超时等关键统计信息,便于判断整形策略是否生效,或哪些参数需要微调。
示例:限制特定 IP 的带宽
假设办公室某台设备(IP: 192.168.1.100)占满下行带宽,需单独限速。操作流程与上文完全一致,仅将标记依据从端口改为源 IP:
创建队列规则:
sudo tc qdisc add dev eth0 root handle 1: htb default 30创建类,为该 IP 分配更低带宽的子类:
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 2mbit sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 256kbit ceil 512kbit此处将子类带宽压缩至 256Kbps,上限 512Kbps,实现精准的 IP 带宽控制。
用 iptables 打标记,这次基于源 IP:
sudo iptables -t mangle -A PREROUTING -s 192.168.1.100 -j MARK --set-mark 10绑定标记到类:
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:10
注意事项
- 流量整形本质上是让数据包有序排队,高负载下必然引入一定延迟或丢包,这是不可避免的副作用。
- 切勿直接在线上环境操作。建议先在测试环境完整跑一遍,评估对应用体验的实际影响。
- 所有操作均需 root 权限,普通用户无法执行。
上述是最基础的用法,实际生产环境可能涉及多队列、混入 SFQ 公平调度,或借助 connmark 实现更精细的连接跟踪。但从这套框架出发,绝大多数带宽管理场景都能覆盖。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
IDEA中SpringBoot项目热部署实现指南
Springboot项目在IDEA中实现热部署需依次完成:开启自动编译(静态与动态编译)、启用热部署策略、引入spring-boot-devtools依赖、关闭浏览器缓存,最后启动测试即可生效,省去手动重启时间,大幅提升开发效率。
Java实现Excel转JSON的代码详解
使用Java结合FreeSpire XLS库可自动将Excel转为JSON,通过读取工作表并映射为键值对,高效支持数据迁移、报表导出与系统对接,大幅提升效率并消除手动录入错误。
Golang高效布谷鸟过滤器多字符集字符串过滤
布谷鸟过滤器支持删除操作,通过指纹截断与双哈希定位实现多字符集高效过滤。指纹截断需采用fnv64a或xxhash快速哈希并取低8位,桶索引使用独立双哈希避免假阳性。并发安全需以固定数组配合sync atomic实现。
Java使用Poi-tl按Word模板生成动态表格
Poi-tl是Word导出工具,文档周全,支持多级合并表头生成。通过{{text}}、{{?var}}、{{ table}}标签处理模板,传入TableRenderData对象即可动态渲染表格。示例展示用户信息表格生成,并提供工具类消除表格首行缩进,确保格式正确。
Go语言微服务集成Swagger生成交互式API文档完整教程
在Go微服务中集成Swagger常见四大问题:swaginit初始化失败需确保存在packagemain及注释;SwaggerUI加载失败因路由映射错误或未导入docs;@Param注解必须严格遵循格式;部署后接口文档显示localhost因硬编码host,应删除或通过环境变量动态注入。
- 热门数据榜
相关攻略
2026-07-11 06:47
2026-07-11 06:47
2026-07-11 06:47
2026-07-11 06:47
2026-07-11 06:47
2026-07-11 06:46
2026-07-11 06:46
2026-07-11 06:46
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

