Mostrando postagens com marcador iptables. Mostrar todas as postagens
Mostrando postagens com marcador iptables. Mostrar todas as postagens

quarta-feira, 11 de junho de 2008

Controle de banda com TC e IPTABLES

Olá amiguinhos,

Atendendo a pedidos ontem no laboratório, vou fazer um tutorial explicando como controlar a banda usando o tc e o iptables. Vou tentar ser o mais didático possível. Bom, vamos lá, considerando que sua distribuição seja Debian, verifique se o iproute e o tcng estão instalados, caso não estejam, instale com o seguinte comando:

# aptitude install tcng


Agora vá até um diretório qualquer, e crie um script:

# vim fw


Agora monte a seguinte estrutura:

#!/bin/bash

# Linha 1
tc qd del dev eth0 root

# Linha 2
tc qd add dev eth0 root handle 1: htb

# Linha 3
tc cl add dev eth0 parent 1: classid 1:1 htb rate 4Mbit ceil 4Mbit

# Linha 4
tc cl add dev eth0 parent 1:1 classid 1:10 htb \
rate 64Kbit ceil 128Kbit prio 1

# Linha 5
tc filter add dev eth0 parent 1:0 protocol ip prio 1 \
handle 0x1 fw classid 1:10

# Linha 6
iptables -t mangle -F

# Linha 7
iptables -t mangle -A POSTROUTING -p tcp --sport 80 \
-j MARK --set-mark 0x1


Bom, vamos lá vou explicar linha por linha:

# Linha 1: Esse comando apaga a classe raiz do dispositivo eth0. Ou seja, ele apaga tudo mesmo, todas as classes que estão incorporadas na classe raiz. É interessante usar esse comando quando se faz um script que você precisa reiniciar os serviços.

# Linha 2: Adiciona uma nova fila raiz, no dispositivo eth0, com o tipo de fila htb. Esse comando cria o topo da hierarquia, onde tudo vai ser incluído nele.

# Linha 3: Adiciona uma classe mãe, no dispositivo eth0, e ela é parente da classe raiz (1:), o tipo da fila dela é htb e a banda definida para essa classe é de 4Mbit. O comando ceil, é uma variação de banda, significa que se você definir, por exemplo, 1Mbit ceil 4Mbit, o minimo é 1Mbit e o máximo que pode chegar é 4Mbit. Pra simplificar é isso que significa. Agora que criamos a classe mãe, faremos os filhos dela e trabalharemos de acordo com o limite de banda definidos por ela.

# Linha 4: Cria uma classe para o dispositivo eth0, sendo que é parente da classe 1:1 (classe mãe), a identificação dela é 1:10, o tipo da fila dela é htb, e a banda definida para essa classe é de 64Kbit no minimo e 128Kbit no máximo. O parametro prio, é a prioridade, segue o mesmo conceito do TOS. Você pode criar várias classes filho, e você pode brincar com isso, por exemplo, pra http eu defino uma velocidade, pra ssh eu defino outra e assim vai. Eu posso distribuir a banda pra cada tipo de serviço.

# Linha 5: O segredo da coisa funcionar. Essa linha cria um filtro de acordo com a marcação que foi feito no pacote com o iptables. Se você marcar o pacote com o número 0x1, o htb vai pegar esse pacote e tratar conforme a classe pede. Então, cria um filtro para o dispositivo eth0, da classe raiz, sobre o protocolo ip, com prioridade número 1, com todos os pacotes que estejam marcados com o número 0x1, e redireciona para a classe com identificação 1:10 tratar a banda. Simples não?

# Linha 6: Simplesmente limpa a tabela mangle do iptables.

# Linha 7: Marca todos os pacotes que estão saindo pela porta 80 com o número 0x1, de qualquer origem pra qualquer destino, sobre o protocolo tcp.

Essas regras foram adicionadas somente no dispositivo eth0. Se seu servidor usa um modem do tipo router, vai funcionar perfeitamente. Se for um modem que conecta sobre o pppOE, então é só mudar a interface para ppp0.

Trabalhar com o TC não é dificil, basta entender o conceito de hierarquia, veja o desenho abaixo:



Bom, espero que eu consegui ajudar. Qualquer dúvida é só perguntar.

Enjoy...