Linux TC基于CBQ队列的流量管理范例
参考了TC的很多文档,自己也整理了一篇配置记录。在实际使用过程中效果还不错,在此分享给大家以备参考。
环境:局域网规模不是很大40多台机器。 NAT共享上网(内网:eth0 外网:eth2)
CBQ是通过硬件的闲置时间来计算队列,硬件不同,效果也不同,对于比较大的网络使用HTB比较好。以下限制上传和下载的方法可以写成脚本,通过mrtg发现流量的异常情况,然后通过ntop查处是谁在干坏事,最后用写好的tc脚本限制他的流量,避免影响其他人的网络使用。
1) 针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列
#tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64
将一个cbq队列绑定到网络物理设备eth0上,其编号为1:0;网络物理设备eth0的实际带宽为10Mbit,包的平均大小为1000字节;包间隔发送单元的大小为8字节,最小传输包大小为64字节。
2) 在该队列上建立分类
#tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 1Mbit
创建根分类1:1;分配带宽为10Mbit,优先级别为1。该队列的最大可用带宽为10Mbit,实际分配的带宽为10Mbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为1,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为1Mbit。
创建子分类
#tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 100Kbit bounded
创建分类1:2,其父分类为1:1,分配带宽为64Kbit,优先级别为8。该队列的最大可用带宽为10Mbit,实际分配的带宽为64Kbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为8,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为100Kbit,且不可借用未使用带宽。
#tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 9 avpkt 1000 cell 8 weight 100Kbit bounded
创建分类1:3,其父分类为1:1,分配带宽为64Kbit,优先级别为9。该队列的最大可用带宽为10Mbit,实际分配的带宽为64Kbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为9,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为100Kbit,且不可借用未使用带宽。
3)在子分类地下创建队列,使用sfq随机公平队列
#tc qdisc add dev eth0 parent 1:2 sfq quantum 1514b perturb 15
#tc qdisc add dev eth0 parent 1:3 sfq quantum 1514b perturb 15
在分类底下,创建队列,使用sfq随即公平队列
4) 为每一分类建立一个基于路由的过滤
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.66 flowid 1:3
限制各ip地址的下载带宽,使用u32过滤器,对目的地址进行分类,对应已经创建的队列
需要添加新的被限制ip的下载带宽,需要先要创建新的分类(比如1:4),然后根据新的分类创建新的sfq队列,最后使用u32过滤器对目的地址进行带宽限制。
需要对几个ip限制下载带宽,就需要创建几个分类、队列、过滤器
限制上传
#将一个cbq队列绑定到网络物理设备eth2上,其编号为2:0;网络物理设备eth2的实际带宽为2Mbit,包的平均大小为1000字节;包间隔发送单元的大小为8字节,最小传输包大小为64字节。
#tc qdisc add dev eth2 root handle 2: cbq bandwidth 2Mbit avpkt 1000 cell 8 mpu 64
创建根分类2:1;分配带宽为2Mbit,优先级别为1。该队列的最大可用带宽为2Mbit,实际分配的带宽为2Mbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为1,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为200Kbit。
#tc class add dev eth2 parent 2:0 classid 2:1 cbq bandwidth 2Mbit rate 2Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 200Kbit
#创建分类2:2,其父分类为2:1,分配带宽为64Kbit,优先级别为8。该队列的最大可用带宽为2Mbit,实际分配的带宽为64Kbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为8,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为100Kbit,且不可借用未使用带宽。
#tc class add dev eth2 parent 2:1 classid 2:2 cbq bandwidth 2Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 200Kbit bounded
#在分类底下,创建队列,使用sfq随即公平队列
/sbin/tc qdisc add dev eth2 parent 2:2 sfq quantum 1514b perturb 15
#应用路由分类器到cbq队列的根,过滤协议为ip,优先级为100
#tc filter add dev eth2 parent 2:0 protocol ip prio 1 handle 2 fw classid 2:2
#给数据包打标签,可以通过RETURN方法避免遍历所有的规则,加快处理速度
#iptables –t mangle –A PREROUTING –i eth0 –s 192.111.1.xxx –j MARK --set-mark 2
#iptables –t mangle –A PREROUTING –i eth0 –s 192.111.1.xxx –j RETURN
#nat(参考)
#iptables -t nat -A POSTROUTING -s 192.111.1.0/24 -o eth2 -j SNAT --to 外网IP
#需要添加新的被限制ip的上传带宽,需要先要创建新的分类(比如2:3),然后根据新的分类创建新的sfq队列,最后使用路由过滤器,过滤协议为ip,给原地址是需要限制的ip地址来的数据包打标记。
需要对几个ip限制下载带宽,就需要创建几个分类、队列、路由过滤器、iptable的mangle表的PREROUTING链
另外还有其他的过滤器比如:
#tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2 ip route add 192.111.1.24 dev eth0 via 192.111.1.4 realm 2
维护
主要包括对队列、分类、过滤器和路由的增添、修改和删除。
增添动作一般依照"队列->分类->过滤器->路由"的顺序进行;修改动作则没有什么要求;删除则依照"路由->过滤器->分类->队列"的顺序进行。
#简单显示指定设备的队列状况
/sbin/tc qdisc ls dev eth0
#详细显示指定设备的队列状况
/sbin/tc –s qdisc ls dev eth0
#简单显示指定设备的分类状况
/sbin/tc class ls dev eth0
#详细显示指定设备的分类状况
/sbin/tc –s class ls dev eth0
#显示过滤器的状况
/sbin/tc –s filter ls dev eth0
#队列的维护
一般对于一台流量控制器来说,出厂时针对每个以太网卡均已配置好一个队列了,通常情况下对队列无需进行增添、修改和删除动作了。
分类的维护
增添动作通过tc class add命令实现。
修改动作通过tc class change命令实现,如下所示:
/sbin/tc class change dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 100Kbit bounded
对于bounded命令应慎用,一旦添加后就进行修改,只可通过删除后再添加来实现。
#过滤器的维护
增添动作通过tc filter add命令实现。
修改动作通过tc filter change命令实现,如下所示:
/sbin/tc filter change dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2
删除动作通过tc filter del命令实现,如下所示:
/sbin/tc filter del dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:
Linux TC基于CBQ队列的流量管理范例的更多相关文章
- Linux TC流量控制HOWTO中文版
<本文摘自Linux的高级路由和流量控制HOWTO中文版 第9章节>网人郭工进行再次编译: 利用队列,我们可以控制数据发送的方式.记住我们只能对发送数据进行控制(或称为整形).其实,我们无 ...
- Linux TC (traffic control)
在着手学习TC采用如下单位来描述带宽: mbps = 1024 kbps = 1024 * 1024 bps => byte/s mbit = 1024 kbit => kilo bit/ ...
- Linux TC(Traffic Control)框架原理解析
近日的工作多多少少和Linux的流控有点关系.自打几年前知道有TC这么一个玩意儿而且多多少少理解了它的原理之后,我就没有再动过它,由于我不喜欢TC命令行,实在是太繁琐了.iptables命令行也比較繁 ...
- Linux TC 流量控制介绍
前段时间在做一些测试的时候接触到了Linux tc,因为需要对数据包添加延迟,用到了tc中的netem.添加简单的延迟非常简单,像这样一条命令就搞定了:$ tc qdisc add dev eth0 ...
- 几种常见的微服务架构方案简述——ZeroC IceGrid、Spring Cloud、基于消息队列
微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...
- 几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm
微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...
- Linux TC的ifb原理以及ingress流控-转
原文:http://www.xuebuyuan.com/2961303.html 首先贴上Linux内核的ifb.c的文件头注释: The purpose of this driver is ...
- [转]Linux进程间通信——使用消息队列
点击此处阅读原文 另收藏作者ljianhui的专栏初学Linux 下面来说说如何使用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linu ...
- java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.
java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...
随机推荐
- centos6.6编译安装lnmp系列之PHP
简介: 环境:虚拟机+centos6.6 在百度云盘里面我分享的安装软件包,包含LNMP系列软件. http://pan.baidu.com/s/1gdvnimv 1.安装前配置: 关闭selinux ...
- jQuery判断当前元素是第几个元素
$("ul li").click(function () { var index = $("ul li").index(this); alert(index); ...
- phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
[题外话]phpinfo()这个函数可以查看很多php的信息,要 记得使用 phpinfo() 的很多部分有两个Column:Local Value(局部变量)和 Master Value(主变量) ...
- 内部类 & 泛型
内部类 主要作用 1. 内部类, 主要用于事件监听的方法实现.2. 用于多继承 注: 主要还是 1 用的比较多. 参考 : head first java (第12章) 泛型 head first j ...
- Linux 忘记密码解决方法
很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如下: 重启linux系统 3 ...
- VRP介绍以及AC初始化配置-06
VRP介绍 VRP:多功能路由平台(Versatile Routing Platform) 角色:网络操作系统 支撑多种设备的软件平台 提供TCP/IP 路由服务 通用路由平台VRP(Versatil ...
- <select>的下拉样式
今天做一个专题,其中,select标签的样式要做成下图的模样,但是默认情况是下下图的模样: 如何实现呢,实现的办法竟然比我想象中的简单好多: select{ border: solid 1px #00 ...
- C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针)
1 . 通用函数可变参数模板 对于有些时候,我们无法确切的知道,函数的参数个数时,而又不想过多的使用所谓的函数重载,那么就可以效仿下面的例子: #include<iostream> #i ...
- thinkPHP 数字字典
- 1057 N的阶乘(大数运算)
题目链接:51nod 1057 N的阶乘 #include<cstdio> using namespace std; typedef long long ll; ; const int m ...