本文主要介绍Linux网络流量控制基本原理和路由软件Coyote Linux,并联系实际网络环境,使用Coyote Linux配置路由服务器,利用TC命令进行不同网络流量需求的控制,实现了专业路由器的流量控制功能。
1 引言
随着计算机应用的普及和Internet的不断发展,计算机网络更广泛的应用到了各行各业,多台计算机共享宽带上网的情况也变得很普遍。现在对于ADSL来说,大都是开启ADSL Modem的路由功能实现宽带共享,对于一些LAN宽带来讲,一般是使用宽带路由器,但是单独购买宽带路由器也是一笔不小开支,而且对网络也不能进行有效实际地控制和管理。利用淘汰下来的旧电脑来做成专业的宽带路由服务器,并且对连网的计算机进行流量控制或网络管理就成了一些网络管理人员的选择。
2 Coyote Linux路由软件
现在网上有很多制作软件宽带路由器的软件,比如一盘秀、网络神牛、FD Linux、LRP(Linux Router Project Linux路由工程)、FLi4L、Freecso、Coyote Linux等,这些软件有一个共同的特点,都是基于Linux,可以在一张软盘上运行。其中Coyote Linux是一个不错的路由软件,俗称“北美小银狼”,这款路由软件是免费的。它是基于Linux 2.4.29 的系统内核,一台486以上,8M内存以上的普通PC,再加两块网卡就可以稳定运行,支持Ethernet (静态的和动态DHCP), PPPoE, PPP拨号连接等上网方式,支持防火墙和QOS流量控制,支持SSH 2.0远程操作和远程web管理等,功能非常强大,和专业路由器相比毫不逊色。
Coyote Linux软件可以到它的官方网站http://www.CoyoteLinux.com下载,现在最新的版本是Coyote Linux 2.24,它提供了一个在windows下运行的向导程序,解压缩后运行coyote.exe,按照制作向导提示根据自己的实际网络情况设置好参数,最后插入空白软盘就可以制作出一张Coyote Linux路由服务器启动软盘。如果参数设置正确的话,用该软盘启动计算机就成了一台宽带路由服务器,内部的多台计算机就可以通过它共享连入Internet。
3 流量控制的基本原理
Linux操作系统中的流量控制器(Traffic Control)主要是通过在输出端口处建立一个队列来实现流量控制。Linux流量控制的基本原理如图1所示。
图1 Linux流量控制的基本原理
接收包从输入接口(Input Interface)进来后,经过流量限制(Ingress Policing)丢弃不符合规定的数据包,由输入多路分配器(Input De-Multiplexing)进行判断选择:如果接收包的目的是本主机,那么将该包送给上层处理;否则需要进行转发,将接收包交到转发块(Forwarding Block)处理。转发块同时也接收本主机上层(TCP、UDP等)产生的包。转发块通过查看路由表,决定所处理包的下一跳。然后,对包进行排列以便将它们传送到输出接口(Output Interface)。一般我们只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以我们可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。
Linux流量控制主要由三大部分来实现:
◆ 队列规则(Queue Discipline)
无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的QDisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从QDisc里面取出数据包,把它们交给网络适配器驱动模块。
◆ 分类(Classes)
某些QDisc(排队规则)可以包含一些类别,不同的类别中可以包含更深入的QDisc(排队规则),通过这些细分的QDisc还可以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据流量的优先级。
◆ 过滤器(Filters)
filter用于为数据包分类,决定它们按照何种QDisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用filter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和QDisc有关。
因此,Linux流量控制主要分为建立队列、建立分类和建立过滤器三个方面。其基本实现步骤为:
(1) 针对网络物理设备(如以太网卡eth0)绑定一个队列QDisc;
(2) 在该队列上建立分类class;
(3) 为每一分类建立一个基于路由的过滤器filter;
(4) 最后与过滤器相配合,建立特定的路由表。
4 Coyote Linux中流量控制
某学校网络结构图如图2所示,连接到Internet的线路带宽为10M,校内有两个不同带宽的局域网:局域网1和局域网2,局域网1有 8 兆的带宽给教师来上网查阅资料,局域网2需要2 兆的带宽给学生上网使用。校内局域网和Internet连接采用安装了两块RTL8139网卡的P166 32M计算机,用制作好的Coyote Linux路由软盘启动成为路由服务器。在此路由服务器上就需要一种策略,来进行流量控制和网络管理。
图2网络结构图
Coyote Linux 路由服务器有两个网卡eth0 和eth1。如图3所示eth0 连接到校内的局域网LAN上,eth1连接到广域网Internet上。 通过修改 eth0 上的输出队列,我们可以确定校内计算机的下载(download)速率;通过修改 eth1 上的输出队列,我们可以确定校内计算机的上载(upload)速率。
图3 路由服务器接口图
以下就是在Coyote Linux路由服务器上对校内计算机下载的网络流量控制方法,要想对上载的网络流量进行控制方法是一样的,只要在eth1上再建立一套规则。
4.1建立队列
在网卡eth0的输出接口上建立一个队列。
将一个CBQ队列绑定到网络物理设备eth0上,其编号为1:0,实际带宽为10Mb,包的平均大小为1000字节,包间隔发送单元的大小为8字节,最小传输包大小为64字节。
#tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 10Mbit cell 8 avpkt 1000 mpu 64
4.2 建立分类
对内部不同网络流量的局域网建立不同的分类,分类建立在队列之上。针对一个队列需建立一个根分类,然后在其上建立子分类。对于分类,按其分类的编号顺序起作用,编号小的优先。一旦符合某个分类匹配规则,通过该分类发送数据包,则其后的分类不再起作用。
(1)创建根分类1:1,分配带宽为10Mb。
#tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit allot 1514 cell 8 weight 1Mbit prio 8 maxburst 20 avpkt 1000
该队列的最大可用带宽为10Mb,实际分配的带宽为10Mb,可接收冲突的发送最长包数目为20字节,最大传输单元(加MAC头)大小为1514字节,优先级别为8,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为10Mb。
(2)创建分类1:10,其父分类为1:1,分配带宽为8Mb。
#tc class add dev eth0 parent 1:1 classid 1:10 cbq bandwidth 10Mbit rate 8Mbit allot 1514 cell 8 weight 800Kbit prio 5 maxburst 20 avpkt 1000 bounded isolated
该队列的最大可用带宽为10Mb,实际分配的带宽为 8Mb,可接收冲突的发送最长包数目为20字节,最大传输单元(加MAC头)大小为1514字节,优先级别为5,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为800Kb,独占带宽且不可借用未使用带宽。
(3)创建分类1:20,其父分类为1:1,分配带宽为2Mb。
#tc class add dev eth1 parent 1:1 classid 1:20 cbq bandwidth 10Mbit rate 2Mbit allot 1514 cell 8 weight 200Kbit prio 5 maxburst 20 avpkt 1000 bounded isolated
该队列的最大可用带宽为10Mb,实际分配的带宽为 2Mb,可接收冲突的发送最长包数目为20字节,最大传输单元(加MAC头)大小为1514字节,优先级别为5,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为200Kb,独占带宽且不可借用未使用带宽。
4.3 管理队列
创建队列,告诉内核使用SFQ随机公平队列来管理队列。
SFQ针对一个TCP或UDP流,流量被分成相当多数量的FIFO(先进先出)队列,使用散列算法将所有的对话映射到这些FIFO队列,数据按照简单轮转的方式发送,每个会话都按顺序得到发送机会。
#tc qdisc add dev eth0 parent 1:10 sfq quantum 1514b perturb 15 #tc qdisc add dev eth0 parent 1:20 sfq quantum 1514b perturb 15
上面就是创建SFQ管理队列,每个FIFO队列传输1514bit后切换到下一FIFO个队列,每15秒后重新配置一次散列算法。
4.4建立过滤器
过滤器主要服务于分类,只需针对根分类提供一个过滤器。
(1)应用u32分类器到分类1:10,父分类编号为1:0,优先级为100,过滤协议为IP,目标地址为192.168.1.0/24。
#tc filter add dev eth0 protocol ip parent 1:0 prio 100 u32 match ip dst 192.168.1.0/24 flowid 1:10
(2)应用u32分类器到分类1:20,父分类编号为1:0,优先级为25,过滤协议为IP,目标地址为192.168.2.0/24。
#tc filter add dev eth0 protocol ip parent 1:0 prio 25 u32 match ip dst 192.168.2.0/24 flowid 1:20
在Coyote Linux路由服务器中通过以上配置操作,可以实现校内两个局域网不同的下载速度,实现了网络的流量控制,如果要进行更多的流量控制的话,就需要用TC命令进行更详细的规则配置。
5 总结
利用淘汰的电脑和路由软件配置成一个具有流量控制和网络管理的专业路由器,作为中小企业部门内部网络和外部Internet连接的桥梁有着很大的实用意义。这样可以节约资金,充分利用空余资源,实现安全、可靠、灵活的网络管理方案,也可以为网络技术人员对网络更深入地分析研究提供了一个良好的环境。