TC HTB流量控制[转自CU]

第一次在CU上发帖,不知道怎么引用blog文章,就直接贴过来了,欢迎大家批评指正~~
原文在my blog: http://blog.chinaunix.net/u3/94771/showart_1906064.html

                                     TC HTB流量控制            
一.背景简介
最近几个月在参与一个软路由器的开发.该路由器的流量控制功能由TCHTB实现。下面写点总结性的文字,因水平有限,不对之处敬请各位及时指出。
TC为TrafficControl的缩写,HTB顾名思义是一个层次式的过滤框架,我们可以通过配置TC HTB规则来实现流量控制.
二.基本概念
TC规则涉及到队列(queue),分类器(class)和过滤器(filter)三个概念.
队列用来实现控制网络的收发速度.通过队列,linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(如TCP)的前提下来平滑网络流量.需要注意的是,linux对接收队列的控制不够好,所以我们一般只用发送队列,即“控发不控收”,。
   class用来表示控制策略.很显然,很多时候,我们很可能要对不同的IP实行不同的流量控制策略,这时候我们就得用不同的class来表示不同的控制策略了.
   filter用来将用户划入到具体的控制策略中(即不同的class中).正如前述,我们要对A,B两个IP实行不同的控制策略(C,D),这时,我们可 用filter将A划入到控制策略C,将B划入到控制策略D,filter划分的标志位可用u32打标功能或IPtables的set-mark功能来实 现。
三、应用过程
我们要实现这样的功能。局域网中的用户分为两类:特权用户和普通用户,对特权用户和普通用户的各应用的上行/下载实现独立的控制。设eth0为内网网络接口,eth1位外网网络接口。
i)首先在eth0和eth1分别建立qdiscA和 qdiscB。qdiscA控制外网数据注入内网的速度,因此是用来控制下行速度的;qdiscB控制内网数据灌入外网的速度,因此是用来控制上行速度的。示例指令如下。
tc qdisc add dev eth0 root handle 1:htb default 91
解释如下:无论是队列,还是class和filter都有ID之类的标志符,一般都有parent,注意ID具有接口本地性,不同的网络接口可以有相同的ID。对于这里因为qdisc在顶部,所以parent无,用'root'字样来标识,ID用1:来标志,'default 91'表示当某个ip流不满足任何已设定的filter规则时,将自动归入class 91中.更详细的指令规则说明请参考手册.
   ii)然后在qdisc下建立两个root class,分别用来控制普通用户和特权用户的带宽(对于eth0是用来控制下行带宽,对于eth1是用来控制上行带宽的).示例指令如下.
  tc class add dev eth0 parent 1:0 classid1:30 htb rate 2mbit ceil 4mbit prio 2
解释如下:rate是指在带宽紧张的情况下的最大网络速度,当带宽空闲时,class可通过向其兄弟借用带宽而达到ceil大的网络速度,注意,借用表兄弟之间也可借用带框.prio用来指示借用带宽时的竞争力,prio越小,优先级越高,竞争力越强.
iii)接着针对不同的应用在各rootclass下设置不同的类,.示例如下.
tc class add dev eth0 parent 1:30 classid 1:31 htbrate 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 ipprio 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之类的打标上做文章,但我实在没想出什么具体的打标策略.有哪位比较清楚,烦请告诉我.
五.附图.
整个应用中的规则示意图如下.




不错不错,挺有参考意义的。

楼主的遗留问题是否可以用iptables的 “!” 来解决呢?

四.遗留问题.
有很多细节需要考虑,如上行控制与下行控制应比较独立,即上行控制时,对下行中局域网内用户上行的ack之类的包应不予限制,这个显然应在iptable之类的打标上做文章,但我实在没想出什么具体的打标策略.有哪位比较清楚,烦请告诉我.
对于ack包可用
-p tcp --tcp-flags ack

来匹配呀


===========================


QUOTE:原帖由 lijiangt 于 2009-6-14 00:16 发表
有没有哪位手头有对ftp服务进行带宽限制的脚本,要同时对port模式和pasv模式限制总带宽,方便的话提供一下,多谢!
稍微看了下文档,自己写了个,请各位帮我看看有没有什么问题(60001-65000)是我在vsftpd中设置的pasv的端口范围:

[Copy to clipboard] [ - ]CODE:iptables -t mangle -I OUTPUT -o eth1 -p tcp --sport 60001:65000 -j MARK --set-mark 0x10000001
iptables -t mangle -I OUTPUT -o eth1 -p tcp --sport 20 -j MARK --set-mark 0x10000001
iptables -t mangle -I OUTPUT -o eth1 -p tcp --sport 21 -j MARK --set-mark 0x10000001
tc qdisc add dev eth1 root handle 1: htb
tc class add dev eth1 parent 1: classid 1:1 htb rate 1000Mbit ceil 1000Mbit
tc class add dev eth1 parent 1:1 classid 1:11 htb rate 5Mbit ceil 6Mbit
tc qdisc add dev eth1 parent 1:11 handle 11: sfq perturb 10
tc filter add dev eth1 parent 1:0 protocol ip prio 11 handle 0x10000001 fw classid 1:11

你可能感兴趣的:(#linux防火墙路由)