1、网络拓扑html
2、环境介绍linux
服务器系统是centos6.5,内核:2.6.32-431.el6.x86_64centos
Server:两张网卡eth0:10.0.0.100缓存
eth1:192.168.0.1服务器
PC:一张网卡eth0:192.168.0.10,gw:192.168.0.1网络
3、tc介绍tcp
在linux中,tc有二种控制方法CBQ和HTB。HTB是设计用来替换CBQ的,HTB比CBQ更加灵活,可是CPU 开销也更大,一般高速的链路会使用CBQ,通常而言HTB使用的更加普遍咱们对tc中的 HTB的规则本质上是一个树形结构,包括三个基本的构成块:队列规定qdisc(queueing discipline) ,类(class)和分类器(Classifiers).ide
qdisc 队列规则(queueing discipline):spa
用来实现控制网络的收发速度.经过队列,linux能够将网络数据包缓存起来,而后根据用户的设置,在尽可能不中断链接(如 tcp)的前提下来平滑网络流量.须要注意的是,linux 对接收队列的控制不够好,因此咱们通常只用发送队列,即"控发不控收".它封装了其余两个主要 tc 组件(类和分类器).内核若是须要经过某个网络接口发送数据包,它都须要按照为这个接口配置的 qdisc 队列规则把数据包加入队列.而后,内核会尽量多地从 qdisc里面取出数据包,把它们交给网络适配器驱动模块..net
最简单的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 为每个分类创建基于路由的过滤器,并把过滤规则与特定的路由结合。通常只须要针对根分类提供一个过滤器,而后为每一个子类提供路由映射。
4、实施
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 root 2>/dev/null
加一个根队列
tc qdisc add dev eth0 root handle 1:0 htb default 60
加一个根类
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0
加一个子类用于内网速率限制为10Mbit
tc class 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 eth1 root 2>/dev/null
根队列
tc qdisc add dev eth1 root handle 2:0 htb default 30
根类
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 10Mbit ceil 10Mbit prio 0
子类
tc class add dev eth1 parent 2:1 classid 2:11 htb rate 1Mbit ceil 1Mbit prio 1
设置队列规则
tc qdisc add dev eth1 parent 2:11 sfq perturb 10
tc filter add dev eth1 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 eth1
tc -s class ls dev eth0
tc -s class ls dev eth1
参考:
http://lartc.org/howto/lartc.qdisc.classful.html
https://blog.csdn.net/eydwyz/article/details/53320612