#!/bin/bash

##############################################################################
# UnderLinux BandLimit                                                       #
# ============================================                               #
#                                                                            #
# Copyright (c) 2003 by Marcus Maciel(ScOrP|On) scorpion@underlinux.com.br   #
# http://www.underlinux.com.br                                               #
#                                                                            #
# This program is free software. You can redistribute it and/or modify       #
# it under the terms of the GNU General Public License as published by       #
# the Free Software Foundation; either version 2 of the License.             #
##############################################################################


# Dependencias
# Ipchains ou Iptables , iproute2 , modulos do kernel de CBQ QoS e compania... hehehe :)
# Iptables: necessita de  iptable_mangle e ipt_MARK
# Ipchains: nenhuma

##################
#INSTALACAO
# crie o diretorio bandlimit dentro do seu /etc
# mkdir /etc/bandlimit
# dentro deste diretorio crie os arquivos ips e interfaces
# touch /etc/bandlimit/ips
# touch /etc/bandlimit/interfaces
# depois edite o ips e o interfaces
# colocando dentro do ips
# os ips que vc deseja limitar 1 por linha no seguinte formato
# ip:ratein:rateout ex: 10.0.1.2:97:33
# e no interfaces as interfaces que vc usa na sua maquina
# no formato ethx ex: eth0
# 1 por linha tambem :)))
#
# Para rodar coloque o script dentro do seu rc.local
# Para remover as regras digite rc.bandlimit stop
#
##################



####
# IMPORTANTE!!!! USAMOS OS COMANDO
#        iptables -F -t mangle
#        ipchains -F input
#        ipchains -F output
# Isso fara com que se voce tem alguma regra no seu mangle no iptables
# ou alguma regra no input ou output no seu ipchains esta regra sera apagada
# Para que voce nao perca suas regras de Firewall do iptables/ipchains
# Caso use alguma coisa no mangle do iptables ou alguma coisa no input/output
# no ipchains sete seu script de regras abaixo abaixo
#Lembrando que usamos o mangle apartir do mark 2 e este vai gerando um mark novo
#ate acabar seus ips ou seja se voce fizer pra 250 ips o ultimo mark sera o 252
#Caso use o Mark tente comecar apartir do 1000 para evitar Marks Iguais
#script=/path/seuscript.sh
script=0

##########################################################################################################
#Inicio da Configuracao

#Arquivos de Configuracao
ips=/etc/bandlimit/ips
#ips2=/etc/bandlimit/ips2
interfaces=/etc/bandlimit/interfaces
#########################

#Firewall's Suportados ipchains e Iptables # Padrao IPTABLES
#firewall=ipchains
firewall=iptables
###################################


#############
# Interfaces
redelocal=eth1
#redelocal2=eth0
redelocal2=inexistente
internet=eth0
#############

#Fim da configuracao
##########################################################################################################
#ifacenum=0

###Contando o numero de Interaces####
#for iface in `cat $interfaces`
#do
#	ifacenum=`expr $ifacenum + 1`
#done


if [ $firewall == "iptables" ]
then
        modprobe iptable_mangle
        modprobe ipt_MARK
fi



#inicio do markador :)
mark=2



if [ "$1" = "stop" ]; then
################################
echo "Removendo Regras"
for iface in `cat $interfaces`
do
	tc qdisc del dev $iface root
done
if [ $firewall == "iptables" ]
then
	iptables -F -t mangle
	if [ $script != "0" ]
	then
		$script
	fi
else
	ipchains -F input
	ipchains -F output
	if [ $script != "0" ]
	then
		$script
	fi
fi
################################

	else # Se nao tem "stop" entao assume start :)


		#Limpar Regras antes de rodar o script ):)
		iptables -F -t mangle
		if [ $firewall == "iptables" ]
		then
			iptables -F -t mangle
			if [ $script != "0" ]
			then
				$script
			fi

		else
			ipchains -F input
			ipchains -F output
			if [ $script != "0" ]
			then
				$script
			fi

		fi


		#adicionado interfaces
		for iface in `cat $interfaces`
			do
				tc qdisc del dev $iface root
				tc qdisc add dev $iface root handle 1 cbq bandwidth 10Mbit avpkt 1000 cell 8
				tc class change dev $iface root cbq weight 1Mbit allot 1514
			done

		####


		for ip in `cat $ips`
		do
			ratein=`echo $ip | cut -d ":" -f 2`
			rateout=`echo $ip | cut -d ":" -f 3`
			ip=`echo $ip | cut -d ":" -f 1`

			#entrada
			tc class add dev $redelocal parent 1: classid 1:$mark cbq bandwidth 10Mbit rate "$ratein"Kbit weight `expr $ratein / 10`Kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
			tc qdisc add dev $redelocal parent 1:$mark handle $mark sfq perturb 10
			tc filter add dev $redelocal parent 1:0 protocol ip prio 200 handle $mark fw classid 1:$mark
			if [ $firewall == "iptables" ]
			then
				iptables -t mangle -A POSTROUTING -d $ip -j MARK --set-mark $mark
			else
				ipchains -A output -d $ip  --mark $mark
			fi

			#Saida
			tc class add dev $internet parent 1: classid 1:$mark cbq bandwidth 10Mbit rate "$rateout"Kbit weight `expr $rateout / 10`Kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
			tc qdisc add dev $internet parent 1:$mark handle $mark  sfq perturb 10
			tc filter add dev $internet parent 1:0 protocol ip prio 200 handle $mark fw classid 1:$mark
                        if [ $firewall == "iptables" ]
                        then
				iptables -t mangle -A FORWARD -s $ip -j MARK --set-mark $mark
			else
				ipchains -A input -s $ip --mark $mark
			fi
			#################################################################
			mark=`expr $mark + 1`
		done

		if [ $redelocal2 != "inexistente" ]
		then
			for ip in `cat $ips2`
			do
				ratein=`echo $ip | cut -d ":" -f 2`
				rateout=`echo $ip | cut -d ":" -f 3`
				ip=`echo $ip | cut -d ":" -f 1`

				#entrada
				tc class add dev $redelocal2 parent 1: classid 1:$mark cbq bandwidth 10Mbit rate "$ratein"Kbit weight `expr $rateout / 10`Kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
				tc qdisc add dev $redelocal2 parent 1:$mark handle $mark sfq perturb 10
				tc filter add dev $redelocal2 parent 1:0 protocol ip prio 200 handle $mark fw classid 1:$mark
				if [ $firewall == "iptables" ]
				then
					iptables -t mangle -A POSTROUTING -d $ip  -j MARK --set-mark $mark
				else
					ipchains -A output -d $ip  --mark $mark
				fi

				#Saida
				tc class add dev $internet parent 1: classid 1:$mark cbq bandwidth 10Mbit rate "$rateout"Kbit weight `expr $rateout / 10`Kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
				tc qdisc add dev $internet parent 1:$mark handle $mark  sfq perturb 10
				tc filter add dev $internet parent 1:0 protocol ip prio 200 handle $mark fw classid 1:$mark
                    		if [ $firewall == "iptables" ]
	                        then
					iptables -t mangle -A FORWARD -s $ip -j MARK --set-mark $mark
				else
					ipchains -A input -s $ip  --mark $mark
				fi
				#################################################################
				mark=`expr $mark + 1`
			done
		fi
