郭正球
(长沙航空职业技术学院,湖南长沙 410124)
基于Linux下TC的网络流量管理
郭正球
(长沙航空职业技术学院,湖南长沙 410124)
介绍Linux下的流量管理器(TC),讨论了TC的排队规定、分类和过滤器三个关键组件的相关细节,给出运用TC工具实现网络流量管理的具体实例。
服务质量;流量管理;队列规定;类;过滤器
目前采用尽力而为(Best-effort)模型设计的互联网,会尽可能地为所有用户分配网络带宽,用以传送更多的网络流量,但对带宽和数据传输延时却没有明确规定。[1]当下,以BT为代表的P2P服务在提升网络传输效率的同时也极大地消耗了网络带宽,对其他网络应用带来冲击。网络长时间的高度拥塞,给网络管理带来困难和功能失效的危险,将直接影响网络的正常运行和关键业务的开展。因此,需要对网络流量进行分类与控制,监控网络中的各流量状态,并根据应用的需求实施面向用户、带宽、业务类型和服务质量的流量控制,从而有效地利用网络带宽,保障网络的正常运行。
在网络服务质量(QoS)领域里,流量管理被作为其重要的研究方向。目前,很多网络硬件厂商都在防火墙、路由器等网络关键上设备整合了流量管理功能,也有厂家推出了基于ASIC芯片的专业流量控制设备,这些基于硬件的流量管理设备具有高性能和高可靠性等特点,但价格不菲,并且在部署和使用过程中缺乏灵活性和可定制性。Linux作为一个优秀的网络操作系统,在对网络QoS的支持有着得天独厚的优势。通过Linux内核(Kernel)中的流量控制(TC)模块完全可以实现网络流量的颗粒控制,而且灵活性非常高。
目前,Linux内核已经发展到Kernel 2.6版本,其带宽管理模块(TC)通过这几年的发展,已经变得非常成熟和稳定。TC模块主要包括队列规定(Queuing discip line)、过滤器(Filter)、类(Class)这三个关键组件。[2]
Linux的带宽管理模块(TC)会将流经网络接口的数据包按某种队列算法放入相应的队列,并通过优先级、大小、长度等队列规定来控制数据包发送,从而达到对流量的控制。能够实现流量控制功能的队列规定主要有:CLASSLESSQDISC(无类队列规定)和CLASSFULQDIS(分类队列规定)两种。
无类队列规定能够接受数据包和重组、延迟或丢弃数据包。这可以用作对于整个网络接口的流量进行整形,但不细分各种情况,属于粗放型的流量管理。典型的无类队列规定有SFQ(随机公平队列)、TBF(令牌桶过滤器)、pfifo-fast(先进现出)、ID(前向随机丢包)。
在分类队列规定的概念里扩展了Class(类)和Filter(过滤器)两个组件,在类和过滤器的支持下, Linux可以根据数据包的类型、优先级别等来区分不同类型的流量,然后通过不同的队列规则来控制数据包的发送方式,以实现对流量的控制。
典型的分类队列规定主要有以下几种:
1)CBQ(Class Based Queueing,基于类的队列)
CBQ是一种基于类的可以包含其它队列的超级队列,CBQ会根据对流量特征处理数据包,并确保一定的传输速率,在接收数据包时根据IP协议头、IP地址、应用程序或协议、URL或其它信息等进行分类。每类流量被分配到指定的FIFO (FirstInFirstOut)队列。如果队列为空闲,带宽便可以供其它队列使用,即带宽借用。
2)HTB(Hierarchical Token Buchet,分层的令牌桶)
HTB实际是在TBF上发展起来的,它的分层机制使网络在带宽固定的情况下很容易实现对每个类别的带宽分配,同时还允许特定的类可以突破带宽上限,占用别的类的空闲带宽,这对要在具有固定连接速率的链路上实现带宽管理非常方便。
3)PRIO:PRIOQDisc
PRIO不能限制带宽,因为属于不同类别的数据报是顺序离队。使用PRIO Qdisc可以很容易对流量进行优先级管理,只有属于高优先级类别的数据报全部发送完毕,才会发送属于低优先级类别的数据报。为方便管理,需要使用iptables或者ipchain处理数据包的服务类型(Type Of Service, TOS)。
在分类队列中使用过滤器区别不同类型的数据包,过滤器根据源IP地址、端口、目地IP、端口、协议类型、TOS字节、网络接口等参数或准则将进入队列的数据包分为不同的类。类由队列规定来管理,它和队列规定紧密联系在一起。不同的类对应着不同的队列规定,类本身不储存数据包,而是利用队列规定来管理其所拥有的数据。它们之间的关系如图1所示。
Linux下常用的过滤器有fwmark、u32、route等,通过这些过滤器可以区别不同类型的网络流量。fwmark过滤器是根据防火墙对数据包所做的特定标记进行判断;u32过滤器基于哈希表实现,能够对当前通过的数据包进行匹配的特征定义; route过滤器是根据数据如何被路由进行判断。
在过滤器里有protocol、parent、prio、hand le、fw、u32这些参数需要进行设置。protocol是必要参数,指的是过滤器所接受的协议。parent也是必要参数,用来明确过滤器附带在哪个句柄上,句柄必须是一个已经存在的类。prio是用来说明分类器的优先权值,优先权值低的优先级越高。handle是过滤器句柄的描述,对于不同过滤器,它的意义不同。
TC的实现涉及到队列(Queue),分类器(Class)和过滤器(Filter)三个关键组件。
队列用来实现控制网络的收发速度。通过队列,Linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(如TCP)的前提下来平滑网络流量。需要注意的是,基于IP/TCP平行协议族的特点,TC对流量控制的实现一般都在发送队列上来实现,即“控发不控收”。对于Linux防火墙来说,控制下行速率需要在对内接口上实施,而控制上行速率则需要在对外接口上实施。[3]
Class用来表示控制策略。很多时候可能要对不同的IP实施不同的流量控制策略,此时可用不同的Class来表示不同的控制策略。
Filter用来将流量划入到具体的控制策略中(即不同的Class中)。比如,要对A、B两个IP产生的流量实行不同的控制策略(C、D),这时,可以用Filter将A流量划入到控制策略C,将B流量划入到控制策略D,Filter划分的标志位可用u32打标功能或iptables的set-mark功能来实现。
Linux流量控制模块提供一个用户状态下的TC命令,可以通过TC命令来实现对流量的管理。
先假设一个简单的网络环境,如图2所示。
流量控制器(TC)上有两个网络接口,连接ISP的对外接口为eth0,分配公网IP地址:a.b.c.d,最大带宽为50Mbps。连接内部网络的为eth1,分配私有IP地址:192.168.1.1。另有三台内网主机1、主机2和主机3,各主机的IP地址分配见图2。
现在需要对内网主机实施以下的流量管理:
1)控制内网主机1、主机2和主机3的下行(下载)速率分别为为8Mbps、15Mbps和20Mbps;
2)控制内网主机1、主机2和主机3的上行(上载)速率分别为为5Mbps、8Mbps和10Mbps;
对下行速率的控制,需要在TC的内接口上实施,基本步骤如下:
1)在流量控制器(TC)内接口上(eth1)绑定一个HTB队列用以控制下行速率,指定缺省分类为2:40,没有被过滤的流量将进行这个缺省分类。
tc qdisc add dev eth1 root handle 2:0 htb default40
2)建立主干分类,并指定最大带宽为50Mbit,允许突发流量15Kbit。
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 50Mbit burst15kbit
3)在内接口上队列(HTB)上为三台内网主机分别建立相应速率的子分类;最后一条命令创建默认分类。
tc class add dev eth1 parent 2:1 classid 2:10 htb rate 8Mbit burst 15kbit
tc class add dev eth1 parent 2:1 classid 2:20 htb rate 10Mbit burst 15kbit
tc class add dev eth1 parent 2:1 classid 2:30 htb rate 15Mbit burst 15k
tc class add dev eth1 parent 2:1 classid 2:40 htb rate 7Mbit burst 15k
4)在每个类下面再附加上另一个随机公平队列(SFQ),以保证带宽的平均公平使用。
tc qdisc add dev eth1 parent 2:10 hand le 10: sfq perturb 10
tc qdisc add dev eth1 parent 2:20 hand le 20: sfq perturb 10
tc qdisc add dev eth1 parent 2:30 hand le 30: sfq perturb 10
tc qdisc add dev eth1 parent 2:40 hand le 30: sfq perturb 10
5)根据下行流量控制要求建立相应的u32过滤器;最后一条命令创建默认流量的过滤器,可以省略。
tc filter add dev eth0 protocol ip parent2:0 prio 2 u32match ip dst 192.168.1.2/32 flowid 2:10
tc filter add dev eth0 protocol ip parent2:0 prio 2 u32match ip dst 192.168.1.3/32 flowid 2:20
tc filter add dev eth0 protocol ip parent2:0 prio 2 u32match ip dst 192.168.1.4/32 flowid 2:30
tc filter add dev eth0 protocol ip parent2:0 prio 3 u32 match ip dst 192.168.1.0/24 flowid 2:40
对上行速率的控制,需要在TC的对外接口上实施,但需要以下两个方面的问题:
1)因为内部网络使用的是私有地址,内部IP产生的上行流量在经过外网卡(eth0)时会进行NAT转换,所以不能用源地址进行u32过滤,需要使用fw过滤器进行流量标识;
2)在使用fw过滤器分类的时候优先级一定不能相同,否则将失效。
基本步骤如下:
1)使用iptables在TC的内接口处为三台内网主机的上行流量分别打上不同的mark,以此来标识不同的数据流,为fw过滤分类时所使用;
iptables-A PREROUTING-tmangle-ieth1 -s 192.168.1.2/32-j MARK--set-mark 1
iptables-A PREROUTING-tmangle-ieth1 -s 192.168.1.3/32-j MARK--set-mark 2
iptables-A PREROUTING-tmangle-ieth1 -s 192.168.1.4/32-j MARK--set-mark 3
2)如同控制下行流量一般,在eth0上建立HTB队列、主干、子分类及默认分类;
tc qdisc add dev eth0 roothand le 1:0 htb default 40
tc classadd dev eth0 parent 1:0 classid 2:1 htb rate 50Mbit burst 15kbit
tc class add dev eth0 parent 1:1 classid 2:10 htb rate 5Mbitburst 15kbit
tc class add dev eth0 parent 1:1 classid 2:20 htb rate 8Mbitburst 15kbit
tc class add dev eth0 parent 1:1 classid 2:30 htb rate 10Mbit burst 15k
tc class add dev eth0 parent 1:1 classid 2:40 htb rate 27Mbit burst 15k
3)附加一个随机公平队列(SFQ),以保证带宽的平均公平使用。
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 2:20 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 2:30 handle 30: sfq perturb 10
tc qdisc add dev eth0 parent 2:40 handle 30: sfq perturb 10
4)创建相应的fw过滤器,注意使用不同的优先级(prio)。
tc filter add dev eth0 parent1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 1 fw classid 1:20
tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 1 fw classid 1:30
tc filter add dev eth0 parent 1:0 p rotocol ip prio 4 handle 1 fw classid 1:40
通过以上命令,便可以实现对内网主机的上/下行流量的管理。
Linux作为一个开源的操作系统,可以通过其强大的脚本程序来灵活地控制内部网络的上/下行流量,包括对不同类型流量(如HTTP、DNS、SYN等)进行优先级的调整,以保证关键服务的质量。同样,也可以对TC进行二次开发,设计出适用性强的可视化流量管理系统,如今已有一些网络设备厂家在X86硬件平台下设计出基于Linux内核的流量控制设备。相比采用ASIC芯片设计的高端流量控制设备,通过Linux的TC在X86平台搭建的流量管理平台具有更高的性价比,而且Linux对硬件配置要求不高,在一台普通的PC机就可以通过Linux轻松地实现流量管理,对于大流量的园区网络则可以通过Linux集群技术将多台普通PC组合部署,构建更高性能的流量管理集群系统,以满足流量管理的需要。
网络流量的管理是目前困扰很多网络管理者的问题,对流量进行灵活的定制管理是当前网络管理的需要。实践证明通过Linux平台下的TC可以实现网络流量的有效控制与管理,改善网络的服务质量。
[1]林闯.计算机网络的服务质量QoS[M].北京:清华大学出版社,2004.
[2]祝琳.Linux网络系统对QoS的支持[J].计算机技术, 2002,(2):100-102.
[3]Bert Hubert.Linux的高级路由和流量控制[M].北京:人民邮电出版社,2005.
[编校:刘敏]
TC's Network Traffic Management Based on the Linux
GUO Zhengqiu
(Changsha Aeronautical Vocationaland Technical College,Changsha Hunan 410124)
This paper introduces the traffic controlor(TC)based on the Linux,discusses the related detailsof TC's queuing discipline,classification and filtermodules,lists some samples ofachieving network management by way of TC.
QoS;traffic management;queuing discipline;class;filter
TP393
A
1671-9654(2010)02-050-04
2010-03-15
郭正球(1980-),男,湖南沅江人,助理工程师,研究方向为软件工程、网络安全与管理。