天天看點

tc流控腳本 ,動态保證每個ip有1M帶寬

tc主腳本:

#!/bin/bash

#

. /root/tc_functions

NUM=2

DEV=eth0

init_tc $NUM

while : ; do

#IP=`netstat  -antup|grep ESTABLISHED |grep  80|cut -d ":" -f8`

IP=`netstat -antup|grep ESTABLISHED|grep 80|awk '{print $5}' |grep  -o  "\([0-9]\{1,3\}\.\)\{1,3\}[0-9]\{1,3\}"|sort  -rn |uniq -c|awk '{print $2}'`

free=0

for  i  in $IP

do

IP16=`ip_to_16 $i`

if  tc -s filter ls dev $DEV | grep $IP16 &>/dev/null ;then

continue;

fi 

for x in `seq $NUM`

change $x

if [  $free -eq 1 ];then

tc filter add dev $DEV parent 1: protocol ip prio 16 u32 match ip dst $i flowid 1:$x ;

free=0;

break 1;

fi

done

 tc filter add dev $DEV parent 1: protocol ip prio 16 u32 match ip dst 0.0.0.0/0 flowid 1:$[$NUM+1] ;

sleep 30

tc filter del dev eth0 parent 1: protocol ip prio 16 u32;

tc_functions:

function hd(){

case $1 in

10)

echo a;;

11)

echo b;;

12)

echo c;;

13)

echo d;;

14)

echo e;;

15)

echo f;;

*)

echo $1;;

esac

}

function ip_to_16(){

a=`echo $1|cut -d '.' -f1 `

b=`echo $1|cut -d '.' -f2 `

c=`echo $1|cut -d '.' -f3 `

d=`echo $1|cut -d '.' -f4 `

a1=$[$a/16]

a2=$[$a%16]

b1=$[$b/16]

b2=$[$b%16]

c1=$[$c/16]

c2=$[$c%16]

d1=$[$d/16]

d2=$[$d%16]

q1=`hd $a1` 

q2=`hd $a2`

q3=`hd $b1` 

q4=`hd $b2` 

q5=`hd $c1` 

q6=`hd $c2` 

q7=`hd $d1` 

q8=`hd $d2`

echo $q1$q2$q3$q4$q5$q6$q7$q8 

function change(){

        PAST=`tc -s class ls dev $DEV|grep  Sent |cut -d ' ' -f3|head -$1|tail -1`

        sleep 1

        NOW=`tc -s class ls dev $DEV|grep  Sent |cut -d ' ' -f3|head -$1|tail -1`

        [ $NOW  -eq $PAST ]&& free=1

function init_tc(){

tc qdisc del dev eth0 root

tc qdisc add dev eth0 root handle 1: htb r2q 1

local i 

for  i  in `seq $1`

tc class add dev eth0 parent 1: classid 1:$i htb rate 1mbit ceil 1mbit

tc class add dev eth0 parent 1: classid 1:$[$i+1] htb rate 2mbit ceil 2mbit

本文轉自biao007h51CTO部落格,原文連結:http://blog.51cto.com/linzb/1766222 ,如需轉載請自行聯系原作者