linux系统下利用TC进行流量控制实例
本文利用vmware虚拟机搭建linux环境, 并模拟一些复制网络的情形。
一、网络带宽限速
linux下进行带宽限速,需要使用分类队列,其原理主要是对网络设备的发送接口(原则上接收接口无非进行流量控制),数据包进入一个分类的队列后,它就需要被送到某一个类中,也就是说需要对数据包做分类处理。对数据包进行分类的工具是过滤器,过滤器会返回一个决定,队列规定就根据这个决定把数据包送入相应的类进行排队。每个子类都可以再次使用它们的过滤器进行进一步的分类。直到不需要进一步分类时,数据包才进入该类包含的队列排队。
Linux流量控制主要分为建立队列、建立分类和建立过滤器三个方面。
基本实现步骤。
1) 针对网络物理设备(如以太网卡eth0)绑定一个队列qdisc;
2) 在该队列上建立分类class;
3) 为每一分类建立一个基于路由的过滤器filter;
4) 最后与过滤器相配合,建立特定的路由表。
1、绑定qdisc队列(本文主要使用CBQ队列)
tc qdisc add dev ens33 root handle 1: cbq bandwidth 100kbit avpkt 1000 cell 8 mpu 64
该命令的含义是:将一个cbq队列绑定到网络物理设备ens33上,其编号为1:0;网络物理设备ens33的实际带宽为100kbit,包的平均大小为1000字节;包间隔发送单元的大小为8字节,最小传输包大小为64字节。
2、建立分类
tc class add dev ens33 parent 1:0 classid 1:1 cbq bandwidth 100kbit rate 100kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 10kbit
创建根分类1:1,该队列的最大可用带宽为100kbit,实际分配的带宽为100kbit,可接收冲突的发送最长包数目为20字节,最大传输单元加MAC头的大小为1514字节,优先级别为8,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相当于实际带宽的加权速率为10kbit。
tc class add dev ens33 parent 1:1 classid 1:2 cbq bandwidth 100kbit rate 80kbit maxburst 20 allot 1514 prio 2 avpkt 1000 cell 8 weight 8kbit split 1:0 bounded
创建分类1:2,其父类为1:1,该队列的最大可用带宽为10kbit,实际分配的带宽为80kbit,可接收冲突的发送最长包数目为20字节,最大传输单元加MAC头的大小为1514字节,优先级别为2,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相当于实际带宽的加权速率为8kbit,分类的分离点为1:0,且不可借用未使用带宽。
3、创建过滤器
tc filter add dev ens33 parent 1:0 protocol ip prio 100 route
应用路由分类器到cbq队列的根,父分类编号为1:0;过滤协议为ip,优先级别为100,过滤器为基于路由表。
tc filter add dev ens33 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2
建立路由映射分类 1:2。
4、建立路由
ip route add 119.0.0.0/8 dev ens33 via 192.168.17.2 realm 2
发往子网119.0.0.0/8的数据包通过分类2转发(分类2的速率80kbit),这里的子网119.0.0.0/8为我当时测试抓包分析得到的百度网盘上传所使用的ip段,由于只是简单演示限速效果,因此只限速部分上传流的ip。
5、以上所有命令效果截图
6、实际限速效果对比
限速前,上传本地一文件到百度网盘,可以看出上传速率可以达到1000KB/s。
限速后,上传同一文件到百度网盘,速度被限制到了几十KB/s,但这里有个问题是,由于未能百度上传所有ip段覆盖,因此,最终上传还是会很快成功(考虑百度上传是否并不是完全从本地上传,而是利用网络上的其他地方资源或者库资源,快速完成上传)。所以,实际上,这里只是演示限速效果,证明带宽限速的配置已经生效。
7、监控
简单显示指定设备(这里为ens33)的分类状况
tc class ls dev ens33
详细显示指定设备(这里为ens33)的分类状况(该命令对应查看限速效果比较重要)
tc -s class ls dev ens33
从图中可以看出,分类器1:2 发送了3508个包,总计7606285字节,超过速率限制的包的数目为10595个。
以上,就是简单介绍一个TC限速配置的实例,相关参考如下:
https://blog.****.net/u011641885/article/details/45640313 (主要)
https://blog.****.net/eydwyz/article/details/52164889
https://www.jianshu.com/p/4b5cc3845f2c
http://www.tldp.org/HOWTO/html_single/Traffic-Control-HOWTO/(TC的一个帮助文档,暂时还未细看)