HTB简单流量控制
#!/bin/bash#tc##2008-05-10#v0.0.0.1#简单的。因为有很多人要分享我的ADSL宽带,可是很多时候他们已经影响我正常使用#不得已,只好对他们进行限制一下。没有很好的进行设计,基本上达到了目的。刚刚学习中。。。LAN_IF="eth1"WAN_IF="eth0"DOWN_SPEED=640kbitUP_SPEED=64kbit#删除两个网卡上的队列 和外网网卡上的入口策略。tc qdisc del dev $LAN_IF root >/dev/null 2>&1 tc qdisc del dev $WAN_IF root >/dev/null 2>&1tc qdisc del dev $WAN_IF ingress >/dev/null 2>&1###############################################upload control##上传。带有SYN ACK标志的 最小延迟的 或者SSH 数据拥有最高优先级。WEB80端口第二,其他次之。#############################################建立队列,默认走1:13tc qdisc add dev $WAN_IF root handle 1: htb default 13#建立跟类tc class add dev $WAN_IF parent 1: classid 1:1 htb \ rate $UP_SPEED ceil $UP_SPEED prio 0#建立第一优先级分类,保证拥有30KBIT 最高可借用空闲带宽到64KBITtc class add dev $WAN_IF parent 1:1 classid 1:11 htb \ rate 30kbit ceil $UP_SPEED prio 1#建立第二优先级分类tc class add dev $WAN_IF parent 1:1 classid 1:12 htb \ rate 20kbit ceil $UP_SPEED prio 2#建立第三优先级分类tc class add dev $WAN_IF parent 1:1 classid 1:13 htb \ rate 10kbit ceil $UP_SPEED prio 3#使用SFQ,防止连接被其他链接淹没tc qdisc add dev $WAN_IF parent 1:11 handle 10: sfq perturb 5tc qdisc add dev $WAN_IF parent 1:12 handle 20: sfq perturb 10tc qdisc add dev $WAN_IF parent 1:13 handle 30: sfq perturb 10##############filter##############1:11 最高优先级分类的数据#小于64带ACK的TCP数据包tc filter add dev $WAN_IF parent 1: prio 1 protocol ip u32 \ match ip protocol 0x6 0xff \ match u8 0x10 0xff at nexthdr+13 \ match u16 0x0000 0xffc0 at 2 \ flowid 1:11#SYN的TCP数据包tc filter add dev $WAN_IF parent 1: prio 1 protocol ip u32 \ match ip protocol 0x6 0xff \ match u8 0x2 0xff at nexthdr+13 \ flowid 1:11#最小延迟的tc filter add dev $WAN_IF parent 1: prio 1 protocol ip u32 \ match ip protocol 0x6 0xff \ match ip tos 0x10 0xff \ flowid 1:11#端口为0x16即22 SSH端口的tc filter add dev $WAN_IF parent 1: prio 1 protocol ip u32 \ match u16 0x0016 0xffff at nexthdr+2 \ flowid 1:11#0x0035 53端口 DNS服务tc filter add dev $WAN_IF parent 1: prio 1 protocol ip u32 \ match u16 0x0035 0xffff at nexthdr+2 \ flowid 1:11#1:12 拥有第二优先级的数据#端口是0x50 即80端口的数据tc filter add dev $WAN_IF parent 1: prio 2 protocol ip u32 \ match u16 0x0050 0xffff at nexthdr+2 \ flowid 1:12#1:13 无所谓的数据##################ingress 入口策略##################设置入口策略,丢掉来的太快的包。突发值为10Ktc qdisc add dev $WAN_IF handle ffff: ingresstc filter add dev $WAN_IF parent ffff: protocol ip prio 10 u32 \ match ip src 0.0.0.0/0 police rate $DOWN_SPEED burst 10k drop flowid :1 #############################################################download control.##下载控制。可以使用IMQ。不过我在连接内网的网卡上进行控制,也达到了效果。感觉上一样。#基于IP地址的流量控制。因为要限制的IP比较多,所以使用了散列表,减少包经过过滤器的次数。#并没有严格的 让所有子分类带宽和等于根分类带宽,实际IP使用数量也不多,没有感觉出不妥。###########################################################建立跟队列tc qdisc add dev $LAN_IF root handle 1: htb #建立跟分类tc class add dev $LAN_IF parent 1: classid 1:1 htb rate $DOWN_SPEED#建立跟过滤器tc filter add dev $LAN_IF parent 1: prio 5 protocol ip u32#建立过滤器容器 ,拥有256个表tc filter add dev $LAN_IF parent 1: prio 5 handle 2: protocol ip u32 divisor 256i=1while [ $i -lt 254 ]do# 建立该IP的分类 tc class add dev $LAN_IF parent 1:1 classid 1:1$i htb \ rate 128kbit ceil 256kbit burst 15k# 将发往该IP的数据匹配到该IP的分类。 tc filter add dev $LAN_IF parent 1: protocol ip prio 5 u32 \ ht 2:`echo "obase=16;$i"|bc`: \ match ip dst 192.168.0.$i flowid 1:1$i i=$(($i+1))done #建立散列过滤器,根据目的IP地址最后一个字节控制将数据包发往合适的散列表项。tc filter add dev $LAN_IF protocol ip parent 1: prio 5 u32 ht 800:: \ match ip dst 192.168.0.0/24 \ hashkey mask 0x000000ff at 16 \ link 2:#以上是我自己写的简单流量控制,并不十分准确。欢迎指点。
- 最新评论