7 min read

Traffic Controller 使用札记

Traffic Controller 使用札记

Traffic Controller 概述

Traffic Controller (以下简称TC)是Linux 流量控制模块,其原理是为数据包建立队列,并定义了队列中数据包的发送规则,从而实现在技术上对流量进行限制、调度等控制操作。

TC 中的流量控制队列分为两种:无类队列和分类队列

  • 无类队列就是就进入网卡的数据进行统一对待,无类队列能够接受数据并对网卡流量整形,但是不能对数据包进行细致划分,无类队列规定主要有 PFIFO_FAST、TBF、SFQ等,无类队列的流量整形手段主要是排序、限速以及丢包。
  • 分类队列则是对进入网卡的包根据不同的需求以分类的方式区分对待。数据包进入分类队列后,通过过滤器对数据包进行分类,过滤器返回一个决定这个决定指向某一个分类,队列就根据这个返回的决定把数据包发送到相应的某一类队列中排队。每个子类可以再次使用自己的过滤器对数据进一步分类,直到不需要分类为止,数据包最终会进入相关类的队列中排队。

TC 流量控制方式

  • SHAPING: 流量被限制时,它的传输速率就被控制在某个值以下,限制阈值可以远小于有效带宽,这样可以平常网络的突发流量,例网络更稳定,SHAPING方式适用于限制外出的流量。
  • SCHEDULING: 通过调度数据包传输的优先级数据,可以在带宽范围内对不同的传输流按照优先级分配,适用于限制外出的流量。
  • POLICING: SHAPING用于处理向外流量,而POLICY 用于处理接收到数据,对数据流量进行限制。
  • DROPPING: 如果流量超过设置的阈值就丢弃数据包,向内外皆有效。

实例

无类队列的使用

使用方法比较简单,TBF(Token Bucket Filter)是无类队列中比较常用的一种队列,TBF只是对数据包流量进行SHAPING,并不做SCHEDULING。如果只是简单地限制网卡的流量,这会是这种很高效的方式。

tc disc add dev eth1 root handle 1:0 tbf rate 128kbit burst 1000 latency 50ms

参数解释如下:

  • tc disc add dev eth1: 表示在设备eth1 上添加队列;
  • root: 表示根节点,没有父节点;
  • handle 1:0: 表示队列句柄;
  • tbf: 表示使用TBF;
  • rate 128kbit: 速率为128kbit;
  • burst 1000: 桶尺寸为1000;
  • latency 50ms: 数据最多等待50ms

分类队列的使用

如果需要对包进一步的细分,对不同类型数据进行区别对待,分类队列就非常适合。CBQ(Class Based Queue)是一种比较常用的分类列队。在分类队列中多了类和过滤器两个概念。通过过滤器把数据包划分到不同的类里面,再递归地处理这些类。

假设有台服务器,有一个带宽为100Mbit/s 的物理网卡,在这台主机上开启了3个服务:

  • SSH
  • SNMP
  • HTTP

我们对这3种服务的带宽进行限制,那么可以进行如下操作:

首先建立一个根队列:

tc disc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8 

然后基于此队列中建立3个子类:

tc class add dev eth0 parent 1:0 classic 1:1 cbq bandwidth 100Mbit rate 2Mbit weight 0.5Mbit prio 5 cell 8 avpkt 1000
tc class add dev eth0 parent 1:0 classic 1:2 cbq bandwidth 100Mbit rate 10Mbit weight 0.5Mbit prio 5 cell 8 avpkt 1000
tc class add dev eth0 parent 1:0 classic 1:3 cbq bandwidth 100Mbit rate 15Mbit weight 0.5Mbit prio 5 cell 8 avpkt 1000

在3个类下建立队列或类进一步划分:

tc qdisc add dev eth0 parent 1:1 handle 10:0
tc qdisc add dev eth0 parent 1:2 handle 20:0
tc qdisc add dev eth0 parent 1:3 handle 30:0

最后为根队列建立3个过滤器:

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 math ip sport 22 0xfffff flowid 1:1 
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 math ip sport 161 0xfffff flowid 1:2
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 math ip sport 80 0xfffff flowid 1:3 

我们为根队列创建了3个分类,分别对SSH、SNMP以及HTTP 这3种服务的数据包进行限制,其余数据包将不受影响。

拒绝某个IP连接

