"怎么你自己不做一个 server 来玩?"
"怎样?什么 server?"
"做自己的 gateway, firewall, dns server 啦!"
(心想。。。反正没有做过,何不一试?)
经过了几个礼拜的琢磨,终于有了一点着落,但是限制网速的办法还是没有,只好用最牛的方法 (完全 command line) 来限制网速。仅仅用一个 TC command 来搞定。
对于这个 TC command,我到现在都还没完全了解,只是上网找了一找,然后一直 try n error 将近两个月才调到到比较稳定的变量;很 efficient,不会有人拿多速度。
可是问题是这个限制一次只给一整个 IP range / subnet,也就是说当限制 300kbits 的时候,整个IP range/subnet 共享一个速度 (300 kbits)。 这可不行,我的目标是每一个 IP 都有自己的速度,当他怎么下载,下载的几快都好,都不会影响别人的速度。
在不断的尝试下,以我有限的知识,我只能想到一个 IP 一个 rule 的办法 (最多 255 个 rules)。
就写了以下的 shell script 来省时省力。
let's say 我们的目标,network interface 是 eth1,然后 interface speed 是 100 mbits,只限制 192.168.1.21 到 192.168.1.50 的 IP,再给每一个受限制 IP 都享有最高 768 kbits 的速度。
以下红色部分是可更改的 (based on 我们的目标),其余的部分当然也可更改(个人建议维持这个变量)。
oK! 新手,自己消化!有问题请 email 到 nick_khor@hotmail.com
1:  #!/bin/sh  
2:  TC=/sbin/tc  
3:  startNum=21  
4:  DEV=eth1  
5:  IP=192.168.1.  
6:  endNum=50  
7:    
8:  LINERATE=100mbit  
9:  THROTTLERATE=768kbit  
10:  sfqMTU=1500  
11:  sfqInterval=10  
12:  avpktSize=1000  
13:  classPrio=5  
14:  filterPrio=16  
15:  allotByte=1500  
16:  weightSize=1000kbit  
17:    
18:  $TC qdisc del dev $DEV root >/dev/null  
19:  $TC qdisc add dev $DEV root handle 1: cbq avpkt $avpktSize bandwidth $LINERATE   
20:    
21:  while [ $startNum != $endNum ]; do  
22:       $TC class add dev $DEV parent 1: classid 1:$startNum cbq rate $THROTTLERATE avpkt $avpktSize cell 8 weight $weightSize allot $allotByte prio $classPrio bounded isolated  
23:       $TC filter add dev $DEV parent 1: protocol ip prio $filterPrio u32 match ip dst $IP$startNum flowid 1:$startNum  
24:       $TC qdisc add dev $DEV parent 1:$startNum sfq quantum $sfqMTU perturb $sfqInterval  
25:       echo "$IP$startNum is added"  
26:        startNum=$(($startNum+1))  
27:  done  
