Linux流量控制---过滤规则/U32--实例解析

kevin.Zhu 发布于:2013-12-26 12:58 分类:Tc流量控制  有 23 人浏览,获得评论 0 条  

LinuxIII---过滤/U32过滤器是对数据包进行分类工具,过滤器用与把数据包分类并放入相应的子队列,这些过滤器在分类的队列规定内部被调用.为了决定用哪个类处理数据包,必须调用所谓的"分类。

LinuxIII---过滤/U32oracle
过滤器是对数据包进行分类工具,过滤器用与把数据包分类并放入相应的子队列,这些过滤器在分类的队列规定内部被调用.为了决定用哪个类处理数据包,必须调用所谓的"分类器链" 进行选择. 这个链中包含了这个分类队列规定所需的所有过滤器.常用到的为U32过滤器.., 下图为分类的一示例图: unix
 根1:
 |
 1:1 <-----加过滤器位置
 / | \
 10: 11: 12: <-----加过滤器位置
 / \ / \ linux
 10:110:2 12:1 12:2


 当一个数据包入队的时候,每一个分支处都会咨询过滤器链如何进行下一步.典型的配置是在1:1处有一个过滤器把数据包交给12:,然后12:处的过滤器在把包交给12:2.你可以把后一个过滤器同时放在1:1处,而得到效率的提高.
 另外,你不能用过滤器把数据包向"上"送.而且,使用HTB的时候应该把所有的规则放到根上..

 注:数据包只能向"下"进行入队操作!只有处队的时候才会上到网卡所在的位置来.


过滤器过滤示例:
#在10:节点添加一个过滤规则,优先权1:凡是去往22口(精确匹配)的IP数据包,发送到频道10:1..
#tc filter add dev eth0 protocol ip parent10: prio 1 u32 match ip dport 22 0xffff flowid 10:1

#在10:节点添加一个过滤规则,优先权1:凡是来自80口(精确匹配)的IP数据包,发送到频道10:1..
#tc filter add dev eth0 protocol ip parent10: prio 1 u32 match ip sport 80 0xffff flowid 10:1

#在eth0上的10:节点添加一个过滤规则,它的优先权是2:凡是上二句未匹配的IP数据包,发送到频道10:2..
#tc filter add dev eth0 protocol ip parent10: prio 2 flowid 10:2

#去往4.3.2.1的包发送到频道10:1 其它参数同上例
#tc filter add dev eth0 parent 10:0 protocolip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1

#来自1.2.3.4的包发到频道10:1
#tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32match ip src 1.2.3.4/32 flowid 10:1

#凡上二句未匹配的包送往10:2
#tc filter add dev eth0 protocol ip parent 10: prio 2 flowid10:2

#可连续使用match,匹配来自1.2.3.4的80口的数据包
#tc filteradd dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src4.3.2.1/32 match ip sport 80 0xffff flowid 10:1


常用到的过滤命令一览:

根据源/目的地址
源地址段 'match ip src 1.2.3.0/24'
目的地址段 'match ip dst4.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 filteradd dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid1:1
注:handle根据过滤器的不同,含义也不同

按TOS字段
#tc filter add dev ppp0parent 1:0 protocol ip prio 10 u32 match ip tos 0x100xff

#匹配那些TOS字段带有'最小延迟'属性的数据包
#tc filteradd dev eth0 protocol ip parent 1:0 pref 10 u32 match u32 0010000000ff0000 at 0 flowid 1:10

U32过滤器相对比较繁琐,一般不常用,感兴趣的朋友可以参考HOWTO中文档...推荐iptables打标记的方式来实现tc过滤器的功能..

 

 


Linux流量控制IV---mysql
 以下二例是工作中用到的,贴出来算对流量控制的一种理解吧..呵呵.
oracle
1.PRIO 分类优先算法(从左至右优先发包)
ssh
 eth0 1: mysql
 / |\
oracle
 1:11:2 1:3
unix
 / | \ oracle
 11: 12: 13:linux


#tc ad add dev eth0 root handle 1: priohands 3 priomap 1---1 16个1(tos比特)表示所有数据包
注:此命令自动在1:下创建三子类 1:1 1:21:3 此例中只用到 1:1
#tc qd add dev eth0 parent 1:1 handle11: sfq
#tc qdisc add dev eth0 parent 1:1 handle12: tbf rate 20kbit buffer 1600 limit 3000
#tc qd add dev eth0 parent 1:1 handle13: sfq
#tc filter add dev eth0 parent 1:1 prio1003 protocol ip u32 match ip src192.168.1.0/24 flowid 1:13oracle
......

 

2.HTB分层令牌桶
 eth1 1:
 |
 1:1 1:1 2Mbit 1000个包 1:12默认
 / | \
 11: 12: 13: 1:11 512kbit100 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
#在1:下定义子类1:1
#tc class add dev eth1 parent 1: classid1:1 htb rate 2Mbit burst 1500000
#tc class add dev eth1 parent 1:1 classid1:11 htb rate 512kbit burst 150000 ceil 1Mbit
#tc qd add dev eth1 parent 1:11 handle111: sfq
#tc class add dev eth1 parent 1:1 classid1:12 htb rate 1Mbit burst 150000 ceil 1Mbit
#tc qd add dev eth1 parent 1:12handle 122: sfq 注:亦可不在1:12 class下定义122: qd
#tc class add dev eth1 parent 1:1 classid1:13 htb rate 2Mbit burst 150000 ceil 2Mbit unix
#tc qd add dev eth1 parent 1:13 handle133: sfq

