防火墙带宽控制技术的研究与实现


    摘 要  随着网络应用的不断丰富,人们对网络服务质量提出了更高的要求,带宽控制则日益受到人们的关注。本文深入研究了Linux系统下的带宽控制工具TC,以及HTB队列规定,针对防火墙中不同的应用和服务,实现了带宽控制。
    关键词  QoS;TC;HTB;队列;分类;过滤规则
 

1 引言

    随着网络 多媒体技 术的飞速发展,Internet上的多媒体应用层出不穷,如IP电话、视频会议、视频点播(VOD)、远程教育等多媒体实时业务;另外,电子商务作为一种 新兴的网络经济模式日益受到人们的青睐。同时,在很多企业的局域网内部,网络应用也极为丰富,如MIS系统、Web服务、邮件服务,甚至还有数据流量较大 的视频点播等业务。面对网络服务与应用的不断增长,人们对其质量提出了更高的要求。
    近年来,网络带宽不断扩大,但是依然无法满足网络应用的要求。为此,带宽控制逐渐为人们所关注。一般说来,企业内部网络有足够的带宽可以使用。但是,企业 接入Internet的带宽是有限的。为了提高网络带宽的利用率,保证用户关键性业务的正常运行,越来越多的企业和组织意识到了带宽控制的重要性。
    QoS,即质量服务,是网络中的一种安全机制, 用来解决网络延迟和阻塞等问题。带宽控制是实现QoS的重要组成部分,它根据源/目的端口(服务类型)、源/目的地址等数据包的关键字段,对网络带宽进行 分类,限制每个分类中数据包发送的速率,从而达到控制网络流量,保障关键业务带宽的目的。
    防火墙是目前最有效、使用最广泛的网络安全产品,它处于网络的边界处,而这里也是实现带宽控制最合适的位置。本文深入分析了Linux下的带宽控制工具TC,并且结合最新的HTB队列规定和iptables工具,给出了在防火墙上实现带宽控制的具体实现。

2 Linux下的带宽控制工具TC

    TC(Traffic Control),即带宽控制,是Linux中功能强大的带宽控制工具。通过TC,可以很方便地管理网络带宽,实现QoS。TC拥有数据包分类、优先级设定、数据共享、输入和输出流量限制等多种功能。

2.1  TC的结构

    TC共分为三个模块:队列规定模块、分类模块和过滤模块。它们之间的关系如图1所示,队列规定模块是TC实现的基础,在这个模块中封装了其它两个模块。而分类和过滤规则是实现TC的主体。

2.1.1 队列

    每一个网络接口上都可以绑定一个队列规定,用于控制经过这个接口的数据流。它把一条物理链路模拟成几条更慢的链路或者把发出的不同类型的流量模拟成不同的 连接。Linux内核中支持的队列规定有许多。有些是不可以分类的,如FIFO,pfifo-fast,red,sfq,tbf,另一些是可以分类的,如 CBQ、HTB、优先级队列规定。其中,CBQ和HTB的功能最为丰富,它们可以为每个模拟链路设置优先级,优先级高的先发送;还可以实现链路共享,当一 个分类上的带宽空闲时可以借用给其它的分类;还有突发流量控制,速率限制等。如果一个接口上没有绑定任何队列,则使用默认的FIFO队列。

2.1.2 分类

    在一个队列上必须有一个主干分类,它拥有全部的带宽。在主干分类上可创建多个分类,每个分类可以再创建它们的子类,以此类推,但是每一个子类只能有一个父 类。它们的主要作用是将数据流依据各种条件进行分类,便于对它们进行控制。针对各个不同的网络接口可创建相同的分类,但是同一个接口上的分类不能相同。每 个分类都分配了一定的带宽值,属于同一个父类的所有子类的带宽总和不能超过父类的带宽值。分类就好像是为数据包建立了几条通道,而数据包的流向则由过滤规 则来决定。

2.1.3过滤规则

    每一个分类可以设置一条或者多条过滤规则,每一条规则由两部分组成:匹配和判决。匹配部分根据数据报的某些特征来区分数据报,如数据报的源IP地址、目地 IP地址,协议类型、TOS字节、网络接口、端口等。如果没有匹配到,就调用下一条过滤规则;如果匹配到了就通过判决部分来决定是将它丢弃、延迟还是传入 下层分类。目前,Linux可以使用的过滤器有:fwmark分类器,u32分类器,RSVP分类器等。其中,fwmark 分类器允许使用Linux netfilter代码选择流量,而u32分类器允许选择基于ANY头的流量。

 
