#!/bin/bash# OUTdoor interfaceGREEN_DEV=eth1# INdoor interfaceRED_DEV=eth0# Upload rate 250kb/sUPRATE=2000# Download rate 80kb/sDOWNRATE=640start(){#clean existing down and uplink qdiscs,put the errors to /var/log/htb_logtc qdisc del dev $RED_DEV root 2>/dev/null >/dev/nulltc qdisc del dev $GREEN_DEV root 2>/dev/null >/dev/nulltc qdisc del dev $RED_DEV ingress 2>/dev/null >/dev/nulltc qdisc del dev $GREEN_DEV ingress 2>/dev/null >/dev/nulltc qdisc add dev $GREEN_DEV root handle 2: htbtc qdisc add dev $RED_DEV root handle 2: htbtc class add dev $GREEN_DEV parent 2: classid 2:1 htb rate 256kbittc class add dev $RED_DEV parent 2: classid 2:1 htb rate 256kbiti=5; while [ $i -le 25 ] do tc class add dev $GREEN_DEV parent 2:1 classid 2:2$i htb rate ${DOWNRATE}kbit ceil ${DOWNRATE}kbit burst 15ktc class add dev $RED_DEV parent 2:1 classid 2:2$i htb rate ${UPRATE}kbit ceil ${UPRATE}kbit burst 15ktc qdisc add dev $GREEN_DEV parent 2:2$i handle 2$i: sfqtc qdisc add dev $RED_DEV parent 2:2$i handle 2$i: sfqtc filter add dev $GREEN_DEV parent 2:0 protocol ip prio 1 u32 match ip dst 192.168.1.$i flowid 2:2$itc filter add dev $RED_DEV parent 2:0 protocol ip prio 1 u32 match ip dst 192.168.1.$i flowid 2:2$ii=`expr $i + 1`done}stop(){ #clean existing down and uplink qdiscs,put the errors to /var/log/htb_logtc qdisc del dev $RED_DEV root 2>/dev/null >/dev/nulltc qdisc del dev $GREEN_DEV root 2>/dev/null >/dev/null}status() {echo "Show qdisc $RED_DEV (Display Upload queue):"tc -s qdisc show dev $RED_DEVecho "Show class $RED_DEV (Display Upload class):"tc class show dev $RED_DEVecho "*********************************UP/DOWN*********************************"echo "Show qdisc $GREEN_DEV (Display Download queue):"tc -s qdisc show dev $GREEN_DEVecho "Show class $GREEN_DEV (Display Download class):"tc class show dev $GREEN_DEV}usage(){echo "(usage): `basename $0` [start | stop | restart | status]"echo ""echo "Argument: functions:"echo "start start traffic-control"echo "stop stop traffic-control"echo "restart restart traffic-control"echo "status show detail of traffic"}# Argumentkernel=`uname -r|cut -b 1-3`case "$kernel" in2.4|2.6)case "$1" instart)( start && echo "TC started!" ) || echo "Error."exit 0;;stop)( stop && echo "TC stopped!" ) || echo "Error."exit 0;;restart)( start && echo "TC restarted!" ) || echo "Error."exit 0;;status)status;;*)usageexit 1;;esac;;*)echo " (!) Error: Unsupported Kernel!"exit 1;;esac 本文转自 liang3391 51CTO博客,原文链接:http://blog.51cto.com/liang3391/456573