TC HTB流量控制

.背景简介
  
最近几个月在参与一个软路由器的开发.该路由器的流量控制功能由TC HTB实现。下面写点总结性的文字,因水平有限,不对之处敬请各位及时指出。
   TC
Traffic Control的缩写,HTB顾名思义是一个层次式的过滤框架,我们可以通过配置TC HTB规则来实现流量控制.
.基本概念
   TC
规则涉及到队列(queue),分类器(class)和过滤器(filter)三个概念.
  
队列用来实现控制网络的收发速度.通过队列,linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(TCP)的前提下来平滑网络流量.需要注意的是,linux对接收队列的控制不够好,所以我们一般只用发送队列,即控发不控收”,
  class
用来表示控制策略.很显然,很多时候,我们很可能要对不同的IP实行不同的流量控制策略,这时候我们就得用不同的class来表示不同的控制策略了.
  filter
用来将用户划入到具体的控制策略中(即不同的class).正如前述,我们要对A,B两个IP实行不同的控制策略(C,D),这时,我们可 filterA划入到控制策略C,将B划入到控制策略Dfilter划分的标志位可用u32打标功能或IPtablesset-mark功能来实 现。
三、应用过程
  
我们要实现这样的功能。局域网中的用户分为两类:特权用户和普通用户,对特权用户和普通用户的各应用的上行/下载实现独立的控制。设eth0为内网网络接口,eth1位外网网络接口。
   i)
首先在eth0eth1分别建立qdiscA qdiscBqdiscA控制外网数据注入内网的速度,因此是用来控制下行速度的;qdiscB控制内网数据灌入外网的速度,因此是用来控制上行速度的。示例指令如下。
   tc qdisc add dev eth0 root handle 1: htb default 91
  
解释如下:无论是队列,还是classfilter都有ID之类的标志符,一般都有parent,注意ID具有接口本地性,不同的网络接口可以有相同的ID。对于这里因为qdisc在顶部,所以parent无,用'root'字样来标识,ID1:来标志,'default 91'表示当某个ip流不满足任何已设定的filter规则时,将自动归入class 91.更详细的指令规则说明请参考手册.
  ii)
然后在qdisc下建立两个root class,分别用来控制普通用户和特权用户的带宽(对于eth0是用来控制下行带宽,对于eth1是用来控制上行带宽的).示例指令如下.
  tc class add dev eth0 parent 1:0 classid 1:30 htb rate 2mbit ceil 4mbit prio 2
  
解释如下:rate是指在带宽紧张的情况下的最大网络速度,当带宽空闲时,class可通过向其兄弟借用带宽而达到ceil大的网络速度,注意,借用表兄弟之间也可借用带框.prio用来指示借用带宽时的竞争力,prio越小,优先级越高,竞争力越强.
 iii)
接着针对不同的应用在各root class下设置不同的类,.示例如下.
tc class add dev eth0 parent 1:30 classid 1:31 htb rate 0.5mbit ceil 2mbit prio 3
 
指令意义同ii).
 
同时为了不使一个会话永占带宽,在叶子结点(即本文的各应用结点)添加随即公平队列sfq.
 tc qdisc add dev eth0 parent 1:31 handle 31: sfq perturb  10
 iv)
接着添加过滤器.
  tc filter add dev eth0 parent 1: protocol ip prio 31 handle 31 fw flowid 1:31
v)
iptable打标
   iptables -t mangle -I FORWARD -i eth1 -p tcp --sport %80 -d $IPaddr--j MARK --set-mark 31
   iptables -t mangle -I FORWARD 2 -i eth1 -d $IPaddr--j RETURN

 
注意下行速率在eth0处控制,但打标应在进入eth0前进行,所以规则中出现了'-i eth1'字样.下行达标规则可类推之.
.遗留问题.
有很多细节需要考虑,如上行控制与下行控制应比较独立,即上行控制时,对下行中局域网内用户上行的ack之类的包应不予限制,这个显然应在iptable之类的打标上做文章,但我实在没想出什么具体的打标策略.有哪位比较清楚,烦请告诉我.
.附图.
整个应用中的规则示意图如下.

你可能感兴趣的:(Network,Security)