图1 队列规定、分类和过滤模块三者的关系

2.2 TC的实现原理

    TC将流经网络接口的数据放入一个队列中,对它们进行分类,并根据过滤规则把数据包放入每个分类的分队列中,通过控制每个分队列数据包发送的速率来限制每个分类的带宽。
    首先,TC在网络接口处绑定一个队列规定,并为这个队列创建多个分类,如果需要,还可以为每个分类创建多个子分类,每个子分类都有一个数据包分队列,它们 形成了一个树型的结构(如图1)。同属一个父类的各个分类之间可以互相共享带宽,当然在创建分类时也可以设置为不共享自己的带宽。
    其次,针对每个分类,设置一条或多条过滤规则与它相对应。当数据包进入分类后,相应的过滤规则根据数据包的各个字段或者标志位进行匹配,这些字段或者标志 位中,有的是数据包创建的时候就有的,如源、目的端口,源、目的地址等;有些是在数据包进入系统时由iptables命令设置的(用以区分不同的数据 流),如mark值。当一个数据包被匹配后就会对它执行相应的判决,决定这个数据包是丢弃、延迟还是继续流入下一层分类。
    最后,所有没有被丢弃,需要通过网络接口发送的数据包都会被放入某个子类的分队列中等待发送。TC按照不同的速率到每个队列中取出数据包,交给网络接口进 行发送。每个分队列都有它的优先级,优先级高(设置的数值低)的队列先发送,当优先级高的队列中的数据包全部发送完毕后,再发送优先级低的。也可以为分队 列设置其它排队方法,防止优先级高的队列长期占用网络接口。

3 带宽控制在防火墙中的实现

3.1 队列的选择

    对于防火墙来说,选择一个功能强大,适合具体应用环境的队列规定有助于提高系统实现带宽控制的成功率和精确度。相对于其它的队列规定,CBQ和HTB提供了分类、链路共享、限速等丰富的功能,是构建带宽控制模块的首选队列。
    CBQ作为一个经历长久考验的排队算法,它功能强大,且较早地被Linux所支持,有许多成功的实例。CBQ队列在内核中依靠粗糙的计时信息来固定带宽, 虽然在一个较长的时间段内,可以维持很好的精度,但是在以秒为单位进行计量的时间段内,其结果就不准确了。CBQ是通过计算连接的空闲时间来限制带宽的, 如果要把某个应用的带宽限制为整个带宽的10%,则这个应用的相关连接的空闲时间应为90%。其空闲时间的计算标准是数据包离队事件发生的频率和下层连接 (数据链路层)的带宽。当一个连接长期处于空闲时,就会造成对空闲时间计算的偏差,导致带宽限制失效。虽然CBQ中也可以通过设定某些参数(如 maxidle,minburst等)来纠正这个问题,但是由于纠正参数不止一个,且每一个参数的改变都会影响到其它参数,较为复杂。所以在这个问题 上,CBQ始终无法很好地解决。
    HTB是一个更好理解更容易掌握的可以快速替换CBQ队列规定的队列,它是CBQ的一个精简改进版,继承了CBQ的多项功能,去掉了一些复杂且不实用的部 分。HTB可以实现带宽分类、带宽共享、设置优先级、设定突发流量等功能。更重要的是,HTB改变了限制带宽的方法。它通过限制每个分队列上数据包的发送 速率来限制每个分类的带宽。提高了带宽限制的精确度。对于每一个网络接口来说,同一时刻只能发送一个数据包,所以网络接口处数据包的发送速率是一定的。 HTB队列规定通过在一个固定时间段内从每个分类的分队列中取出的数据包个数来决定该分类的带宽。取的数据包数越多,则分配给它的带宽就越大。这就很好地 解决了CBQ对带宽限制不精确的问题。
所以说,在防火墙的带宽控制模块中,选择HTB作为队列规定是高效而且实用的。

3.2  TC实现的位置

    TC在系统中的具体位置如图2所示,数据包流入系统后,进行路由选择:如果接收包的目的IP是本主机,那么将该包送给上层处理;否则需要进行转发,将接收 包交到转发模块处理。转发模块同时也接收本主机上层(TCP/UDP等)产生的包。转发模块通过查看路由表,决定包的下一跳。然后,对包进行排列以便将它 们传送到输出接口。TC正是在排列数据包时进行处理和实现的。
图2 TC在数据包流程中的位置

