就象在分类的队列规定一段中解释的,过滤器用与把数据包分类并放入相应的子队列。这些过滤器在分类的队列规定内部被调用。下面就是我们可用的分类器(部分):fw根据防火墙如何对这个数据包做标记进行判断。u32根据数据包中的各个字段进行判断,如源IP地址等等。route根据数据包将被哪条路由进行路由来判断。rsvp,rsvp6根据数据包的RSVP情况进行判断。只能用于你自己的网络,互联网并不遵守RSVP。tcindex用于DSMARK队列规定。通常来说,总有很多途径可实现对数据包分类,最终取决于你喜欢使用哪种系统。分类器一般都能接受几个参数,为了方便我们列出来:protocol这个分类器所接受的协议。一般来说你只会接受IP数据。必要参数。parent这个分类器附带在哪个句柄上。句柄必须是一个已经存在的类。必要参数。prio这个分类器的优先权值。优先权值低的优先。handle对于不同过滤器,它的意义不同。后面所有的节都假定你试图对去往HostA的流量进行整形。并且假定根类配置为1:,并且你希望把选中的数据包送给1:1类。1.u32分类器U32分类器是当前实现中最先进的过滤器。全部基于哈希表实现,所以当有很多过滤器的时候仍然能够保持健壮。U32过滤器最简单的形式就是一系列记录,每条记录包含两个部分:一个选择器和一个动作。下面要讲的选择器用来与IP包相匹配,一旦成功匹配就执行其指定的动作。最简单的动作就是把数据包发送到特定的类队列。用来配置过滤器的tc命令行由三部分组成:过滤器说明、选择器和动作。一个过滤器可以如下定义:tcfilteradddevIF[protocolPROTO][(preference|priority)PRIO][parentCBQ]上面行中,protocol字段描述了过滤器要匹配的协议。我们将只讨论IP协议的情况。preference字段(也可以用priority代替)设置该过滤器的优先权。这非常重要,因为你可能有几条拥有不同优先权的过滤器。每个过滤器列表都按照输入的顺序被扫描一遍,然后优先权值低(更高的偏好值)的列表优先被处理。“parent”字段定义了过滤器所属的CBQ的顶部(如1:0)。上面描述的选项适用于所有过滤器,而不仅仅适用于U32。1).U32选择器u32选择器包含了能够对当前通过的数据包进行匹配的特征定义。它其实只是定义了IP包头中某些位的匹配而已,但这种看似简单的方法却非常有效。让我们看看这个从实际应用的系统中抄来的例子:#tcfilteradddeveth0protocolipparent1:0pref10u32\matchu320010000000ff0000at0flowid1:10现在,命令的第一行已经不用解释了,前面都说过了。我们把精力集中在用“match”选项描述选择器的第二行。这个选择器将匹配那些IP头部的第二个字节是0x10的数据包。你应该猜到了,00ff就是匹配掩码,确切地告诉过滤器应该匹配哪些位。在这个例子中是0xff,所以会精确地匹配这个字节是否等于0x10。“at”关键字的意思是指出从数据包的第几个字节开始匹配——本例中是从数据包的开头开始。完全地翻译成人类语言就是:“匹配那些TOS字段带有‘最小延迟’属性的数据包”。让我们看看另一个例子:#tcfilteradddeveth0protocolipparent1:0pref10u32\matchu32000000160000ffffatnexthdr+0flowid1:10“nexthdr”选项意味着封装在IP包中的下一个PDU的头部,也就是说它的上层协议的头。匹配操作就是从这个协议的头部开始的,应该发生在头部开始的第16位处。在TCP和UDP协议的头部,这个部分存放的是这个报文的目标端口。数字是按照先高厚低的格式存储的,所以0x0016就是十进制的22(如果是TCP的话就是ssh服务)。其实,这个匹配在没有上下文的情况下含义很模糊,我们放理解了上面的例子之后,下面这条选择器就很好懂了:matchc0a80100ffffff00at16表示了:匹配从IP头开始数的第17个字节到第19个字节。这个选择器将匹配所有去往192.168.1.0/24的数据包。成功分析完上面这个例子后,我们就已经掌握u32选择器了。2).普通选择器普通选择器定义了要对数据包进行匹配的特征、掩码和偏移量。使用普通选择器,你实际上可以匹配IP(或者上层协议)头部的任意一个bit,虽然这样的选择器比特殊选择器难读和难写。一般选择器的语法是:match[u32|u16|u8]PATTERNMASK[atOFFSET|nexthdr+OFFSET]利用u32、u16或u8三个关键字中的一个来指明特征的bit数。然后PATTERN和MASK应该按照它定义的长度紧挨着写。OFFSET参数是开始进行比较的偏移量(以字节计)。如果给出了“nexthdr+”关键字,偏移量就移到上层协议头部开始的位置。一些例子:#tcfilteradddevppp14parent1:0prio10u32\matchu8640xffat8\flowid1:4如果一个数据包的TTL值等于64,就将匹配这个选择器。TTL就位于IP包头的第9个字节。匹配带有ACK位的TCP数据包:#tcfilteradddevppp14parent1:0prio10u32\matchipprotocol60xff\matchu80x100xffatnexthdr+13\flowid1:3用这个匹配小于64字节的ACK包:##matchacksthehardway,##IPprotocol6,##IPheaderlength0x5(32bitwords),##IPTotallength0x34(ACK+12bytesofTCPoptions)##TCPackset(bit5,offset33)#tcfilteradddevppp14parent1:0protocolipprio10u32\matchipprotocol60xff\matchu80x050x0fat0\matchu160x00000xffc0at2\matchu80x100xffat33\flowid1:3这个规则匹配了带有ACK位,且没有载荷的TCP数据包。这里我们看见了同时使用两个选择器的例子,这样用的结果是两个条件进行逻辑“与”运算。如果我们查查TCP头的结构,就会知道ACK标志位于第14个字节的第5个bit(0x10)。作为第二个选择器,如果我们采用更复杂的表达,可以写成“matchu80x060xffat9”,而不是使用特殊选择器protocol,因为TCP的协议号是6(写在IP头的第十个字节)。另一方面,在这个例子中我们不使用特殊选择器也是因为没有用来匹配TCP的ACK标志的特殊选择器。下面这个选择器是上面选择器的改进版,区别在于它不检查IP头部的长度。为什么呢?因为上面的过滤器只能在32位系统上工作。tcfilteradddevppp14parent1:0protocolipprio10u32\matchipprotocol60xff\matchu80x100xffatnexthdr+13\matchu160x00000xffc0at2\flowid1:33).特殊选择器下面的表收入了本节文档的作者从tc程序的源代码中找出的所有特殊选择器。它们能够让你更容易、更可靠地配置过滤器。求助:tableplaceholder-thetableisinseparat
上一篇:防护SYN洪水攻击_网络技术
下一篇:带宽管理的队列规定_网络技术