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