tc qdisc delete dev eth0 ingress
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: u32  match ip src 172.16.4.11/32         action drop

使用tc命令模拟常见网络环境

企业WIFI

WAN

tc qdisc add dev eth2 root netem delay 5ms 1ms rate 1000000kbit
tc qdisc add dev eth3 root netem delay 5ms 1ms rate 1000000kbit

LAN

tc qdisc add dev eth2 root netem delay 5ms 4ms rate 1000000kbit
tc qdisc add dev eth3 root netem delay 5ms 4ms rate 1000000kbit

企业分公司

WAN

tc qdisc add dev eth2 root netem delay 20ms 8ms rate 1000000kbit 
tc qdisc add dev eth3 root netem delay 20ms 8ms rate 1000000kbit 

LAN

tc qdisc add dev eth2 root netem delay 5ms 4ms rate 1000000kbit 
tc qdisc add dev eth3 root netem delay 5ms 4ms rate 1000000kbit 

站点到站点VPN

WAN

tc qdisc add dev eth2 root netem delay 20ms 15ms rate 1000000kbit 
tc qdisc add dev eth3 root netem delay 20ms 15ms rate 1000000kbit 

LAN

tc qdisc add dev eth2 root netem delay 5ms 4ms rate 1000000kbit 
tc qdisc add dev eth3 root netem delay 5ms 4ms rate 1000000kbit 

远程用户VPN

WAN

tc qdisc add dev eth2 root netem delay 20ms 15ms rate 100000kbit 
tc qdisc add dev eth3 root netem delay 20ms 15ms rate 100000kbit 

LAN

tc qdisc add dev eth2 root netem delay 2.5ms 0.5ms rate 600000kbit 
tc qdisc add dev eth3 root netem delay 2.5ms 0.5ms rate 600000kbit 

咖啡厅Wi-Fi

WAN

tc qdisc add dev eth2 root netem delay 5ms 1ms rate 100000kbit 
tc qdisc add dev eth3 root netem delay 5ms 1ms rate 100000kbit 

LAN

tc qdisc add dev eth2 root netem delay 5ms 4ms rate 600000kbit 
tc qdisc add dev eth3 root netem delay 5ms 4ms rate 600000kbit 

酒店/机场无线网络

WAN

tc qdisc add dev eth2 root netem delay 5ms 1ms rate 100000kbit 
tc qdisc add dev eth3 root netem delay 5ms 1ms rate 100000kbit 

LAN

tc qdisc add dev eth2 root netem delay 8ms 6ms rate 600000kbit 
tc qdisc add dev eth3 root netem delay 8ms 6ms rate 600000kbit 

体育场/活动无线网络

WAN

tc qdisc add dev eth2 root netem delay 5ms 1ms rate 100000kbit 
tc qdisc add dev eth3 root netem delay 5ms 1ms rate 100000kbit 

LAN

tc qdisc add dev eth2 root netem delay 10ms 9ms rate 600000kbit 
tc qdisc add dev eth3 root netem delay 10ms 9ms rate 600000kbit 

拥塞的ISP核心

WAN

tc qdisc add dev eth2 root netem delay 20ms 8ms rate 1000000kbit 
tc qdisc add dev eth3 root netem delay 20ms 8ms rate 1000000kbit 

LAN

tc qdisc add dev eth2 root netem delay 2.5ms 1ms rate 1000000kbit 
tc qdisc add dev eth3 root netem delay 2.5ms 1ms rate 1000000kbit 

蜂窝LTE边缘

WAN

tc qdisc add dev eth2 root netem delay 2.5ms 1ms rate 1000000kbit 
tc qdisc add dev eth3 root netem delay 2.5ms 1ms rate 1000000kbit 

LAN

tc qdisc add dev eth2 root netem delay 17.5ms 4.5ms rate 1000000kbit 
tc qdisc add dev eth3 root netem delay 17.5ms 4.5ms rate 1000000kbit

手机弱网

# 添加root根
tc qdisc add dev eth0 root handle 1: prio
# 配置丢包率30%,上下浮动2%
tc qdisc add dev eth0 parent 1:1 handle 2: netem  loss 30% 2%
# 或延迟500ms,上下浮动20ms
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms 20ms

tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 目的IP flowid 2:1

# 删除规则
tc qdisc del dev eth0 root