I improved my script. PING don't grow up when I'm browsing Internet. I'm testing it now... but I notice improvement.
I recommend this script... is working very nice :) I invite to help improving this script.
Site in Internet soon.
I haven't written filters for Squid yet.
#!/bin/bash # # rc.htb 0.5.3, (C)Lenthir 2oo4, GNU GPL # 2004-11-01 9:30 VER="0.5.3" DAT="2004-11-01 9:30"
MAX=3330
#######################
#Konfiguracja interfejs�w:
ext_dwl=2000 #pr�dko�� �acza(y) na
�wiat w kbit/s
ext_upl=220
int="`/etc/router/0.cfg` `/etc/router/1.cfg` `/etc/router/2.cfg`" #adresy IP
dla interfejs�w lan
srv_ext="80.53.64.3" #zewn�trzne IP
interfejs�w wyj�ciowych
lan_int="192.168.0.0/24 192.168.1.0/24 192.168.2.0/24"
int_dwl[0]=85; int_upl[0]=85
int_dwl[1]=2; int_upl[1]=2
int_dwl[2]=80; int_upl[2]=80
ext[0]="80.53.64.2" #zewn�trzne IP w
podsieciach
ext[1]=""
ext[2]=""
TC=`which tc` #�cie�ka do tc
MODPROBE=`which modprobe` #�cie�ka do modprobe
IP=`which ip` #�cie�ka do ip
IPTABLES=`which iptables` #�cie�ka do iptables
firewall="/etc/init.d/rc.iptables restart" #jak zrestartowa�
firewall
#u_r2q=10 #r2q
u_quantum=1500 #quantum
porty_tcp="20 21 22 23 25 53 80 110 143 220 443 993 995 27015"
porty_udp="53"
pping=1 # 0 - ping w kolejce
normalnej 1 - ping w kolejce priorytetowej
#######################
#Sprawdza czy wszystkie srv_ext s� te� w ext, jesli nie dopisuje
i=0;
for l in $lan_int
do
let "i=$i+1"
zew="$zew ${ext[$i]}"
done
ipki="$zew $int"
for srvip in $srv_ext
do
if [[ `echo $ipki | grep $srvip` != $ipki ]]; then
zew="$zew $srvip"
fi
done
ile_int=`echo ${int}|awk '{print NF}'`
ile_ext=`echo ${zew}|awk '{print NF}'`
ile=$(echo "$ile_int + $ile_ext" | bc)
if [[ $ile -ge $MAX ]]
then
echo "Niedopuszczalnie du�o komputer�w!"
exit 1
fi
stop()
{
$TC qdisc del root dev imq0 2> /dev/null
$TC qdisc del root dev imq1 2> /dev/null
$IP link set imq0 down
$IP link set imq1 down
}
start()
{ stop
# download
tmp=$(echo "$ext_dwl%$ile" | bc)
min=$(echo "$ext_dwl/$ile" | bc)
pri_min=$(echo "$min/2+$min%2" | bc)
sec_min=$(echo "$min/2" | bc)
max=$ext_dwl
echo " Ilo�� komputer�w: $ile"
echo "%===================================================================%"
echo " Ustawianie kolejki downloadu."
echo " Minimalny download: $min kbit/s"
echo " Maksymalny download: $max kbit/s"
echo " Kolejka: -priorytetowa: $pri_min kbit/s -normalna: $sec_min kbit/s"
echo " Niewykorzystane: $tmp kbit/s"
echo " "
if [[ u_r2q=="" ]]; then
$TC qdisc add dev imq0 root handle 1:0 htb
else
$TC qdisc add dev imq0 root handle 1:0 htb r2q $u_r2q
fi
$TC class add dev imq0 parent 1:0 classid 1:1 htb rate ${ext_dwl}kbit ceil
${ext_dwl}kbit
j=2
for usr in $zew
do
$TC class add dev imq0 parent 1:1 classid 1:$j htb rate ${min}kbit ceil
${max}kbit quantum $u_quantum
$TC class add dev imq0 parent 1:$j classid 1:$(($j+1)) htb rate
${pri_min}kbit ceil ${max}kbit prio 1 quantum $u_quantum
$TC class add dev imq0 parent 1:$j classid 1:$(($j+2)) htb rate
${sec_min}kbit ceil ${max}kbit prio 2 quantum $u_quantum
$TC qdisc add dev imq0 parent 1:$(($j+1)) sfq
$TC qdisc add dev imq0 parent 1:$(($j+2)) sfq
$TC filter add dev imq0 protocol ip parent 1:0 pref 2 u32 match ip dst
$usr flowid 1:$j
for prt in $porty_tcp
do
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 6 0xff match ip sport $prt 0xffff flowid 1:$(($j+1))
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 6 0xff match ip dport $prt 0xffff flowid 1:$(($j+1))
done
for prt in $porty_udp
do
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 17 0xff match ip sport $prt 0xffff flowid 1:$(($j+1))
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 17 0xff match ip dport $prt 0xffff flowid 1:$(($j+1))
done
if [[ $pping -eq 1 ]]; then
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 1 0xff flowid 1:$(($j+1))
fi
$TC filter add dev imq0 protocol ip parent 1:$j pref 4 u32 match ip dst
$usr flowid 1:$((j+2))
let "j=j+3"
done
for usr in $int
do
$TC class add dev imq0 parent 1:1 classid 1:$j htb rate ${min}kbit ceil
${max}kbit quantum $u_quantum
$TC class add dev imq0 parent 1:$j classid 1:$(($j+1)) htb rate
${pri_min}kbit ceil ${max}kbit prio 1 quantum $u_quantum
$TC class add dev imq0 parent 1:$j classid 1:$(($j+2)) htb rate
${sec_min}kbit ceil ${max}kbit prio 2 quantum $u_quantum
$TC qdisc add dev imq0 parent 1:$(($j+1)) sfq
$TC qdisc add dev imq0 parent 1:$(($j+2)) sfq
$TC filter add dev imq0 protocol ip parent 1:0 pref 2 u32 match ip dst
$usr flowid 1:$j
for prt in $porty_tcp
do
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 6 0xff match ip sport $prt 0xffff flowid 1:$(($j+1))
done
for prt in $porty_udp
do
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 17 0xff match ip sport $prt 0xffff flowid 1:$(($j+1))
done
if [[ $pping -eq 1 ]]; then
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 1 0xff flowid 1:$(($j+1))
fi
$TC filter add dev imq0 protocol ip parent 1:$j pref 4 u32 match ip dst
$usr flowid 1:$((j+2))
let "j=j+3"
done
i=0
for ntr in $lan_int
do
$TC class add dev imq0 parent 1:0 classid 1:$j htb rate
${int_dwl[$i]}Mbit ceil ${int_dwl[$i]}Mbit quantum $u_quantum
$TC qdisc add dev imq0 parent 1:$j sfq
for ipek in $lan_int ${zew}
do
$TC filter add dev imq0 protocol ip parent 1:0 pref 1 u32 match
ip src $ntr match ip dst $ipek flowid 1:$j
done
if [[ ${ext[$i]}!="" ]]; then
for pri in ${ext[$i]}
do
for sec in ${zew/${ext[$i]}/}
do
$TC filter add dev imq0 protocol ip parent 1:0 pref 1 u32 match
ip src $pri match ip dst $sec flowid 1:$j
done
done
fi
let "j=j+1"
let "i=i+1"
done
$IPTABLES -t mangle -A PREROUTING -j IMQ --todev 0
$IP link set imq0 up
# upload
tmp=$(echo "$ext_upl%$ile" | bc)
min=$(echo "$ext_upl/$ile" | bc)
pri_min=$(echo "$min/2+$min%2" | bc)
sec_min=$(echo "$min/2" | bc)
max=$ext_upl
echo " Ustawianie kolejki uploadu."
echo " Maksymalny upload: $max kbit/s"
echo " Minimalny upload user�w: $min kbit/s"
echo " Kolejka: -priorytetowa: $pri_min kbit/s -normalna: $sec_min kbit/s"
echo " Niewykorzystane: $tmp kbit/s"
echo "%===================================================================%"
if [[ u_r2q=="" ]]; then
$TC qdisc add dev imq1 root handle 2:0 htb
else
$TC qdisc add dev imq1 root handle 2:0 htb r2q $u_r2q
fi
$TC class add dev imq1 parent 2:0 classid 2:1 htb rate ${ext_upl}kbit ceil
${ext_upl}kbit
j=2
for usr in $zew
do
$TC class add dev imq1 parent 2:1 classid 2:$j htb rate ${min}kbit ceil
${max}kbit quantum $u_quantum
$TC class add dev imq1 parent 2:$j classid 2:$(($j+1)) htb rate
${pri_min}kbit ceil ${max}kbit prio 1 quantum $u_quantum
$TC class add dev imq1 parent 2:$j classid 2:$(($j+2)) htb rate
${sec_min}kbit ceil ${max}kbit prio 2 quantum $u_quantum
$TC qdisc add dev imq1 parent 2:$(($j+1)) sfq
$TC qdisc add dev imq1 parent 2:$(($j+2)) sfq
$TC filter add dev imq1 protocol ip parent 2:0 pref 2 u32 match ip src
$usr flowid 2:$j
for prt in $porty_tcp
do
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 6 0xff match ip dport $prt 0xffff flowid 2:$(($j+1))
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 6 0xff match ip sport $prt 0xffff flowid 2:$(($j+1))
done
for prt in $porty_udp
do
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 17 0xff match ip dport $prt 0xffff flowid 2:$(($j+1))
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 17 0xff match ip sport $prt 0xffff flowid 2:$(($j+1))
done
if [[ $pping -eq 1 ]]; then
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 1 0xff flowid 2:$(($j+1))
fi
$TC filter add dev imq1 protocol ip parent 2:$j pref 4 u32 match ip src
$usr flowid 2:$((j+2))
let "j=j+3"
done
for usr in $int
do
$TC class add dev imq1 parent 2:1 classid 2:$j htb rate ${min}kbit ceil
${max}kbit quantum $u_quantum
$TC class add dev imq1 parent 2:$j classid 2:$(($j+1)) htb rate
${pri_min}kbit ceil ${max}kbit prio 1 quantum $u_quantum
$TC class add dev imq1 parent 2:$j classid 2:$(($j+2)) htb rate
${sec_min}kbit ceil ${max}kbit prio 2 quantum $u_quantum
$TC qdisc add dev imq1 parent 2:$(($j+1)) sfq
$TC qdisc add dev imq1 parent 2:$(($j+2)) sfq
$TC filter add dev imq1 protocol ip parent 2:0 pref 2 u32 match ip src
$usr flowid 2:$j
for prt in $porty_tcp
do
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 6 0xff match ip dport $prt 0xffff flowid 2:$(($j+1))
done
for prt in $porty_udp
do
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 17 0xff match ip dport $prt 0xffff flowid 2:$(($j+1))
done
if [[ $pping -eq 1 ]]; then
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 1 0xff flowid 2:$(($j+1))
fi
$TC filter add dev imq1 protocol ip parent 2:$j pref 4 u32 match ip src
$usr flowid 2:$((j+2))
let "j=j+3"
done
i=0
for ntr in $lan_int
do
$TC class add dev imq1 parent 2:0 classid 2:$j htb rate
${int_upl[$i]}Mbit ceil ${int_upl[$i]}Mbit quantum $u_quantum
$TC qdisc add dev imq1 parent 2:$j sfq
for ipek in $lan_int ${zew}
do
$TC filter add dev imq1 protocol ip parent 2:0 pref 1 u32 match
ip src $ipek match ip dst $ntr flowid 2:$j
done
if [[ "${ext[$i]}"!="k" ]]; then
for pri in ${ext[$i]}
do
for sec in ${zew/${ext[$i]}/}
do
$TC filter add dev imq1 protocol ip parent 2:0 pref 1 u32 match
ip src $sec match ip dst $pri flowid 2:$j
done
done
fi
let "j=j+1"
let "i=i+1"
done
$IPTABLES -t mangle -A POSTROUTING -j IMQ --todev 1
$IP link set imq1 up
}
echo "rc.htb $VER, (C)Lenthir 2oo4, GNU GPL"
echo "$DAT"
case "$1" in
'start')
echo "Uruchamianie kolejkowania..."
start
echo "Gotowe."
exit 0
;;
'stop')
echo -n "Zatrzymywanie kolejkowania..."
stop
echo " wykonano."
;;
'restart')
echo "Restartowanie kolejkowania..."
$firewall
start
echo "Gotowe."
;;
'status')
echo "Klasy na interfejsie imq0!"
echo "%====================================%"
$TC class show dev imq0 | grep root
$TC class show dev imq0 | grep -v root | sort | nl
echo "Klasy na interfejsie imq1!"
echo "%====================================%"
$TC class show dev imq1 | grep root
$TC class show dev imq1 | grep -v root | sort | nl
;;
'stat')
if [[ "$2" == "" ]]; then
echo "Script need second argument - adress IP"
exit 1
elif [[ "$2" == "lan" ]]; then
j=2
for usr in $zew
do
let "j=j+3"
done
for usr in $int
do
let "j=j+3"
done
i=0;trs="echo \"Transfer w LAN\""
for uvs in $lan_int
do
trs="$trs && echo \"Lan[$i]:\" && tc -s class show dev imq0 |
grep -A 3 \"htb 1:$j \" && tc -s class show dev imq1 | grep -A 3 \"htb 2:$j \""
let "j=j+1"
let "i=i+1"
done
watch -d -n 1 "$trs"
else
j=2
for usr in $zew
do
if [[ "$2" == "$usr" ]]; then
watch -d -n 1 "echo \"Download: \" && tc -s class show
dev imq0 | grep -A 3 \"htb 1:$j \" && tc -s class show dev imq0 | grep -A 3
\"1:$(($j+1)) \" && tc -s class show dev imq0 | grep -A 3 \"1:$(($j+2)) \" &&
echo && echo \"Upload: \" && tc -s class show dev imq1 | grep -A 3 \"htb 2:$j
\" && tc -s class show dev imq1 | grep -A 3 \"2:$(($j+1)) \" && tc -s class
show dev imq1 | grep -A 3 \"2:$(($j+2)) \""
echo "Zako�czono."
exit 0
fi
let "j=j+3"
done
for usr in $int
do
if [[ "$2" == "$usr" ]]; then
watch -d -n 1 "echo \"Download: \" && tc -s class show
dev imq0 | grep -A 3 \"htb 1:$j \" && tc -s class show dev imq0 | grep -A 3
\"1:$(($j+1)) \" && tc -s class show dev imq0 | grep -A 3 \"1:$(($j+2)) \" &&
echo && echo \"Upload: \" && tc -s class show dev imq1 | grep -A 3 \"htb 2:$j
\" && tc -s class show dev imq1 | grep -A 3 \"2:$(($j+1)) \" && tc -s class
show dev imq1 | grep -A 3 \"2:$(($j+2)) \""
echo "Zako�czono."
exit 0
fi
let "j=j+3"
done
fi
;;
*)
echo
echo "U�ycie: rc.htb start|stop|restart|status"
echo "rc.htb stat <lan|adress IP>"
exit 1
;;
esac
#!/bin/bash
#
# rc.htb 0.5.3, (C)Lenthir 2oo4, GNU GPL
# 2004-11-01 9:30
VER="0.5.3"
DAT="2004-11-01 9:30"
MAX=3330
#######################
#Konfiguracja interfejs�w:
ext_dwl=2000 #pr�dko�� �acza(y) na
�wiat w kbit/s
ext_upl=220
int="`/home/scorpio/router/adresyIP`" #adresy IP dla
interfejs�w lan
srv_ext="83.17.20.134" #zewn�trzne IP
interfejs�w wyj�ciowych
lan_int="192.168.200.0/24 192.168.201.0/24 192.168.202.0/24"
int_dwl[0]=3; int_upl[0]=3
int_dwl[1]=3; int_upl[1]=3
int_dwl[2]=85; int_upl[2]=85
ext[0]="" #zewn�trzne IP w
podsieciach
ext[1]="83.17.20.131"
ext[2]="83.17.20.130"
TC=`which tc` #�cie�ka do tc
MODPROBE=`which modprobe` #�cie�ka do modprobe
IP=`which ip` #�cie�ka do ip
IPTABLES=`which iptables` #�cie�ka do iptables
firewall="/etc/init.d/rc.iptables restart" #jak zrestartowa�
firewall
#u_r2q=10 #r2q
u_quantum=1500 #quantum
porty_tcp="20 21 22 23 25 53 80 110 143 220 443 993 995 27015"
porty_udp="53"
pping=1 # 0 - ping w kolejce
normalnej 1 - ping w kolejce priorytetowej
#######################
#Sprawdza czy wszystkie srv_ext s� te� w ext, jesli nie dopisuje
i=0;
for l in $lan_int
do
let "i=$i+1"
zew="$zew ${ext[$i]}"
done
ipki="$zew $int"
for srvip in $srv_ext
do
if [[ `echo $ipki | grep $srvip` != $ipki ]]; then
zew="$zew $srvip"
fi
done
ile_int=`echo ${int}|awk '{print NF}'`
ile_ext=`echo ${zew}|awk '{print NF}'`
ile=$(echo "$ile_int + $ile_ext" | bc)
if [[ $ile -ge $MAX ]]
then
echo "Niedopuszczalnie du�o komputer�w!"
exit 1
fi
stop()
{
$TC qdisc del root dev imq0 2> /dev/null
$TC qdisc del root dev imq1 2> /dev/null
$IP link set imq0 down
$IP link set imq1 down
}
start()
{ stop
# download
tmp=$(echo "$ext_dwl%$ile" | bc)
min=$(echo "$ext_dwl/$ile" | bc)
pri_min=$(echo "$min/2+$min%2" | bc)
sec_min=$(echo "$min/2" | bc)
max=$ext_dwl
echo " Ilo�� komputer�w: $ile"
echo "%===================================================================%"
echo " Ustawianie kolejki downloadu."
echo " Minimalny download: $min kbit/s"
echo " Maksymalny download: $max kbit/s"
echo " Kolejka: -priorytetowa: $pri_min kbit/s -normalna: $sec_min kbit/s"
echo " Niewykorzystane: $tmp kbit/s"
echo " "
if [[ u_r2q=="" ]]; then
$TC qdisc add dev imq0 root handle 1:0 htb
else
$TC qdisc add dev imq0 root handle 1:0 htb r2q $u_r2q
fi
$TC class add dev imq0 parent 1:0 classid 1:1 htb rate ${ext_dwl}kbit ceil
${ext_dwl}kbit
j=2
for usr in $zew
do
$TC class add dev imq0 parent 1:1 classid 1:$j htb rate ${min}kbit ceil
${max}kbit quantum $u_quantum
$TC class add dev imq0 parent 1:$j classid 1:$(($j+1)) htb rate
${pri_min}kbit ceil ${max}kbit quantum $u_quantum
$TC class add dev imq0 parent 1:$j classid 1:$(($j+2)) htb rate
${sec_min}kbit ceil ${max}kbit quantum $u_quantum
$TC qdisc add dev imq0 parent 1:$(($j+1)) sfq
$TC qdisc add dev imq0 parent 1:$(($j+2)) sfq
$TC filter add dev imq0 protocol ip parent 1:0 pref 2 u32 match ip dst
$usr flowid 1:$j
for prt in $porty_tcp
do
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 6 0xff match ip sport $prt 0xffff flowid 1:$(($j+1))
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 6 0xff match ip dport $prt 0xffff flowid 1:$(($j+1))
done
for prt in $porty_udp
do
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 17 0xff match ip sport $prt 0xffff flowid 1:$(($j+1))
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 17 0xff match ip dport $prt 0xffff flowid 1:$(($j+1))
done
if [[ $pping -eq 1 ]]; then
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 1 0xff flowid 1:$(($j+1))
fi
$TC filter add dev imq0 protocol ip parent 1:$j pref 4 u32 match ip dst
$usr flowid 1:$((j+2))
let "j=j+3"
done
for usr in $int
do
$TC class add dev imq0 parent 1:1 classid 1:$j htb rate ${min}kbit ceil
${max}kbit quantum $u_quantum
$TC class add dev imq0 parent 1:$j classid 1:$(($j+1)) htb rate
${pri_min}kbit ceil ${max}kbit quantum $u_quantum
$TC class add dev imq0 parent 1:$j classid 1:$(($j+2)) htb rate
${sec_min}kbit ceil ${max}kbit quantum $u_quantum
$TC qdisc add dev imq0 parent 1:$(($j+1)) sfq
$TC qdisc add dev imq0 parent 1:$(($j+2)) sfq
$TC filter add dev imq0 protocol ip parent 1:0 pref 2 u32 match ip dst
$usr flowid 1:$j
for prt in $porty_tcp
do
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 6 0xff match ip sport $prt 0xffff flowid 1:$(($j+1))
done
for prt in $porty_udp
do
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 17 0xff match ip sport $prt 0xffff flowid 1:$(($j+1))
done
if [[ $pping -eq 1 ]]; then
$TC filter add dev imq0 protocol ip parent 1:$j pref 3 u32
match ip protocol 1 0xff flowid 1:$(($j+1))
fi
$TC filter add dev imq0 protocol ip parent 1:$j pref 4 u32 match ip dst
$usr flowid 1:$((j+2))
let "j=j+3"
done
i=0
for ntr in $lan_int
do
$TC class add dev imq0 parent 1:0 classid 1:$j htb rate
${int_dwl[$i]}Mbit ceil ${int_dwl[$i]}Mbit quantum $u_quantum
$TC qdisc add dev imq0 parent 1:$j sfq
for ipek in $lan_int ${zew}
do
$TC filter add dev imq0 protocol ip parent 1:0 pref 1 u32 match
ip src $ntr match ip dst $ipek flowid 1:$j
done
if [[ ${ext[$i]}!="" ]]; then
for pri in ${ext[$i]}
do
for sec in ${zew/${ext[$i]}/}
do
$TC filter add dev imq0 protocol ip parent 1:0 pref 1 u32 match
ip src $pri match ip dst $sec flowid 1:$j
done
done
fi
let "j=j+1"
let "i=i+1"
done
$IPTABLES -t mangle -A PREROUTING -j IMQ --todev 0
$IP link set imq0 up
# upload
tmp=$(echo "$ext_upl%$ile" | bc)
min=$(echo "$ext_upl/$ile" | bc)
pri_min=$(echo "$min/2+$min%2" | bc)
sec_min=$(echo "$min/2" | bc)
max=$ext_upl
echo " Ustawianie kolejki uploadu."
echo " Maksymalny upload: $max kbit/s"
echo " Minimalny upload user�w: $min kbit/s"
echo " Kolejka: -priorytetowa: $pri_min kbit/s -normalna: $sec_min kbit/s"
echo " Niewykorzystane: $tmp kbit/s"
echo "%===================================================================%"
if [[ u_r2q=="" ]]; then
$TC qdisc add dev imq1 root handle 2:0 htb
else
$TC qdisc add dev imq1 root handle 2:0 htb r2q $u_r2q
fi
$TC class add dev imq1 parent 2:0 classid 2:1 htb rate ${ext_upl}kbit ceil
${ext_upl}kbit
j=2
for usr in $zew
do
$TC class add dev imq1 parent 2:1 classid 2:$j htb rate ${min}kbit ceil
${max}kbit quantum $u_quantum
$TC class add dev imq1 parent 2:$j classid 2:$(($j+1)) htb rate
${pri_min}kbit ceil ${max}kbit prio 1 quantum $u_quantum
$TC class add dev imq1 parent 2:$j classid 2:$(($j+2)) htb rate
${sec_min}kbit ceil ${max}kbit prio 2 quantum $u_quantum
$TC qdisc add dev imq1 parent 2:$(($j+1)) sfq
$TC qdisc add dev imq1 parent 2:$(($j+2)) sfq
$TC filter add dev imq1 protocol ip parent 2:0 pref 2 u32 match ip src
$usr flowid 2:$j
for prt in $porty_tcp
do
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 6 0xff match ip dport $prt 0xffff flowid 2:$(($j+1))
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 6 0xff match ip sport $prt 0xffff flowid 2:$(($j+1))
done
for prt in $porty_udp
do
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 17 0xff match ip dport $prt 0xffff flowid 2:$(($j+1))
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 17 0xff match ip sport $prt 0xffff flowid 2:$(($j+1))
done
if [[ $pping -eq 1 ]]; then
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 1 0xff flowid 2:$(($j+1))
fi
$TC filter add dev imq1 protocol ip parent 2:$j pref 4 u32 match ip src
$usr flowid 2:$((j+2))
let "j=j+3"
done
for usr in $int
do
$TC class add dev imq1 parent 2:1 classid 2:$j htb rate ${min}kbit ceil
${max}kbit quantum $u_quantum
$TC class add dev imq1 parent 2:$j classid 2:$(($j+1)) htb rate
${pri_min}kbit ceil ${max}kbit prio 1 quantum $u_quantum
$TC class add dev imq1 parent 2:$j classid 2:$(($j+2)) htb rate
${sec_min}kbit ceil ${max}kbit prio 2 quantum $u_quantum
$TC qdisc add dev imq1 parent 2:$(($j+1)) sfq
$TC qdisc add dev imq1 parent 2:$(($j+2)) sfq
$TC filter add dev imq1 protocol ip parent 2:0 pref 2 u32 match ip src
$usr flowid 2:$j
for prt in $porty_tcp
do
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 6 0xff match ip dport $prt 0xffff flowid 2:$(($j+1))
done
for prt in $porty_udp
do
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 17 0xff match ip dport $prt 0xffff flowid 2:$(($j+1))
done
if [[ $pping -eq 1 ]]; then
$TC filter add dev imq1 protocol ip parent 2:$j pref 3 u32
match ip protocol 1 0xff flowid 2:$(($j+1))
fi
$TC filter add dev imq1 protocol ip parent 2:$j pref 4 u32 match ip src
$usr flowid 2:$((j+2))
let "j=j+3"
done
i=0
for ntr in $lan_int
do
$TC class add dev imq1 parent 2:0 classid 2:$j htb rate
${int_upl[$i]}Mbit ceil ${int_upl[$i]}Mbit quantum $u_quantum
$TC qdisc add dev imq1 parent 2:$j sfq
for ipek in $lan_int ${zew}
do
$TC filter add dev imq1 protocol ip parent 2:0 pref 1 u32 match
ip src $ipek match ip dst $ntr flowid 2:$j
done
if [[ "${ext[$i]}"!="k" ]]; then
for pri in ${ext[$i]}
do
for sec in ${zew/${ext[$i]}/}
do
$TC filter add dev imq1 protocol ip parent 2:0 pref 1 u32 match
ip src $sec match ip dst $pri flowid 2:$j
done
done
fi
let "j=j+1"
let "i=i+1"
done
$IPTABLES -t mangle -A POSTROUTING -j IMQ --todev 1
$IP link set imq1 up
}
echo "rc.htb $VER, (C)Lenthir 2oo4, GNU GPL"
echo "$DAT"
case "$1" in
'start')
echo "Uruchamianie kolejkowania..."
start
echo "Gotowe."
exit 0
;;
'stop')
echo -n "Zatrzymywanie kolejkowania..."
stop
echo " wykonano."
;;
'restart')
echo "Restartowanie kolejkowania..."
$firewall
start
echo "Gotowe."
;;
'status')
echo "Klasy na interfejsie imq0!"
echo "%====================================%"
$TC class show dev imq0 | grep root
$TC class show dev imq0 | grep -v root | sort | nl
echo "Klasy na interfejsie imq1!"
echo "%====================================%"
$TC class show dev imq1 | grep root
$TC class show dev imq1 | grep -v root | sort | nl
;;
'stat')
if [[ "$2" == "" ]]; then
echo "Script need second argument - adress IP"
exit 1
elif [[ "$2" == "lan" ]]; then
j=2
for usr in $zew
do
let "j=j+3"
done
for usr in $int
do
let "j=j+3"
done
i=0;trs="echo \"Transfer w LAN\""
for uvs in $lan_int
do
trs="$trs && echo \"Lan[$i]:\" && tc -s class show dev imq0 |
grep -A 3 \"htb 1:$j \" && tc -s class show dev imq1 | grep -A 3 \"htb 2:$j \""
let "j=j+1"
let "i=i+1"
done
watch -d -n 1 "$trs"
else
j=2
for usr in $zew
do
if [[ "$2" == "$usr" ]]; then
watch -d -n 1 "echo \"Download: \" && tc -s class show
dev imq0 | grep -A 3 \"htb 1:$j \" && tc -s class show dev imq0 | grep -A 3
\"1:$(($j+1)) \" && tc -s class show dev imq0 | grep -A 3 \"1:$(($j+2)) \" &&
echo && echo \"Upload: \" && tc -s class show dev imq1 | grep -A 3 \"htb 2:$j
\" && tc -s class show dev imq1 | grep -A 3 \"2:$(($j+1)) \" && tc -s class
show dev imq1 | grep -A 3 \"2:$(($j+2)) \""
echo "Zako�czono."
exit 0
fi
let "j=j+3"
done
for usr in $int
do
if [[ "$2" == "$usr" ]]; then
watch -d -n 1 "echo \"Download: \" && tc -s class show
dev imq0 | grep -A 3 \"htb 1:$j \" && tc -s class show dev imq0 | grep -A 3
\"1:$(($j+1)) \" && tc -s class show dev imq0 | grep -A 3 \"1:$(($j+2)) \" &&
echo && echo \"Upload: \" && tc -s class show dev imq1 | grep -A 3 \"htb 2:$j
\" && tc -s class show dev imq1 | grep -A 3 \"2:$(($j+1)) \" && tc -s class
show dev imq1 | grep -A 3 \"2:$(($j+2)) \""
echo "Zako�czono."
exit 0
fi
let "j=j+3"
done
fi
;;
*)
echo
echo "U�ycie: rc.htb start|stop|restart|status"
echo "rc.htb stat <lan|adress IP>"
exit 1
;;
esac
