Controle de banda com cbq
Controle de Banda com CBQ – (Class Based Queueing) [pic]Por Fabrizio Flores (fabrizio. flores@vant. com. br) 1. 0 – Introdução: [pic]Há algum tempo venho notando a falta de documentação, principalmente em Português, que aborde a configuração básica de controle de banda numa Linux Box. [pic]Este artigo pretende demonstrar alguns conceitos sobre o controle de banda e uma configuração básica do CBQ [pic]Obs: A distribuição usada foi um Slackware 8. 0 Kernel 2. 4. 7 1. – Considerações i [pic]A grande vantag permitir o controle n OFII p , (traffic Shaper é nstream ( trafego e entrada ), bem como o upstream ( trafego de saída Isto é muito importante principalmente hoje onde temos conexões DSL ( Digital Subscriber Line ), sendo instaladas Comumente em prédios e compartilhada entre vários computadores. Note que com raras exceções, uma das características da tecnologia DSL é ter uma diferença entre as taxas de transferência para o trafego que entra e o trafego que sai da sua máquina.
Comumente o trafego de entrada é superior já que o fluxo de dados tende a ser maior no sentido servidor-cliente. Já no caso do trafego de saída, ele tende a ser apenas texto. Portanto no caso de prédios u locais onde temos vários computadores compartilhando o mesmo link é recomendável limitar também o tráfego de saída, agora, suponhamos que numa destas máquinas seja instalado um serviço ftp, facilmente ele pode ia ocupar todo o ups upstream e fatalmente acabaria por comprometer o uso da rede pelas outras estações !
O CBQ também possibilita controlar o trafego sobre um determinado ip e não somente por interface como o traffic shaper faz. [pic]O CBQ apresenta outros recursos, alguns que valem citar: [pic] • controle sobre a banda excedente • possibilidade de criação e utilização de classes. ?? junto ao firewall: para proteção contra Ataques D. O. S. ( Denial- Of-Service ) * não tratado neste artigo. 1. 2 – Arquivos Necessários: [pic]Antes de iniciarmos a configuração de nossa Box, alguns arquivos que serão necessários: • cbq. ini ( ftp. equinox. gu. et/pub/linux/cbq/ ) • kernel-2. 4. 7 (http://www. kernel. org/pub/linux/kernel/v2. 4/linux -2. 4. 7. tar. gz ) ou (ftp:h’ftp. inr. ac. ru/ip-routing/ ) • iproute2 (ftp://ftp. Iinuxmafia. org/pub/Slackware-8/robert /iproute2-2. 4. 7 ) ou ( www. linuxmafia. org ) existe um search para os pacotes do slackware ( .. tgz ) 2. – Instalando o Cbq. ini, Iproute2 e Configurando seu Kernel: [pic]Crie um diretório onde serão colocados os arquivos de configuração para o CBQ, geralmente dentro do /etc. Aqui eu criei o diretório /etc/cbq. [pic]Edite o script cbq. ni e procure pela linha: etc/sysconfig/cbq” substitua o que esta dentro das aspas pelo caminho completo até o diretório que você acabou de criar. Ex: CBQ_PATH=”/etc/cbq”. Salve e faça uma copia do arquivo para o diretório /sbin. Caso queira você poderá renomear o arquivo apenas para “cbq”, o que irá facilitar na hora de digitar algum comando : ) 20F cbq”, o que irá facilitar na hora de digitar algum comando : ) [pic]Lembre-se de verificar as permissões para o script que você acabou de copiar , ele deve ser executável. [pic]Verifique se sua distribuição já não possui o pacote iproute2 previamente instalado. pic]Caso sua distribuição seja o Slackware, é provável que não esteja instalado. Para instalar o pacote no Slackware 8, apenas digite installpkg iproute2-2. a. 7. tgz. Feito isto digite apenas ip deve aparecer algo na tela tipo: Usage: ip [ OPTIONS] OBJECT { COMMAND I help} where OBJECT { link addr I route I rule I neigh tunnel I addr I mroute I monitor} OPTIONS { -V[ersion] -s[tatistics] I -r[esolve] -f[amily] { inet inet6 1 ipx dnet I link } -o[neline] } Caso você use outra distribuição e esta não venha com o iproute2 instalado, procure pelos pacotes do iproute2 ou obtenha os fontes no ftp do projeto: ( ftp://ftp. nr. ac. ru/ip-routing/ ), no caso de optar pelos fontes, lembre-se de ler o README antes de compilar ! 2. 1 – Configurando o Kernel [pic]No exemplo abaixo, foram colocadas apenas as opções referentes ao QOS / CBQ e NETFILTER / IPTABLES, estas são as opções que geralmente eu utilizo. Você provavelmente terá que adicionar mais alguma coisa, mas isto fica a seu critério. *]Prompt for development and/or incomplete code/drivers (*) Packet socket [*] Kernel/User netlink socket [*] Routing messages [ú] Network packet filtering (replaces ipchains) Socket Filtering (*)Unix domain socket messages Network packet filtering (replaces ipchains) [*] Socket Filtering (*)Unix domain sockets [ú] UCP/IP networking multicasting . advanced router P: policy routing (NEW) : use netfilter MARK value as routing key (NEW) equal cost multipath (NEW) : use TOS value as routing key (NEW)
P: verbose route monitoring (NEW) [ú] IP: large routing tables (NEW) : TCP syncookie support (disabled per default) P: Netfilter Configuration —) (*) Connection tracking (required for masq/NAT) (*) FTP protocol support (*) IP tables support (required for filtering/masq/NAT) (*) limit match support (*) MAC address match support (*) netfilter MARK match support (*) Multiple port match support (*) TOS match support (*) tcpmss match support (*) Connection state match support (*) Packet filtering (*) REJ ECT target support pull NAT MASQUERADE target support (*) REDIRECT target support *) Packet mangling (*) TOS target support (*) MARK target support QoS and/or fair queueing – [*] QoS and/or fair queuei 40F (M) TC index classifier (NEW) (M) Routing table based classifier (NEW) (M) Firewall based classifier (NEW) (M) U32 classifier (NEW) (M) special RSVP classifier (NEW) (M) Special RSVP classifier for IPv6 (NEW) Traffic policing (needed for in/egress) (NEW) [pic]CompiIe, instale o novo kernel e reinicie seu sistema ! 3. 0 – Configurando o CBQ: [pic]O CBQ trabalha com arquivos de configuração encontrados no diretório definido pela variável $CBQ PATH, sendo que cada rquivo contém uma regra [pic]O arquivo de configuração deve obedecer o formato pré- definido: cbq-(clsid). nome) [pic]onde: (clsid) é um número hexadecimal de dois-bytes na escala ( 0002-FFFF que forma uma classe ID de CBQ e (nome) é o nome do shaper- ( pode ser qualquer texto ) [pic]Em casos em que temos poucos arquivos de configuração, você pode definir o (clsid) como a velocidade do shaper Ex. 64k, cbq-0064. backbone-cliente; 512k, cbq-0512. backbone-cliente Cada arquivo de configuração deve conter os parâmetros(obrgatónos) : DEVICE=(int-nome),(banda),(peso) ou rede a ser controlada) Parâmetro DEVICE ( obrigatório ) [pic]DEVICE=(int-nome),(banda),(peso) ex: DEVICE=ethO,10Mbit, 1 Mbit é o nome da interface a ser controlada ex: eth0, ethl, Io, pppO, wvlanO a (banda).
Como regra teremos que: (peso) = (banda) / 10 [pic]Quando houver mais classes não mesma interface, só é necessário especificar o parâmetro (banda) e (peso) uma única vez, consequentemente em outros arquivos você poderá ter somente o DEVICE=(nome) Parâmetro RATE ( obrigatório ) ex: RATE=5Mbit [pic]Banda alocada para a classe – limitando a velocidade do shaper. podemos usar: Kblt, Mbit ou bps, Kbps, Mbps como ufixos. Parâmetro WEIGHT ( obrigatório ) ex: WEIGHT=500Kbit [pic]parâmetro de ajuste que deve ser proporcional a (banda). Como regra teremos que: (peso) = (banda) / IO parâmetro PRIO ( obrigatório ) -8) ex: PRIO=5 [pic]Pnondade do tráfego para a classe. Quanto mais elevado o número, menor a prioridade. A prioridade 5 é um valor excelente. parâmetro RULE [pic]RULE=[[saddr[/prefix]][:port],][daddr[/prefix]][:port] [pic]Os parâmetros acima fazem que o filtro u32 controlem o tráfego para cada uma das classes.
Você pode usar múltiplos compôs de regras por arquivo de configuração. pic]ExempIos: [pic]controla o tráfego de rede que passa através da porta 80 na rede 10. 1. 1 . O [pic]controla o tráfego de rede que passa através de qualquer porta ou do host 10. 2. 2. 5 [pic]controla o trafego vindo de qualquer origem, com destino entre a porta 50 a porta 5000 na rede 10. 2. 2. 128 [pic]controla o tráfego vin do host 10. 5. 5. 5 [pic]controla o tráfego vindo da porta 80 do host 10. 5. 5. 5 [pic]Uma virgula “,” colocada após qualquer uma destas regras irá controlar o trafego de saída da rede (upstream). Tome cuidado para adicionar a “,” na interface de rede correta. râmetro TIME [pic]Este parâmetro limita o acesso em horários predeterminados [pic]TIME=(hora inicial)-(hora final);(velocidade)/(velocidade/10) [pnex. Outros parâmetros [pic]se definido como “yes” o shaper será mantido mesmo que haja banda excedente [pic]se definido como “yes” a banda excedente não será compartilhada 4. 0 – Exemplos de arquivos de configuração: [pic]Observe o exemplo abaixo: DEVICE=ethO, 1 Mbit RATE=128Kbit WEIGHT=10Kbit PRIO=5 RULE=1 92. 128. 1. 0/24 [pic]Esta configuração diz, que o tráfego na interface ethO de IOMbit através da rede 192. 168. 1. 0 será processado com a rioridade 5 e uma taxa de shapping de 128kbit.
Note que desta forma somente o tráfego de saída (upstream) está sendo controlado. [pic]Para controlar o tráfego nos dois sentidos, devemos configurar o CBQ para ambas interfaces. Observe o exemplo: terá que criar dois arquivos de configuração, um para a ethO e outro para a ethl: cbq-0028. backbone-client Mbit RATE=28Kbit WEIGHT=2Kbit RULE=1 92. 168. 1. 0/24 cbq-01 28. client-backbone RULE=200. 1. 1. 1, 5. 0 – Testando: [pic]No prompt de comando, digite: cbq [pic]Uma pequena lista de comandos irá aparecer na tela: usage: cbq {start Istopl restart timecheckllistl stats} Digitando cbq start, os arquivos de configuração serão carregados, neste momento sua rede já deve estar sofrendo a ação do shaper. pic]Para testar, basta mudar os parâmetros de configuração e digitar: cbq restart, isto forçara a reinicialização do cbq e as novas configurações serão lidas. Coloque velocidades da ordem de Ikbit, e você verá como fica realmente lento ( hahahahahah ), mas falando sério isto irá e o cbq realmente está 80F esta praticamente concluída, apenas devo lembrar que as estações ainda não poderão navegar na internet- Esta faltando uma coisinha chamada NAT. Não pretendo explicar neste artigo o que é, ou dar qualquer detalhamento sobre o assunto, contudo colocarei um exemplo de script que você deverá: ler, entender, e se achar que deve, rodar em seu rc. local. este script não foi feito por mim , peço desculpas ao autor, mas não lembro onde encontrei este exemplo) echo “1 ” > /proc/sys/neVipv4/lp_forward /sbin/modprobe iptable_nat /sbin/modprobe ip_conntrack Isbin/modprobe ip_conntrack_ftp Isbin/modprobe ip_tables /sbin/modprobe ipt_unclean /sbin/modprobe ipt_limit /sbin/modprobe ipt_LOG Isbin/modprobe ipt_REJECT /usr/sbin/iptables -F /usr/sbin/iptables -t nat -F swsbinnptables -P FORWARD DROP /usvsbfi/iptables -A INPUT -i lo -j ACCEPT /usr/sbin/iptables -A OUTPUT -o lo -j ACCEPT ,’usr/sbin/iptables -A FORWARD -s 192. 168. 1. 0/24 -d 0/0 -j ACCEPT mswsbinnptables -A FORWARD -s 0/0 -d 192. 168. 1 . ona -mstate ESTABLISHED,RELATED -j ACCEPT /usr/sbin/iptables -t nat -A POSTROIJTING -s 192. 168. 1*0/24 -d 0/0 -j MASQUERADE [pic]Obs: troque o ip 192. 168. 1 . O para o ip de sua rede interna [pic]Para maiores informações procure no www. google. com por: NAT, IPTABLES, NETFILTER, MASQUERADE 6. – DHCPD: [pic]Para deixar a solução completa, provavelmente seria nteressante você rodar um dhc server, para facilitar sua vida e de seus clientes. Então resolvi colocar também um exemplo de dhcpd. conf. [pic]Para instalar: vida e de seus clientes. Então resolvi colocar também um exemplo de dhcpd. conf. [pic]Para instalar: em sua linux Box, no diretório /etc, crie um arquivo chamado dhcpd. conf e cole o exemplo abaixo. Você deve editar o arquivo e substituir os ips como indicado abaixo. default-lease-time 43200; max-lease-time 43200; option domain-name “nome-de-seu-servidor”; option domain-name-servers 192. 168. 1. 1; subnet 192. 168. 1. netmask 255. 255. 255. 0 { range 192. 68. 1. 50 192. 168. 1. 250; option routers 192. 168. 1. 1; option subnet-mask 255. 255. 255. O; #option netbios-name-servers 192. 168. 1. 1; #option netbios-node-type 2; [pic]onde: option domain-name-servers ip-do-seu-servidor-de-nomes; subnet 192. 168. 1 . O netmask 255. 255. 255. 0 { [pic]substitua o ip 192. 168. 1. 0 pelo ip de sua rede interna ! [pic]Feito isto, coloque o seguinte comando em seu rc. local: [pic]/usr/sbin/dhcpd (interface) [pic]onde: (interface) é a interface de rede em que você deseja rodar o dhcp server. [pic]para maiores informações e outros detalhes, no prompt, digite man dhcpd 0 DF 11