Linux流量控制---过滤规则/U32--实例解析
LinuxIII---过滤/U32
过滤器是对数据包进行分类工具,过滤器用与把数据包分类并放入相应的子队列,这些过滤器在分类的队列规定内部被调用.为了决定用哪个类处理数据包,必须调 用所谓的"分类器链" 进行选择. 这个链中包含了这个分类队列规定所需的所有过滤器.常用到的为U32过滤器.., 下图为分类的一示例图:
根1:
|
1:1 <-----加过滤器位置
/ | \
10: 11: 12: <-----加过滤器位置
/ \ / \
10:1 10:2 12:1 12:2
当一个数据包入队的时候,每一个分支处都会咨询过滤器链如何进行下一步.典型的配置是在1:1处有一个过滤器把数据包交给12:,然后12:处的过滤器在把包交给12:2.你可以把后一个过滤器同时放在1:1处,而得到效率的提高.
另外,你不能用过滤器把数据包向"上"送.而且,使用HTB的时候应该把所有的规则放到根上..
注:数据包只能向"下"进行入队操作!只有处队的时候才会上到网卡所在的位置来.他们不会落到树的最
底层后送到网卡...
过滤器过滤示例:
#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口的数据包
常用到的过滤命令一览
#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
#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字段
#tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff
flowid 1:4 选择交互和最小延迟的数据流 匹配大量传输,使用"0x08 0xff".
#tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 match u32 00100000 00ff0000
at 0 flowid 1:10 匹配那些TOS字段带有'最小延迟'属性的数据包
U32过滤器相对比较繁琐,一般不常用,感兴趣的朋友可以参考HOWTO中文档...推荐iptables打标记的方式来实现tc过滤器的功能...
Linux流量控制IV---
以下二例是工作中用到的,贴出来算对流量控制的一种理解吧..呵呵.
1.PRIO 分类优先算法(从左至右优先发包)
eth0 1:
/ | \
1:1 1:2 1:3
/ | \
11: 12: 13:
#tc ad add dev eth0 root handle 1: prio hands 3 priomap 1---1 16个1(tos比特) 表示所有数据包
注:此命令自动在1:下创建三子类 1:1 1:2 1:3 此例中只用到 1:1
#tc qd add dev eth0 parent 1:1 handle 11:sfq
#tc qdisc add dev eth0 parent 1:1 handle 12: tbf rate 20kbit buffer 1600 limit 3000
#tc qd add dev eth0 parent 1:1 handle 13:sfq
#tc filter add dev eth0 parent 1:1 prio 1003 protocol ip
u32 match ip src 192.168.1.0/24 flowid 1:13
#tc filter add dev eth0 parent 1:1 prio 1001 protocol ip
u32 match ip src 10.0.0.0/8 flowid 1:12
#tc filter add dev eth0 parent 1:1 protocol ip prio 1001
u32 match ip tos 0x10 0xff flowid 1:11 交互和最小延迟的数据流
2.HTB分层令牌桶
eth1 1:
|
1:1 1:1 2Mbit 1000个包 1:12默认
/ | \
11: 12: 13: 1:11 512kbit 100 1:12 1Mbit 100 1:13 2Mbit 100
#tc qd del dev eth1 root
#tc qdisc add dev eth1 root handle 1: htb default 12
#tc class add dev eth1 parent 1: classid 1:1 htb rate 2Mbit burst 1500000 在1:下定义子类1:1
#tc class add dev eth1 parent 1:1 classid 1:11 htb rate 512kbit burst 150000 ceil 1Mbit
#tc qd add dev eth1 parent 1:11 handle 111: sfq
#tc class add dev eth1 parent 1:1 classid 1:12 htb rate 1Mbit burst 150000 ceil 1Mbit
#tc qd add dev eth1 parent 1:12 handle 122: sfq 注:亦可不在1:12 class
- 最新评论