#tc filter add dev eth1 parent 1: prio 10001 protocol ip u32 match ip src 192.168.1.0/24 flowid 1:12 #其它二类亦如此..

2.ADSL上网流量限控脚本

 ADSL带宽是下行3200Kbit,上行只有320Kbit
 eth 1:
 / \
1:1 1.2
/ \ / | | \
1:11 1: 12 1:21 1:22 1:231:24

优先顺序是1:11 1:12 1:21 1:22 1:23 1:24 脚本大致内容下:
tc qdisc add dev eth0 root handle1: htb default 24
tc class add dev eth0 parent 1: classid 1:1 htb rate 300kbit ceil 300kbit prio 0
tc class add dev eth0 parent 1: classid1:2 htb rate 150kbit prio 3
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 300kbit ceil 300kbit prio1
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 150kbit ceil 250kbit prio 2
tc class add dev eth0 parent 1:2 classid 1:21 htb rate 100kbit ceil 150kbit prio 4
tc class add dev eth0 parent 1:2 classid 1:22 htb rate 30kbit ceil 140kbit prio 5
tc class add dev eth0 parent 1:2 classid 1:23 htb rate 15kbit ceil 130kbit prio 6
tc class add dev eth0 parent 1:2 classid 1:24 htb rate 5kbit ceil 50kbit prio 7
tc qdisc add dev eth0 parent 1:11 handle 111: sfq perturb 5
tc qdisc add dev eth0 parent 1:12 handle 112: sfq perturb 5
tc qdisc add dev eth0 parent 1:21 handle 121: sfq perturb 10
tc qdisc add dev eth0 parent 1:22 handle 122: sfq perturb 10
tc qdisc add dev eth0 parent 1:23 handle 133: sfq perturb 10
tc qdisc add dev eth0 parent 1:24 handle 124: sfq perturb 10
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid1:11
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22
tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid1:23
tc filter add dev eth0 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24
 
1:11 最高优先级的数据包通道优先通过,主要为一些ACKSYN确认包..必要时全部占用..全速
1:12是很重要的数据道,给多点,最少给一半,但需要时可以再多一点.
rate 规划 1:2 = 1:21 + 1:22 + 1:23 + 1:24一般总数在50%-80%左右
1:21http,pop最常用,人数较多,易导致堵塞,不能给得太多,但不益太少.
1:22 smtp通道,优先低于1:21 以防发大的附件大量占用带宽
1:23ftp-data数据通道可能大量上传文件,rate不能给得太多,ceil设置大些(其它通道剩余带宽应用)
1:24无所谓通道,就是一般不是平时工作上需要的通道了,给小点,防止这些人在妨碍有正常工作需要的人
其次的工作即在iptables端对相应数据包打上标记...


3.Linux+NAT+TC
脚本是Linux NAT网关实例,根据此脚本思路,可进一步细致的进行针对于数据包的限制..
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat-F
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 124.42.97.36
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 124.42.97.36
iptables -I PREROUTING -t mangle -p tcp-s 192.168.0.0/24 -j MARK --set-mark 1
iptables -I PREROUTING -t mangle -p tcp -s192.168.1.0/24 -j MARK --set-mark 2
注:可分数据包类型标记

tc qdisc del dev eth0 root
#加一个根队列,速率用网卡的速率10Mbit,也可用上传的速率
tc qdisc add dev eth0 root handle 100: cbq bandwidth10Mbit avpkt 1000
#加一个根类
tc class add deveth0 parent 100:0 classid 100:1 cbq bandwidth 10Mbit rate 10Mbit allot 1514 weight1Mbit prio 8 maxburst 8 avpkt 1000 bounded
#加一个子类用于内网1速率限制为300Kbit
tc class add dev eth0 parent 100:1 classid100:2 cbq bandwidth 10Mbit rate 300Kbit allot 1513 weight30Kbit prio 5 maxburst 8 avpkt 1000 bounded
#加一个子类用于内网2速率限制为320Kbit
tc class add dev eth0 parent 100:1 classid100:3 cbq bandwidth 10Mbit rate 320Kbit allot 1513 weight32Kbit prio 6 maxburst 8 avpkt 1000 bounded
#设置队列规则
tc qdisc add dev eth0 parent 100:2 sfq quantum 1514 bperturb 15
tc qdisc add dev eth0 parent 100:3 sfq quantum 1514 bperturb 15

#将队列和fw过滤器映射起来 其中hand1的1是开始用iptables做的标记hand 2的2也是开始用
iptables 做的标记
tc filter add dev eth0 parent 100:0 protocol ip prio 1 handle 1 fw classid 100:2
tc filter add dev eth0 parent 100:0 protocol ip prio 2 handle 2 fwclassid 100:3
流量监测相关命令:
tc -s qdisc/class ls dev eth0
tc -s qdisc/class ls dev eth1
上述几例有在工作中用到的,也有网络整理的.对以后的流量控制可以起个参考作用..当然,例子不足以完全体现tc的强大功能,一句话iptables+tc的应用,只有你想不到的,没有做不到的...