3.3  iptables的作用

    iptables是Linux-2.4核心以后才支持的一个包过滤工具,它与netfilter相配合,共同组成了防火墙的核心部分。有关 iptables工具的相关知识请大家查阅相关资料,此处不再赘述了。iptales在这里的主要作用是为实现细粒度的带宽控制作好准备工作。它通过强大 的匹配功能,对数据包的源/目的地址、源/目的端口、协议类型、传输方向、时间段等特征进行检查,并为匹配到的数据包打上mark值。TC的过滤规则与 iptables规则通过mark值进行关联,共同决定数据包归属于哪个分类。

3.4 具体实例

    为了在防火墙中实现带宽控制,我们将结合iptbales工具,通过设置iptables规则对基于源IP 地址、目的IP地址、协议、服务、方向、时间段的不同数据流进行细粒度的带宽策略管理,通过对每一个粒度元素的设定可以满足对极精细流量的控制要求。假设 防火墙架设在公司的出口处。为了保障公司专用服务的带宽,在周一至周五的9:00-17:00时间段内,要把WWW和FTP这两个常用服务的带宽分别控制 在20M和10M。带宽分配情况如图3所示:

图3 带宽分配

3.4.1 带宽分类的代码

    (1)tc qdisc add dev eth0 root handle 1:0 htb default 24
    (2)tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0
    (3)tc class add dev eth0 parent 1:1 classid 1:11 htb rate 30Mbit ceil 30Mbit prio 1
    (4)tc class add dev eth0 parent 1:1 classid 1:12 htb rate 70Mbit ceil 70Mbit prio 1
    (5)tc class add dev eth0 parent 1:11 classid 1:20 htb rate 20Mbit ceil 30Mbit prio 2
    (6)tc class add dev eth0 parent 1:11 classid 1:21 htb rate 10Mbit ceil 30Mbit prio 2
    (7)tc qdisc add dev eth0 parent 1:12 handle 112:0 sfq perturb 5
    (8)tc qdisc add dev eth0 parent 1:20 handle 113:0 sfq perturb 5
    (9)tc qdisc add dev eth0 parent 1:21 handle 114:0 sfq perturb 5
    (10)tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:12
    (11)tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:20
    (12)tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
    第1行命令为网络接口eth0绑定一个htb队列,并且指定了一个名称为handle的句柄1:0, 这个名称用于标识它下面的子类, default 24 的意思是没有被分类的流量被分配到类1:24。第2行命令为刚才建立的队列建一个主干类,带宽为100M,最大速率为100M,优先级为0(最 高),HTB规定主干类之间不能互相借用带宽,但是一个父类的所有子类之间可以借用带宽。第3行为通用服务建立一个分类,带宽为30M,最大速率为 30M,优先级为1。
    第4行命令为专用服务建立一个分类,带宽为70M,最大速率为70M,优先级为1。由于以上两条命令的rate值和ceil值相等,所以它们不允许自已的 带宽外借。后两行为WWW和FTP服务分别创建子类,它们的父类为通用服务。为WWW服务子分类分配的带宽为20M,为FTP服务子分类分配10M的带 宽。优先级都为2。他们的ceil值与父类的相同,都比自己的rate值高,所以它们的带宽可以互相借用,且仅限于它们之间。第7、8、9行分别为专用服 务、WWW服务和FTP服务建立一个分队列,并使用随机公平算法(sfp)把所有的数据包映射到几个分队列中去,“perturb 5”表示每隔5秒重新配置一次散列算法。数据包按照各分队列轮转的方式发送,防止优先级高的专用服务长期占有网络接口而使其它两种服务完全无法使用。在一 定时间段内,每个分队列所发出的数据包的个数由分配给该分类的带宽值所决定,带宽值越大,所发出的包的数量就越多。最后三行为三个带宽分类分别设置过滤规 则,其中的handle值所对应的就是iptables规则所设置的mark值。
 
3.4.2 用iptables工具设置安全规则
    (1)iptables –t mangle –A PREROUTING –p tcp –m tcp --dport 1234 –m time --timestart 9:00 --timestop 17:00 --days Mon,Tue,Wed,Thu,Fri -j MARK --set-mark 1
    (2)iptables –t mangle –A PREROUTING –p tcp –m tcp --dport 80 –m time --timestart 9:00 --timestop 17:00 --days Mon,Tue,Wed,Thu,Fri -j MARK --set-mark 2
    (3)iptables –t mangle –A PREROUTING –p tcp –m tcp --dport 21 –m time --timestart 9:00 --timestop 17:00 --days Mon,Tue,Wed,Thu,Fri -j MARK --set-mark 3
    以上三条iptables规则分别将专有服务(端口值为1234)、WWW服务(端口值为80)、FTP服务(端口值为21) 在周一至周五9:00到17:00时间段内的数据包的mark值设为1、2、3。正好与TC过滤规则中的handle值相对应。

