Chinaunix首页 | 论坛 | 博客
  • 博客访问: 289047
  • 博文数量: 67
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 802
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 16:23
文章分类
文章存档

2011年(4)

2010年(18)

2009年(32)

2008年(13)

我的朋友

分类: LINUX

2009-10-29 11:09:54

继续前面的介绍。

      使用过滤器分类

每块网卡都有一个出口根排队规则,缺省情况下是pfifo_fast 排队规则。每个排队规则都指定一个句柄,句柄有两个部分,一个主号码和一个次号码。习惯上把根队列规定称为“1:”,等价于“10”。类的主号码必须与它们父辈的主号码一致。如下图。

数据包是在根队列规定处入队和出队的,而内核只同根打交道。一个数据包可能是按照下面这个链状流程进行分类的:1: -> 1:1 -> 12: -> 12:2,数据包现在应该处于12:2 下属的某个队列规定中的某个队列中。在这个例子中,树的每个节点都附带着一个过滤器,用来选择下一步进入哪个分支。然而,这样也是允许的:1: -> 12:2,也就是说,根所附带的一个过滤器要求把数据包直接交给12:2

当内核决定把一个数据包发给网卡的时候,根队列规定1:会得到一个出队请求,然后把它传给1:1,然后依次传给10:11:12:,然后试图从它们中进行 dequeue()操作。也就是说,内核需要遍历整颗树,因为只有12:2 中才有这个数据包。换句话说,类及其兄弟仅仅与其“父队列规定”进行交谈,而不会与网卡进行交谈。只有根排队规则才能由内核进行出队操作。而且,任何类的出队操作都不会比它们的父类更快。

为了决定用哪个类处理数据包,必须调用所谓的“分类器链” 进行选择。这个链中包含了这个分类队列规定所需的所有过滤器。

Linux下可用的分类器有fwu32route等。fw根据防火墙如何对这个数据包做标记进行判断;u32根据数据包中的各个字段进行判断;route根据数据如何被路由进行判断。rsvprsvp6根据数据包的RSVP 情况进行判断,它只能用于自己的网络,互联网并不遵守RSVPtcindex用于DSMARK排队规则。

分类器一般都能接受几个参数,如下:

protocol

分类器所接受的协议。一般来说只会接受IP 数据。必要参数。

parent  

分类器附带在哪个句柄上。句柄必须是一个已经存在的类。必要参数。

prio  

分类器的优先权值。优先权值低的优先。

handle  

对于不同过滤器,它的意义不同。

fw

fw分类器要依靠防火墙把需要引导的封包标识起来。所以必须先设定好防火墙,使用 ipchains/iptables给数据包打标签。

例如:iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 1

它的意思是把发往目的端口为53DNS)的UDP数据包都打上标记1

tc filter add dev eth0 parent 10: protocol ip prio 1 handle 1 fw classid 10:1

它的意思是打上标记为1的数据包优先级为1,并放入10:1队列中。

u32

u32分类器是当前很先进的过滤器。全部基于哈希表实现,所以当有很多过滤器的时候仍然能够保持健壮。u32 过滤器最简单的形式就是一系列记录,每条记录包含两个部分:一个选择器和一个动作。

u32 选择器包含了能够对当前通过的数据包进行匹配的特征定义。它其实只是定义了IP 包头中某些位的匹配而已,但这种看似简单的方法却非常有效。

例如:# tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 \

match u32 00100000 00ff0000 at 0 flowid 1:10

它的意思是匹配那些TOS 字段带有‘最小延迟’属性的数据包。

普通选择器定义了要对数据包进行匹配的特征、掩码和偏移量。使用普通选择器,可以匹配IP(或者上层协议)头部的任意一个bit。一般选择器的语法是:

match [ u32 | u16 | u8 ] PATTERN MASK [ at OFFSET | nexthdr+OFFSET]

利用u32u16 u8 三个关键字中的一个来指明特征的bit 数。然后PATTERNMASK 应该按照它定义的长度紧挨着写。OFFSET 参数是开始进行比较的偏移量(以字节计)。如果给出了“nexthdr+”关键字,偏移量就移到上层协议头部开始的位置。

例如:# tc filter add dev eth0 parent 10: prio 3 u32 \

       match ip protocol 6 0xff \

match u8 0x10 0xff at nexthdr+13 \

flowid 10:1

它的意思是匹配带有ACK 位的TCP 数据包,并将其放入10:1的队列中。

route

路由分类器基于路由表的路由结果进行过滤。当一个数据包穿越一个类,并到达一个标有“route”的过滤器的时候,它就会按照路由表内的信息进行分裂。

例如:# ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1 realm 10

tc filter add dev eth1 parent 1:0 protocol ip prio 100 route to 10 classid 1:10

目标网络192.168.10.0 定义为realm 10,凡是去往192.168.10.0 子网的数据包匹配到类1:10

阅读(2154) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~