TC在系统中的具体位置如图2所示,数据包流入系统后,进行路由选择:如果接收包的目的IP是本主机,那么将该包送给上层处理;否则需要进行转发,将接收包交到转发模块处理。转发模块同时也接收本主机上层(TCP/UDP等)产生的包。转发模块通过查看路由表,决定包的下一跳。然后,对包进行排列以便将它们传送到输出接口。TC正是在排列数据包时进行处理和实现的。
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所示,网络环境是百兆的局域网。
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新的难题。
参考文献
[1] RFC1633,Integrated Services
Daniel Bergqvist “TC command reference”
Werner Almesberge “Linux Traffic Control”
Linux的高级路由和流量控制HOWTO中文版
Netherlabs BV , Gregory Maxwell “Linux 2.4 Advanced Routing HOWTO”
Linux HTB队列规定指南中文版
TTCPW(WINDOWS版)使用方法 changys http://cpss.zz.ha.cn/