过滤器是对数据包进行分类工具 , 过滤器用与把数据包分类并放入相应的子队列 , 这些过滤器在分类的队列规定内部被调用 . 为了决定用哪个类处理数据包 , 必须调用所谓的"分类器链" 进行选择 . 这个链中包含了这个分类队列规定所需的所有过滤器 . 常用到的为 U32 过滤器
分类的一示例图: 当一个数据包入队的时候 , 每一个分支处都会咨询过滤器链如何进行下一步 . 典型的配置是在 1:1 处有一个过滤器把数据包交给 12:, 然后 12: 处的过滤器在把包交给 12:2. 你可以把后一个过滤器同时放在 1:1 处 , 而得到效率的提高 .
另外 , 你不能用过滤器把数据包向"上"送 . 而且 , 使用 HTB 的时候应该把所有的规则放到根上 ..
注 : 数据包只能向"下"进行入队操作 ! 只有处队的时候才会上到网卡所在的位置来 . 他们不会落到树的最
底层后送到网卡 ...
清单 6. 过滤器过滤示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip dport 22 0xffff flowid 10:1
在 10: 节点添加一个过滤规则 , 优先权 1: 凡是去往 22 口 ( 精确匹配 ) 的 IP 数据包 , 发送到频道 10:1..
#tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip sport 80 0xffff flowid 10:1
在 10: 节点添加一个过滤规则 , 优先权 1: 凡是来自 80 口 ( 精确匹配 ) 的 IP 数据包 , 发送到频道 10:1..
#tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
在 eth0 上的 10: 节点添加一个过滤规则 , 它的优先权是 2: 凡是上二句未匹配的 IP 数据包 , 发送到频道 10:2..
#tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1
去往 4.3.2.1 的包发送到频道 10:1 其它参数同上例
#tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1
来自 1.2.3.4 的包发到频道 10:1
#tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
凡上二句未匹配的包送往 10:2
#tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match
ip sport 80 0xffff flowid 10:1
可连续使用 match, 匹配来自 1.2.3.4 的 80 口的数据包
|
常用到的过滤命令一览
1
| #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 -------
|
根据源 / 目的地址
源地址段 'match ip src 1.2.3.0/24'
目的地址段 'match ip dst 4.3.2.0/24'
单个 IP 地址 'match ip 1.2.3.4/32'
根据源 / 目的端口 , 所有 IP 协议
源 'match ip sport 80 0xffff' 0xffff 表所有数据包
目的 'match ip dport 80 0xffff'
根据 IP 协议 (tcp, udp, icmp, gre, ipsec)
icmp 是 1:'match ip protocol 1 0xff' 1 是根据 /etc/protocols 协议号来定
根据 fwmark
1
2
| #iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6
#tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1
|
注 :handle 根据过滤器的不同 , 含义也不同
按 TOS 字段
1
| #tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff
|
flowid 1:4 选择交互和最小延迟的数据流 匹配大量传输 , 使用"0x08 0xff".
1
| #tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 match u32 00100000 00ff0000
|
at 0 flowid 1:10 匹配那些 TOS 字段带有'最小延迟'属性的数据包 |