4 利用TTCPW测试工具验证带宽控制的效果

    TTCPW是Windows下的网络性能(主要指吞吐量)测试工具,采用P2P模式。从一端内存生成要传送的数据,通过网络传送后,由另一端收下来。数据包接收后无需写到磁盘,直接丢弃,既方便,又实用,更不受磁盘读写速度的影响,测试结果比较真实。
下面,我们通过它来测试上面的实例,并给出相应的测试结果。测试环境如图4所示,网络环境是百兆的局域网。


图4 TTCPW测试环境

    在TTCPW服务器1上输入命令:ttcpw –r –s –p80,在TTCPW客户端1上输入命令:ttcpw –t –s –p80 –n10000 192.168.1.80,在客户端1与服务器1之间收发WWW服务数据包。
在TTCPW服务器2上输入命令:ttcpw –r –s –p21,在TTCPW客户端2上输入命令:ttcpw –t –s –p21 –n10000 192.168.1.21,在客户端2与服务器2之间收发FTP服务数据包。
其中-r表示接收端,-t表示发送端,-s如果是发送端就表示产生并发送数据包到网络,如果是接收端则表示收到后丢弃数据包,-p如果是发送端 就表示目的端口,如果是接收端就表示接收端口,-n表示发送数据包的个数,最后为接收端的IP地址。在设与不设带宽控制两种情况下,用TTCPW测试结果 统计如下:

时间
WWW服务带宽
(KB/S)
转换后带宽值
(Mb/s)
FTP服务带宽值
(KB/S)
转换后带宽值
(Mb/s)
总带宽值
(Mb/s)
20
4802.50
38.42
5137.50
41.10
79.52
30
5878.73
47.03
4566.25
36.53
83.56
40
5843.75
46.75
4817.50
38.54
85.29
50
4871.26
38.97
5431.25
43.45
82.42
60
5383.77
43.07
5535.01
44.28
87.35
平均
5356.01
42.85
5097.50
40.78
83.63
表1不设带宽控制的测试结果
时间
WWW服务带宽
(KB/S)
转换后带宽值
(Mb/s)
FTP服务带宽
(KB/S)
转换后带宽值
(Mb/s)
总带宽
(Mb/s)
误差
(Mb/s)
误差率
20
2625.39
21.00
1295.38
10.36
31.36
1.36
4.5%
30
2586.37
20.69
1328.52
10.63
31.32
1.32
4.4%
40
2646.32
21.17
1288.72
10.31
31.48
1.48
4.9%
50
2536.46
20.29
1226.81
9.81
29.52
0.48
1.6%
60
2493.44
19.95
1232.40
9.86
29.81
0.19
0.63%
平均
2577.60
20.62
1274.37
10.19
30.81
0.81
2.7%
表2 设置带宽控制后的测试结果

    TTCPW显示的结果是以KB/s为单位的,将其乘以8得到以Mb/s为单位的转换后的带宽值。通过以上两张表不难发现,当不设带宽控制时,一分钟内 WWW服务和FTP服务的总带宽平均值为83.63Mb/s,而设置了带宽以后,WWW服务和FTP服务的总带宽平均值为30.81Mb/s,接近于设置 的带宽值,误差率平均值为2.7%。而笔者原来使用CBQ队列时所测试的误差率平均值为18.73%。由此可见,通过TC和iptables规则的设置, 成功地实现了对网络带宽的控制。而HTB队列,作为CBQ队列的精简改良版,体现出了更高的效率和更精确的控制效果。

5 结束语

    本文对Linux系统QoS 的核心TC进行了深入地分析,讨论了队列规定、分类和过滤规则三大模块的作用。结合HTB队列和iptables工具,给出了在防火墙中实现带宽控制的具 体实例。TC工具功能的强大毋庸置疑,而如何解决它对防火墙系统性能下降所带来的影响将会成为TC新的难题。

 

原文: http://www.ahcit.com/lanmuyd.asp?id=2199

你可能感兴趣的:(职场,休闲,tc,qos,HTB)