TC模块限速实例

一、网络拓扑

创新互联主要从事做网站、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务普陀,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575

TC模块限速实例

二、环境介绍

服务器系统是centos6.5,内核:2.6.32-431.el6.x86_64

Server:两张网卡eth0:10.0.0.100

         eth2:192.168.0.1

PC:一张网卡eth0:192.168.0.10,gw:192.168.0.1

三、tc介绍

在linux中,tc有二种控制方法CBQ和HTB。HTB是设计用来替换CBQ的,HTB比CBQ更加灵活,但是CPU开销也更大,通常高速的链路会使用CBQ,一般而言HTB使用的更加广泛我们对tc中的HTB的规则本质上是一个树形结构,包括三个基本的构成块:队列规定qdisc(queueing discipline) ,类(class)和分类器(Classifiers).

qdisc 队列规则(queueing discipline):

    用来实现控制网络的收发速度.通过队列,linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(如tcp)的前提下来平滑网络流量.需要注意的是,linux对接收队列的控制不够好,所以我们一般只用发送队列,即"控发不控收".它封装了其他两个主要tc组件(类和分类器).内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc队列规则把数据包加入队列.然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块.

最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列.不过,它会保存网络接口一时无法处理的数据包.常有的队列规则包括FIFO先进先出,RED随机早期探测,SFQ随机公平队列和令牌桶Token Bucket,类基队列CBQ,CBQ是一种超级队列,即它能够包含其它队列,甚至其它CBQ.

Class类

class 用来表示控制策略.很显然,很多时候,我们很可能要对不同的IP实行不同的流量控制策略,这时候我们就得用不同的class来表示不同的控制策略了.

Filter规则

    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内部,它们不能作为主体.

实施步骤

主要是建立队列、分类、过滤器三步。

1 给物理设备建立一个队列qdisc

2 在相关队列上建立分类,一般是在该qdisc上建立一个根分类,然后在此根分类上建立子类。

3 为每一个分类建立基于路由的过滤器,并把过滤规则与特定的路由结合。一般只需要针对根分类提供一个过滤器,然后为每个子类提供路由映射。

四、实施

Server端

sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#g' /etc/sysctl.conf

sysctl -p

做nat命令如下:

iptables -F

iptables -t nat -F

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 10.0.0.100

为流量控制做基于fw过滤器的标记

iptables -t mangle -I PREROUTING-o eth0 -s 192.168.0.0/24 -j MARK --set-mark 0x11

上传速率做流量控制

tc 只能控制网卡发送包的速率,所以上传速率的限制要在eth0上做

删除旧有队列

tc qdisc del dev eth0 root2>/dev/null

加一个根队列

tc qdisc add dev eth0 root handle1:0 htb default60

加一个根类

tcclass add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0

加一个子类用于内网速率限制为10Mbit

tcclass add dev eth0 parent 1:1 classid 1:11 htb rate 10Mbit ceil 10Mbit prio 1 burst 96kbit

设置队列规则  

tc qdisc add dev eth0 parent 1:11 handle 111:0 sfq perturb 10

将队列和fw过滤器映射起来 其中hand 0x11 的0x11是开始用iptables 做的标记

tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 0x11 fw classid 1:11                                                

做下载限制,过滤器是用u32 

tc qdisc del dev eth2 root 2>/dev/null
根队列

tc qdisc add dev eth1 root handle2:0 htb default30
根类

tcclass add dev eth1 parent2:0 classid2:1 htb rate 10Mbit ceil 10Mbit prio 0
子类
tcclass add deveth1 parent2:1 classid2:11 htb rate 1Mbit ceil 1Mbit prio 1

设置队列规则

tc qdisc add deveth1 parent2:11 sfq perturb 10

tc filter add dev eth2 parent 2:0 protocol ip prio 2 u32 match ip dst 192.168.0.0/24 flowid 2:11

用以下命令监视流量

tc -s qdisc ls dev eth0 
tc -s qdisc ls dev eth2 
tc -s class ls dev eth0 
tc -s class ls dev eth2 

参考:

http://lartc.org/howto/lartc.qdisc.classful.html

https://blog.csdn.net/eydwyz/article/details/53320612


本文名称:TC模块限速实例
网页网址:http://azwzsj.com/article/gegsge.html