无论是为了保证服务质量(QoS),限制带宽,还是模拟网络条件,Linux内核中的TC(Traffic Control)工具都为我们提供了强大的功能
本文将详细介绍TC的基本概念、使用方法、以及实际案例,帮助你更好地理解和运用这一工具
一、TC的基本概念 TC(Traffic Control)是Linux内核中提供的一个用于控制和管理网络流量的强大工具
它基于内核的队列规则(qdisc)和流量类别(class)体系结构,允许对进入或离开网络接口的数据流进行复杂的整形和过滤
TC通过以下三个核心组件实现流量控制: 1.队列规则(qdisc):定义数据包的排队和发送方式
常见的队列规则包括pfifo_fast、htb(层次令牌桶)、tbf(令牌桶过滤器)和prio(优先级队列)
2.类别(class):对不同类型的流量应用不同的策略
每个类别可以包含其他类别,形成层次结构,从而实现更复杂的流量管理
3.过滤器(filter):根据指定的条件将流量分配到不同的类别中
过滤器可以基于IP地址、端口、协议等属性进行匹配
二、TC的基本使用方法 TC命令的基本格式如下: tc 【OPTIONS】 OBJECT ACTION【FILTER】 - OPTIONS:可选参数,如-s显示统计数据,-d删除对象等
- OBJECT:操作对象,可以是qdisc(队列规则)、class(流量类别)或filter(过滤器)
- ACTION:针对对象的操作,如add(添加)、change(更改)、replace(替换)、delete(删除)等
- FILTER:对象的具体参数,如接口名称(dev eth0)、父级分类ID(parent ...)、qdisc类型(htb、pfifo_fast等)、速率限制(rate ...)等
1. 添加和删除队列规则 添加一个根队列规则,使用htb调度策略: tc qdisc add dev eth0 root handle 1: htb default 1 删除队列规则: tc qdisc del dev eth0 root 2. 添加和删除类别 创建一个类别,限制带宽为1Mbps: tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit 删除类别: tc class del dev eth0 parent 1: classid 1:1 3. 添加和删除过滤器 创建一个过滤器,匹配目的IP地址为192.168.1.2的流量,并将其分配到类别1:10中: tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.2 flowid 1:10 删除过滤器: tc filter del dev eth0 protocol ip parent 1:0 prio 1 handle 1:10 三、TC的实际应用案例 1. 模拟网络延迟 增加100毫秒的延迟: tc qdisc add dev eth0 root netem delay 100ms 删除延迟设置: tc qdisc del dev eth0 root netem delay 100ms 2. 模拟网络丢包 设置10%的丢包率: tc qdisc add dev eth0 root netem loss 10% 删除丢包设置: tc qdisc del dev eth0 root netem loss 10% 3. 模拟网络抖动 增加100毫秒的基础延迟,并允许±10毫秒的波动: tc qdisc add dev eth0 root netem delay 100ms 10ms 删除抖动设置: tc qdisc del dev eth0 root netem delay 100ms 10ms 4. 限制特定IP的带宽 限制IP为1.1.1.3的上传速度: 1. 创建虚拟网卡并启用,暂定虚拟网卡名为ifb0
2. 创建Ingress队列并进行导流
3. 对ifb0进行限速
限制IP为1.1.1.3的下载速度: 1. 设置根qdisc(队列规则)
2. 创建子类进行带宽限制
3. 创建过滤器以识别特定流量
具体步骤如下: 创建虚拟网卡并启用 ip link add name ifb0 type ifb ip link set dev ifb0 up 将ifb0添加到桥接或路由配置中(视情况而定) 例如,将其桥接到eth0 brctl addif br0 ifb0 创建Ingress队列并进行导流 tc qdisc add dev ifb0 handle ffff: ingress tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.1.1.3 action mirred egress redirect dev ifb0 对ifb0进行限速 tc qdisc add dev ifb0 root handle 1: htb default 30 tc class add dev ifb0 parent 1: classid 1:1 htb rate 1mbit tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 1.1.1.3 flowid 1:1 5. 限制特定端口的带宽 限制源端口为2049的流量带宽: 设置根qdis