使用iptables+tc进行流控

作者:linux120 发布时间:November 12, 2014 分类:服务器配置

一、TC介绍

在linux中,TC有二种控制方法CBQ和HTB.HTB是设计用来替换CBQ的。它是一个层次式的过滤框架。TC包括三个基本的构成块: 队列规定qdisc(queueing discipline )、类(class)和分类器(Classifiers)
队列(queueing discipline):用来实现控制网络的收发速度。通过队列,linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(如 TCP)的前提下来平滑网络流量。需要注意的是,linux对接收队列的控制不够好,所以我们一般只用发送队列,即“控发不控收”。它封装了其他两个主要 TC组件(类和分类器)。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。
最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。
队列规则包括FIFO(先进先出),RED(随机早期探测),SFQ(随机公平队列)和令牌桶(Token Bucket),类基队列(CBQ),CBQ 是一种超级队列,即它能够包含其它队列(甚至其它CBQ)。
class用来表示控制策略。很显然,很多时候,我们很可能要对不同的IP实行不同的流量控制策略,这时候我们就得用不同的class来表示不同的控制策略了。
filter用来将用户划入到具体的控制策略中(即不同的class中)。比如,现在,我们想对xxa,xxb两个IP实行不同的控制策略(A,B),这时,我们可用filter将xxa划入到控制策略A,将xxb划入到控制策略B,filter划分的标志位可用u32打标功能或IPtables的 set-mark(大多使用iptables来做标记)功能来实现。
目前,TC可以使用的过滤器有:fwmark分类器,u32分类器,基于路由的分类器和RSVP分类器(分别用于IPV6、IPV4)等;其中,fwmark分类器允许我们使用 Linux netfilter 代码选择流量,而u32分类器允许我们选择基于 ANY 头的流量 .需要注意的是,filter(过滤器)是在QDisc内部,它们不能作为主体。
二、TC使用说明
在Linux中,Linux流量控制都是通过TC这个工具来完成的。通常, 要对网卡进行流量控制的配置,需要进行如下的步骤:
◆ 为网卡配置一个队列;
◆ 在该队列上建立分类;
◆ 根据需要建立子队列和子分类;
◆ 为每个分类建立过滤器。
数据包->iptables(在通过iptables时,iptables根据不同的ip来设置不同的mark)->TC(class)->TC(queue)
在TC 中使用下列的缩写表示相应的带宽:
◆ Kbps kiIobytes per second, 即”千字节每秒 ;
◆ Mbps megabytes per second, 即”兆字节每秒 ,
◆ Kbit kilobits per second,即”千比特每秒 ;
◆ Mbit megabits per second, 即”兆比特每秒 。
三、下载限速实例(针对某IP进行下载限速)

#iptables设置,在iptables里面设定mark值,
iptables -t mangle -A POSTROUTING -d 172.16.x.x -j MARK –set-mark 8
#添加tc规则队列,默认的
tc qdisc add dev eth0 root handle 1: htb default 256
说明:
命令中的”add“表示要添加
”dev“ eth0 表示要操作的网卡为eth0
”root“ 表示为网卡eth0添加的是一个根队列
”handle 1:“ 表示队列的句柄为1:。
“htb“ 表示要添加的队列为HTB队列
命令最后的”default 256 是htb特有的队列参数,意思是所有未分类的流量都将分配给类别1:256。
#为根队列创建相应的类别
#这里的rate指的是保证带宽,ceil是最大带宽。
tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbps ceil 10mbps
说明:
命令中,”parent 1:”表示类别的父亲为根队列1:
“classid 1:1″表示创建一个标识为1:1的类别
“rate 10mbps”表示系统将为该类别确保带宽10mbps
“ceil 10mbps”表示该类别的最高可占用带宽为10mbps
#支类列表用于限制速度
tc class add dev eth0 parent 1: classid 1:256 htb rate 90mbps ceil 90mbps
#建立网络包过滤器,设置fw。的handle值与iptables设置障碍的mark值要对应。
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 8 fw classid 1:1
通过iftop -F 172.16.x.0/24 -b 验证下IP的流量是否有限制。
上传限速,与下载限速差不多,iptables那条改为:
iptables -t mangle -A PREROUTING -s 172.16.x.x -j MARK –set-mark 2

标签: none

评论已关闭