认识TC(Traffic Control)命令—linux自带高级流控

Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。其中包括以下三个部分组成

  • handle(句柄)
  • class(类别)
  • filter(过滤器)

他们之间的关系是由一个handle(句柄)携带多个class(类别),
列队方式再handle中声明,而对于限速大小等具体的声明就在class中。

TC命令格式

1
tc class [add|change|replace|del] dev DEV parent <qdisc-id> classid <class-id> qdisc <qdisc specific parameters> default <default class-id>

其中[add|change|replace|del]分别表示 添加|改变|覆盖|删除 规则,是对以上三个部分的控制指令。

DEV 指的是网卡代号,比如eth0,ens5之类的。它决定了你得规则要应用在哪张网卡上,(可别理解成开发的意思了,虽然咱也布吉岛为什么要这么写)

parent表示队列,也就是刚刚提到的handle(句柄)部分,它应该与创建的handle值一致。

qdisc表示详细规则,比如限制速度的rate 和 ceil 突发最高限度。

default 是htb特有的队列参数,意思是所有未分类的流量都将分配给类别1:N。N的值为某个属于该handle的class。

关于限速

他们的单位表示如下
| 命令 | 表示 |
| —- | —- |
| kbit | kb/s |
| mbit | Mb/s |
| mbps | Mbps |
| kbps | kbps |

其中有两个参数,一个是rate,另一个是ceil

rate: 表示系统可以保证的最低速度。

ceil: 表示系统允许的最大突发速度。

举个栗子

目标:对服务器1500端口出口的全部流量进行限速

分析:首先我们通过TC指令创建分类,并且设定一个规则,一旦发现对应标记的数据包就进行限速,而对数据包打标记的任务交给iptables

创建根类别1,并且声明全部未指定的流量导向到类别 1:11

1
tc qdisc add dev ens5 root handle 1: htb default 11

创建一个未经影响的子类别,也就是Default指定的11号,
限定速度写一个很大的数值就可以。命令中,”parent 1:”表示类别的父亲为根队列1:。”classid1:11″表示创建一个标识为1:11的类别。

1
tc class add dev ens5 parent 1: classid 1:11 htb rate 1000mbit ceil 1000mbit

创建限制速度的子类别,并且指定为12号,保证基础带宽限速512k,可突发到1024k(实际上基本没见过,都徘徊在Kb/s附近)

1
tc class add dev ens5 parent 1: classid 1:12 htb rate 512kbit ceil 1024kbit

绑定过滤器 优先级1(最大),IP头部标签跟踪协议,当标签为12时,绑定12号子类别

1
tc filter add dev ens5 parent 1: prio 1 protocol ip handle 12 fw flowid 1:12

用iptables表示所有从1500端口出去的流量,都打上12号标记

1
iptables -A OUTPUT -t mangle -p tcp --sport 6000 -j MARK --set-mark 12

效果:所有来自1500端口的出口流量都被iptables标记为12,并且被TC识别到,以12号子类别的方式进行QOS限速。