fi # fim do script




From:  Fabio Aragao <duvidaslinux@yahoo.com.br>
Reply-To:  Lista de discussão voltada para os usuários brasileiros do Fedora <fedora-users-br@redhat.com>
To:  Lista de discussão voltada para os usuários brasileiros do Fedora <fedora-users-br@redhat.com>
Subject:  Re: [Fedora-users-br] Bandlimit
Date:  Sat, 26 May 2007 16:36:18 -0300 (ART)
>manda o conf
>
>
>
>
>
>
>--- Alexandre Singulani <alexsingr@hotmail.com>
>escreveu:
>
>
>---------------------------------
>
>Ja vi esse FAQ.. e minha interface q acessa a internet
>esta configurada no arquivo.... :(
>
>
>
>[]s
>
>
>
>
>
>---------------------------------
>
>From:  Fabio Aragao <duvidaslinux@yahoo.com.br>
>Reply-To:  Lista de discussão voltada para os usuários
>brasileiros do Fedora <fedora-users-br@redhat.com>
>To:  Lista de discussão voltada para os usuários
>brasileiros do Fedora <fedora-users-br@redhat.com>
>Subject:  Re: [Fedora-users-br] Bandlimit
>Date:  Sat, 26 May 2007 15:59:33 -0300 (ART)
> >Veja se te ajuda um minusculo FAQ que peguei na net
> >
> >FAQ:
> >
> >P: Funciona com adsl-pppoe ou seja interface ppp0?
> >R: Funciona sim você coloca dentro da interface ppp0
>e
> >eth0 que deve ser sua rede local e configure dentro
>do
> >rc.bandlimit
> >internet=ppp0
> >redelocal=eth0
> >
> >P: No upload ele não controla... no download ele
> >controla...
> >R: Você tem certeza que setou corretamente a opção
> >internet=interfacedainternet dentro do arquivo de
> >configuração???
> >
> >P: Para eu conseguir 8 Kbytes/s de download e 4
> >Kbytes/s de upload tenho que colocar ip:80:40?
> >R: Isso, você está correto :)))
> >
> >So para se basear, nao uso o bandlimit é so para
> >tentar ajudar
> >
> >
> >
> >
> >--- Alexandre Singulani <alexsingr@hotmail.com>
> >escreveu:
> >
> >
> >---------------------------------
> >Alguem na lista usa esse script pra limitar banda de
> >internet na rede interna??
> >Uso ele aqui mas só ta limitando os downloads...os
> >uploads sempre ficam liberados... Alguem poderia me
> >ajudar??
> >
> >[]s
> >
> >
> >
> >---------------------------------
> >Seja um dos primeiros a testar o novo Windows Live
> >Mail Beta - grátis Acesse e inscreva-se agora!> --
> > > Fedora-users-br mailing list
> > > Fedora-users-br@redhat.com
> > >
> >https://www.redhat.com/mailman/listinfo/fedora-users-br
> > >
> >
> >
> >__________________________________________________
> >Fale com seus amigos  de graça com o novo Yahoo!
>Messenger
> >http://br.messenger.yahoo.com/
> >
> >--
> >Fedora-users-br mailing list
> >Fedora-users-br@redhat.com
> >https://www.redhat.com/mailman/listinfo/fedora-users-br
>
>
>
>---------------------------------
>Agora o Windows Live Spaces tem rede de amigos! Clique
>aqui e descubra a novidade > --
> > Fedora-users-br mailing list
> > Fedora-users-br@redhat.com
> >
>https://www.redhat.com/mailman/listinfo/fedora-users-br
> >
>
>
>__________________________________________________
>Fale com seus amigos  de graça com o novo Yahoo! Messenger
>http://br.messenger.yahoo.com/
>
>--
>Fedora-users-br mailing list
>Fedora-users-br@redhat.com
>https://www.redhat.com/mailman/listinfo/fedora-users-br


Torpedo Messenger- Envie torpedos do messenger para o celular da galera. Descubra como aqui!