在Linux环境下,tc(Traffic Control) 是一个强大的网络流量控制工具,它允许用户对网络接口上的数据包传输速率进行精确的控制和塑造,这对于网络模拟、服务质量(QoS)管理、带宽限制等场景尤为重要。下面是对tc的详细讲解,以及如何使用它来限制特定IP地址或端口的流量实例。
tc 工具简介
tc属于 Linux 内核的 netem(Network Emulator)模块,它不仅能够限制带宽,还能模拟丢包、延迟、抖动等网络条件,为网络应用测试提供了一种灵活的手段。tc的工作原理基于分类队列(cqdisc),通过创建不同的队列规则来决定数据包如何被处理。

tc 的基本使用结构
一个典型的 tc 命令结构如下:
tc [ options ] object { action parameters }
options: 可选参数,例如-s用于显示统计信息,-d用于删除对象。object: 操作对象,常见的有qdisc(队列规则)、class(流量类)、filter(过滤器)。action: 指定对object执行的操作。parameters: 与动作相关的具体参数。
限制IP和端口实例
准备工作
在开始前,确保已安装并激活了 tc。通常大多数Linux发行版都会自带 tc 工具。
限制特定IP地址的带宽
限制来自或发往特定IP地址的流量,需要结合 iptables 和 tc 使用。首先,使用 iptables 将特定IP的流量重定向到一个特殊队列,然后用 tc 配置该队列的带宽限制。
示例:限制IP地址为 192.168.1.100 的设备带宽到 100kbps。
- 添加iptables规则,将目标IP的流量标记并重定向到一个特定的链:
sudo iptables -t mangle -A PREROUTING -d 192.168.1.100 -j MARK --set-mark 10
- 配置tc,创建一个htb队列分类器,并对这个标记的流量进行限制:
sudo tc qdisc add dev eth0 root handle 1: htb default 10
sudo tc class add dev eth0 parent 1: classid 1:10 htb rate 100kbit
sudo tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match mark 10 flowid 1:10
这里,eth0 是网卡名称,rate 100kbit 设置了最大带宽为100kbps。
限制特定端口的带宽
限制特定TCP或UDP端口的流量,同样需要结合 iptables 和 tc。这里以限制TCP 80端口为例。
- iptables规则,标记目标端口的流量:
sudo iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 20
- tc配置,为标记的端口流量设置带宽限制:
sudo tc class add dev eth0 parent 1: classid 1:20 htb rate 200kbit
sudo tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match mark 20 flowid 1:20
这里,我们设置了TCP 80端口的流量限制为200kbps。
注意事项
- 在进行流量控制前,确保了解网络拓扑和需求,以免影响正常服务。
- 操作前备份现有iptables规则和tc配置,以防误操作导致网络中断。
- 测试时,监控网络性能,适时调整策略以达到预期效果。
通过上述步骤,您可以有效地利用tc工具在Linux系统中对特定IP地址或端口的流量进行精准的控制,无论是进行网络测试还是实施QoS策略,都是非常实用的技能。


