#!/bin/bash # -------------- HTB Sharper 1.7.3 "rc.htb" ------------- # All rights reserved for B@roo 2000-2005 # Poprawki Gervys79 # --------------------------------------------------------- #set -x # Ladowanie konfiguracji if [ ! -e ${0%rc.htb}rc.fire_conf ]; then exit 1 fi START_FILE="rc.htb" source ${0%rc.htb}rc.fire_conf if [ ! "$QOS_ENABLE" == "htb" ]; then echo -n "HTB QoS fuction is disable." exit 1 fi # -------- Ladowanie modulow i usuwanie kolejek ------------ ip link set imq0 up ip link set imq1 up stop() { tc qdisc del root dev imq1 2> /dev/null tc qdisc del root dev imq0 2> /dev/null } # ----------------- Przeliczenia klas ---------------------- start() { if [ "$NAT_ENABLE" == "MASQUERADE" ]; then INTERNET_IP=`ifconfig $INTERNET_ETH | grep "inet addr:" | awk '{print $2}' | cut -d ":" -f 2` fi DOWNLOAD_ALL_UL=$[$DOWNLOAD*99/100] DOWNLOAD_ALL=$[$DOWNLOAD*98/100] DOWNLOAD_PRIO=`echo $QOS_PRIO_BAND | cut -d':' -f1` DOWNLOAD_CRIT=`echo $QOS_CRIT_BAND | cut -d':' -f1` if [ ! `echo $QOS_CRIT_BAND | cut -d':' -f3` == "hard" ]; then DOWNLOAD_CRIT_UL=$DOWNLOAD_ALL_UL DOWNLOAD_NORMAL=$[$DOWNLOAD_ALL-$DOWNLOAD_CRIT] DOWNLOAD_NORMAL_UL=$DOWNLOAD_ALL_UL else DOWNLOAD_CRIT_UL=$DOWNLOAD_ALL_UL DOWNLOAD_NORMAL=$[$DOWNLOAD_ALL-$DOWNLOAD_CRIT] DOWNLOAD_NORMAL_UL=$[$DOWNLOAD_ALL_UL-$DOWNLOAD_CRIT] fi if [ "$DOWNLOAD_CRIT" -ge "$[$DOWNLOAD_ALL/2]" ]; then DOWNLOAD_CRIT_M1=$[$DOWNLOAD_ALL*75/100] else DOWNLOAD_CRIT_M1=$[2*$DOWNLOAD_CRIT*85/100] fi UPLOAD_ALL_UL=$[$UPLOAD*99/100] UPLOAD_ALL=$[$UPLOAD*98/100] UPLOAD_PRIO=`echo $QOS_PRIO_BAND | cut -d':' -f2` UPLOAD_CRIT=`echo $QOS_CRIT_BAND | cut -d':' -f2` if [ ! `echo $QOS_CRIT_BAND | cut -d':' -f3` == "hard" ]; then UPLOAD_CRIT_UL=$UPLOAD_ALL_UL UPLOAD_NORMAL=$[$UPLOAD_ALL-$UPLOAD_CRIT] UPLOAD_NORMAL_UL=$UPLOAD_ALL_UL else UPLOAD_CRIT_UL=$UPLOAD_ALL_UL UPLOAD_NORMAL=$[$UPLOAD_ALL-$UPLOAD_CRIT] UPLOAD_NORMAL_UL=$[$UPLOAD_ALL_UL-$UPLOAD_CRIT] fi if [ "$UPLOAD_CRIT" -ge "$[$UPLOAD_ALL/2]" ]; then UPLOAD_CRIT_M1=$[$UPLOAD_ALL*75/100] else UPLOAD_CRIT_M1=$[2*$UPLOAD_CRIT*85/100] fi DOWNLOAD_ROUTER=`echo $QOS_ROUTER_BAND | cut -d':' -f1` UPLOAD_ROUTER=`echo $QOS_ROUTER_BAND | cut -d':' -f3` if [ ! `echo $QOS_ROUTER_BAND | cut -d':' -f2` == "auto" ]; then DOWNLOAD_ROUTER_UL=`echo $QOS_ROUTER_BAND | cut -d':' -f2` else DOWNLOAD_ROUTER_UL=$DOWNLOAD_NORMAL_UL fi if [ ! `echo $QOS_ROUTER_BAND | cut -d':' -f4` == "auto" ]; then UPLOAD_ROUTER_UL=`echo $QOS_ROUTER_BAND | cut -d':' -f4` else UPLOAD_ROUTER_UL=$UPLOAD_NORMAL_UL fi USERS_COUNT_DOWN=0 RATE_COUNT_DOWN=0 USERS_COUNT_UP=0 RATE_COUNT_UP=0 if [ ! "$P2P_LIMIT" == "" ]; then USERS_COUNT_DOWN=1 USERS_COUNT_UP=1 fi for i in $QOS_ALLOW do if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then TMP=`echo $i | cut -d':' -f2` RATE_COUNT_DOWN=$[$RATE_COUNT_DOWN+$TMP] else USERS_COUNT_DOWN=$[$USERS_COUNT_DOWN+1] fi if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then TMP=`echo $i | cut -d':' -f4` RATE_COUNT_UP=$[$RATE_COUNT_UP+$TMP] else USERS_COUNT_UP=$[$USERS_COUNT_UP+1] fi done if [ ! "$USERS_COUNT_DOWN" == "0" ]; then DOWNLOAD_USER_RATE=$[($DOWNLOAD_NORMAL-$DOWNLOAD_PRIO-$DOWNLOAD_ROUTER-$RATE_COUNT_DOWN)/$USERS_COUNT_DOWN] fi if [ ! "$USERS_COUNT_UP" == "0" ]; then UPLOAD_USER_RATE=$[($UPLOAD_NORMAL-$UPLOAD_PRIO-$UPLOAD_ROUTER-$RATE_COUNT_UP)/$USERS_COUNT_UP] fi # P2P if [ "$P2P_TYPE" == "advanced" ]; then if [ ! "$P2P_LIMIT" == "" ]; then DOWNLOAD_ALL_P2P=`echo $P2P_LIMIT | cut -d':' -f1` UPLOAD_ALL_P2P=`echo $P2P_LIMIT | cut -d':' -f2` RATE_COUNT_DOWN_P2P=0 USERS_COUNT_DOWN_P2P=0 RATE_COUNT_UP_P2P=0 USERS_COUNT_UP_P2P=0 else echo "Warning: you must define P2P_LIMIT value in advanced mode" fi fi if [ "$P2P_TYPE" == "advanced" ]; then if [ ! "$P2P_LIMIT" == "" ]; then for i in $P2P_USER_LIMIT do if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then TMP=`echo $i | cut -d':' -f2` RATE_COUNT_DOWN_P2P=$[$RATE_COUNT_DOWN_P2P+$TMP] else USERS_COUNT_DOWN_P2P=$[$USERS_COUNT_DOWN_P2P+1] fi if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then TMP=`echo $i | cut -d':' -f4` RATE_COUNT_UP_P2P=$[$RATE_COUNT_UP_P2P+$TMP] else USERS_COUNT_UP_P2P=$[$USERS_COUNT_UP_P2P+1] fi done if [ ! "$USERS_COUNT_DOWN_P2P" == "0" ]; then DOWNLOAD_USER_RATE_P2P=$[($DOWNLOAD_ALL_P2P-$RATE_COUNT_DOWN_P2P)/$USERS_COUNT_DOWN_P2P] fi if [ ! "$USERS_COUNT_UP_P2P" == "0" ]; then UPLOAD_USER_RATE_P2P=$[($UPLOAD_ALL_P2P-$RATE_COUNT_UP_P2P)/$USERS_COUNT_UP_P2P] fi fi fi # ------------ Tworzenie kolejek - odbieranie --------------- ### Tworzenie korzenia kolejek tc qdisc add dev imq0 root handle 1:0 htb default 100 r2q 4 tc class add dev imq0 parent 1:0 classid 1:1 htb rate ${DOWNLOAD_ALL}kbit ceil ${DOWNLOAD_ALL_UL}kbit ### Ruch krytyczny tc class add dev imq0 parent 1:1 classid 1:2 htb rate ${DOWNLOAD_CRIT_M1}kbit ceil ${DOWNLOAD_CRIT_UL}kbit tc qdisc add dev imq0 parent 1:2 sfq perturb 5 tc filter add dev imq0 parent 1:0 protocol ip prio 2 handle 0x2 fw flowid 1:2 ### Ruch normalny tc class add dev imq0 parent 1:1 classid 1:5 htb rate ${DOWNLOAD_NORMAL}kbit ceil ${DOWNLOAD_NORMAL_UL}kbit # Ruch priorytetowy tc class add dev imq0 parent 1:5 classid 1:10 htb rate ${DOWNLOAD_PRIO}kbit ceil ${DOWNLOAD_NORMAL_UL}kbit tc qdisc add dev imq0 parent 1:10 sfq perturb 5 tc filter add dev imq0 parent 1:0 protocol ip prio 3 u32 match ip protocol 17 0xff match ip sport 53 0xffff flowid 1:10 # DNS # Ruch routera tc class add dev imq0 parent 1:5 classid 1:20 htb rate ${DOWNLOAD_ROUTER}kbit ceil ${DOWNLOAD_ROUTER_UL}kbit tc qdisc add dev imq0 parent 1:20 sfq perturb 10 tc filter add dev imq0 parent 1:0 protocol ip prio 4 u32 match ip dst $INTERNET_IP flowid 1:20 # Ruch P2P if [ "$P2P_TYPE" == "normal" ]; then if [ ! "$P2P_LIMIT" == "" ]; then DOWNLOAD_P2P=`echo $P2P_LIMIT | cut -d':' -f1` tc class add dev imq0 parent 1:5 classid 1:30 htb rate ${DOWNLOAD_USER_RATE}kbit ceil ${DOWNLOAD_P2P}kbit tc qdisc add dev imq0 parent 1:30 esfq perturb 10 hash dst tc filter add dev imq0 parent 1:0 protocol ip prio 1 handle 0x30 fw flowid 1:30 fi fi # Ruch normalny userow if [ "$P2P_TYPE" == "normal" ]; then MARK=100 else MARK=50 MARK2=500 fi for i in $QOS_ALLOW do DOWN_NORMAL=$DOWNLOAD_USER_RATE DOWN_CEIL=$DOWNLOAD_NORMAL_UL ADDRESS=`echo $i | cut -d':' -f1` if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then DOWN_NORMAL=`echo $i | cut -d':' -f2` fi if [ ! `echo $i | cut -d':' -f3` == "auto" ]; then DOWN_CEIL=`echo $i | cut -d':' -f3` DL="ceil ${DOWN_CEIL}kbit" else DL="ceil ${DOWN_CEIL}kbit" fi if [ $DOWN_NORMAL -ge $DOWN_CEIL ]; then DOWN_NORMAL=$DOWN_CEIL fi if [ "$P2P_TYPE" == "normal" ]; then tc class add dev imq0 parent 1:5 classid 1:${MARK} htb rate ${DOWN_NORMAL}kbit $DL if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then tc qdisc add dev imq0 parent 1:${MARK} esfq perturb 10 hash dst elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10 else tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10 fi tc filter add dev imq0 parent 1:0 protocol ip prio 5 u32 match ip dst $ADDRESS flowid 1:${MARK} MARK=$[$MARK+1] elif [ "$P2P_TYPE" == "advanced" ]; then tc class add dev imq0 parent 1:5 classid 1:${MARK} htb rate ${DOWN_NORMAL}kbit $DL if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then tc qdisc add dev imq0 parent 1:${MARK} esfq perturb 10 hash dst elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10 else tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10 fi tc class add dev imq0 parent 1:${MARK} classid 1:${MARK2} htb rate ${DOWN_NORMAL}kbit $DL if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then tc qdisc add dev imq0 parent 1:${MARK2} esfq perturb 10 hash dst elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then tc qdisc add dev imq0 parent 1:${MARK2} sfq perturb 10 else tc qdisc add dev imq0 parent 1:${MARK2} sfq perturb 10 fi tc filter add dev imq0 parent 1:0 protocol ip prio 5 u32 match ip dst $ADDRESS flowid 1:${MARK2} MARK=$[$MARK+1] MARK2=$[$MARK2+2] fi done # Ruch p2p userow if [ "$P2P_TYPE" == "advanced" ]; then MARK=50 MARK2=501 for i in $P2P_USER_LIMIT do DOWN_NORMAL_P2P=$DOWNLOAD_USER_RATE_P2P DOWN_CEIL_P2P=`echo $P2P_LIMIT | cut -d':' -f1` if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then DOWN_NORMAL_P2P=`echo $i | cut -d':' -f2` fi if [ ! `echo $i | cut -d':' -f3` == "auto" ]; then DOWN_CEIL_P2P=`echo $i | cut -d':' -f3` DL_P2P="ceil ${DOWN_CEIL_P2P}kbit" else DL_P2P="ceil ${DOWN_CEIL_P2P}kbit" fi if [ $DOWN_NORMAL_P2P -ge $DOWN_CEIL_P2P ]; then DOWN_NORMAL_P2P=$DOWN_CEIL_P2P fi tc class add dev imq0 parent 1:${MARK} classid 1:${MARK2} htb rate ${DOWN_NORMAL_P2P}kbit $DL_P2P tc qdisc add dev imq0 parent 1:${MARK2} esfq perturb 10 hash dst tc filter add dev imq0 parent 1:0 protocol ip prio 1 handle 0x${MARK2} fw flowid 1:${MARK2} MARK=$[$MARK+1] MARK2=$[$MARK2+2] done # ------------- Tworzenie kolejek - wysylanie ---------------- ### Tworzenie korzenia kolejek if [ "$P2P_TYPE" == "normal" ]; then tc qdisc add dev imq1 root handle 1:0 htb default 100 r2q 4 else tc qdisc add dev imq1 root handle 1:0 htb default 50 r2q 4 fi tc class add dev imq1 parent 1:0 classid 1:1 htb rate ${UPLOAD_ALL}kbit ceil ${UPLOAD_ALL_UL}kbit ### Ruch krytyczny tc class add dev imq1 parent 1:1 classid 1:2 htb rate ${UPLOAD_CRIT_M1}kbit ceil ${UPLOAD_CRIT_UL}kbit tc qdisc add dev imq1 parent 1:2 sfq perturb 5 tc filter add dev imq1 parent 1:0 protocol ip prio 2 handle 0x2 fw flowid 1:2 ### Ruch normalny tc class add dev imq1 parent 1:1 classid 1:5 htb rate ${UPLOAD_NORMAL}kbit ceil ${UPLOAD_NORMAL_UL}kbit # Ruch priorytetowy tc class add dev imq1 parent 1:5 classid 1:10 htb rate ${UPLOAD_PRIO}kbit ceil ${UPLOAD_NORMAL_UL}kbit tc qdisc add dev imq1 parent 1:10 sfq perturb 5 tc filter add dev imq1 parent 1:0 protocol ip prio 3 u32 match ip protocol 17 0xff match ip dport 53 0xffff flowid 1:10 # DNS tc filter add dev imq1 parent 1:0 protocol ip prio 3 u32 match ip protocol 6 0xff \ match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10 # ACK # Ruch routera tc class add dev imq1 parent 1:5 classid 1:20 htb rate ${UPLOAD_ROUTER}kbit ceil ${UPLOAD_ROUTER_UL}kbit tc qdisc add dev imq1 parent 1:20 sfq perturb 10 tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x20 fw flowid 1:20 # Ruch P2P if [ "$P2P_TYPE" == "normal" ]; then if [ ! "$P2P_LIMIT" == "" ]; then UPLOAD_P2P=`echo $P2P_LIMIT | cut -d':' -f2` tc class add dev imq1 parent 1:5 classid 1:30 htb rate ${UPLOAD_USER_RATE}kbit ceil ${UPLOAD_P2P}kbit tc qdisc add dev imq1 parent 1:30 esfq perturb 10 hash src tc filter add dev imq1 parent 1:0 protocol ip prio 1 handle 0x30 fw flowid 1:30 fi fi # Ruch normalny userow if [ "$P2P_TYPE" == "normal" ]; then MARK=100 else MARK=50 MARK2=500 MARK3=100 fi for i in $QOS_ALLOW do UP_NORMAL=$UPLOAD_USER_RATE UP_CEIL=$UPLOAD_NORMAL_UL if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then UP_NORMAL=`echo $i | cut -d':' -f4` fi if [ ! `echo $i | cut -d':' -f5` == "auto" ]; then UP_CEIL=`echo $i | cut -d':' -f5` UL="ceil ${UP_CEIL}kbit" else UL="ceil ${UP_CEIL}kbit" fi if [ $UP_NORMAL -ge $UP_CEIL ]; then UP_NORMAL=$UP_CEIL fi if [ "$P2P_TYPE" == "normal" ]; then tc class add dev imq1 parent 1:5 classid 1:${MARK} htb rate ${UP_NORMAL}kbit $UL if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then tc qdisc add dev imq1 parent 1:${MARK} esfq perturb 10 hash src elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10 else tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10 fi tc filter add dev imq1 parent 1:0 protocol ip prio 5 handle 0x${MARK} fw flowid 1:${MARK} MARK=$[$MARK+1] elif [ "$P2P_TYPE" == "advanced" ]; then tc class add dev imq1 parent 1:5 classid 1:${MARK} htb rate ${UP_NORMAL}kbit $UL if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then tc qdisc add dev imq1 parent 1:${MARK} esfq perturb 10 hash src elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10 else tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10 fi tc class add dev imq1 parent 1:${MARK} classid 1:${MARK2} htb rate ${UP_NORMAL}kbit $UL if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then tc qdisc add dev imq1 parent 1:${MARK2} esfq perturb 10 hash src elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then tc qdisc add dev imq1 parent 1:${MARK2} sfq perturb 10 else tc qdisc add dev imq1 parent 1:${MARK2} sfq perturb 10 fi tc filter add dev imq1 parent 1:0 protocol ip prio 5 handle 0x${MARK3} fw flowid 1:${MARK2} MARK=$[$MARK+1] MARK2=$[$MARK2+2] MARK3=$[$MARK3+1] fi done # Ruch p2p userow if [ "$P2P_TYPE" == "advanced" ]; then MARK=50 MARK2=501 for i in $P2P_USER_LIMIT do UP_NORMAL_P2P=$UPLOAD_USER_RATE_P2P UP_CEIL_P2P=`echo $P2P_LIMIT | cut -d':' -f2` if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then UP_NORMAL_P2P=`echo $i | cut -d':' -f4` fi if [ ! `echo $i | cut -d':' -f5` == "auto" ]; then UP_CEIL_P2P=`echo $i | cut -d':' -f5` UL_P2P="ceil ${UP_CEIL_P2P}kbit" else UL_P2P="ceil ${UP_CEIL_P2P}kbit" fi if [ $UP_NORMAL_P2P -ge $UP_CEIL_P2P ]; then UP_NORMAL_P2P=$UP_CEIL_P2P fi tc class add dev imq1 parent 1:${MARK} classid 1:${MARK2} htb rate ${UP_NORMAL_P2P}kbit $UL_P2P tc qdisc add dev imq1 parent 1:${MARK2} esfq perturb 10 hash src tc filter add dev imq1 parent 1:0 protocol ip prio 1 handle 0x${MARK2} fw flowid 1:${MARK2} MARK=$[$MARK+1] MARK2=$[$MARK2+2] done fi fi } # -------------------- { start | stop } ---------------------- case "$1" in 'start') echo "Starting HTB Sharper 1.7.3 STABLE ... - All rights reserved for B@roo 2000-2005" echo " Poprawki Gervys79" echo " HTB" echo "--------------------------------------------------------------------------------" stop start ;; 'stop') echo "Stopping HTB Sharper 1.7.3 STABLE ... - All rights reserved for B@roo 2000-2005" echo " Poprawki Gervys79" echo "--------------------------------------------------------------------------------" stop ;; *) echo -e "\n Usage: rc.htb { start | stop }" ;; esac