FreeBSD
Controle de Tráfego
IPFW2 + Dummynet
O Dummynet é uma ferramenta muito flexível para gerenciamento
de banda, para impor ou simular algumas condições desejadas no
tráfego da rede. Ele funciona interceptando os pacotes e passando-os
por um ou mais "pipes" ou "queues", que podem efetuar a
limitação de banda, perdas de pacotes, retardos de propagação
etc. Os pipes são canais com largura de banda fixa, enquanto as queues
representam filas de pacotes, associadas a um peso (weight). As queues compartilham,
em proporção ao peso, a largura de banda dos pipes aos quais estão
associadas.
Todo o gerenciamento do Dummynet é feito através do IPFW, que deverá estar configurado e funcionando. Veja sobre isto na seção Firewall - IPFW2. Há apenas duas opções a mais que devem ser adicionadas à configuração do kernel:
options DUMMYNET
options HZ=1000
A segunda opção não é obrigatória, mas na maioria dos casos auxilia no funcionamento do Dummynet. Ela define a granularidade do timer utilizado pelo sistema, que é de 10ms (HZ=100) por padrão. Efeitos do Dummynet como o delay de propagação são aplicados um a cada ponto do timer, então reduzir a granularidade irá possibilitar o tratamento de taxas de tráfego mais altas, e a especificação de delays mais precisos. A opção HZ=1000 irá definir a granularidade para 1ms. Valores menores que 1ms não são recomendados, para maiores informações veja a RFC1323.
Adicionadas as opções, compile e instale o kernel, conforme descrito na seção Recompilação e Instalação do Kernel.
Após isso, basta adicionar as regras desejadas através do IPFW. As opções do IPFW específicas para Dummynet estão descritas abaixo.
Para definir um pipe utiliza-se o seguinte comando / regra:
ipfw pipe número config opções-configuração
Para a definição de uma queue utiliza-se o comando / regra abaixo:
ipfw queue número config opções-configuração
Em ambos os casos o parâmetro número não depende da númeração das demais regras do ipfw. As opções de configuração são as seguintes:
Opções de configuração específicas do
pipe:
bw banda
Define a largura de banda do pipe. A banda deve ser especificada em Kbit/s,
Mbit/s, KByte/s ou MByte/s.
delay delay
Define o delay de propagação do pipe. O delay deverá ser
especificado em milisegundos.
Opções de configuração específicas da
queue:
pipe número
Conecta a queue ao pipe especificado. Podem ser conectadas várias queues
a um único pipe.
weight peso
Especifica o peso daquela queue. O valor pode variar de 1 a 100.
Principais opções de configuração, comuns ao
pipe e à queue:
buckets tamanho-tabela
Especifica o tamanho da tabela usada para guardar as diversas queues. O valor
pode variar de 16 a 65536, o padrão é 64.
mask especificação-máscara
Define diferentes fluxos através da aplicação da máscara
especificada. Cada fluxo é enviado para uma queue ou pipe separado, criados
dinamicamente. Cada pipe dinâmico terá a mesma largura de banda
do pipe original, enquanto que cada queue dinâmica irá compartilhar
com as demais dinâmicas a largura de banda do pipe ao qual está
conectada a original. A especificação de máscara deve ser
uma ou mais das seguintes:
dst-ip máscara, src-ip máscara, dst-port máscara, src-port
máscara, proto máscara ou all.
O parâmetro all define que todos os bits em todos os campos são
significantes.
noerror
Não reporta o erro quando um pacote for perdido, por exemplo em uma simulação
de perda de pacotes ou congestionamento.
plr taxa-perda
Define a taxa de perda de pacotes. O valor deverá ser entre 0 e 1, com
0 significando nenhuma perda, e 1 significando 100% de perda.
queue {slots | tamanhoKBytes}
Tamanho da fila, em slots ou KBytes.
Os comandos para manipular as regras de pipes e queues são similares
aos das regras comuns do IPFW:
ipfw {pipe | queue} {delete | list | show} número
Exemplos
Limitar o tráfego da rede 10.10.0.0/16 para a 192.168.0.0/16 em 300 Kbit/s:
ipfw add 1000 pipe 1 src-ip
10.10.0.0/16 dst-ip 192.168.0.0/16
ipfw pipe 1 config bw 300Kbit/s queue 50KBytes
Simular uma perda de pacotes de entrada de 5%:
ipfw add 1000 pipe 1 in
ipfw pipe 1 config plr 0.05
Limitar o tráfego em 300Kbit/s de entrada em ambas as direções:
ipfw add 1000 pipe 1 in
ipfw add 1100 pipe 2 out
ipfw pipe 1 config bw 300Kbit/s queue 50KBytes
ipfw pipe 2 config bw 300Kbit/s queue 50KBytes
Limitar o tráfego de cada máquina da rede 10.10.0.0/16 em 128Kbit/s nas duas direções:
ipfw add 1000 pipe 1 src-ip
10.10.0.0/16 out
ipfw add 1100 pipe 2 dst-ip 10.10.0.0/16 in
ipfw pipe 1 config mask src-ip 0x000000ff bw 128Kbit/s queue 10KBytes
ipfw pipe 2 config mask dst-ip 0x000000ff bw 128Kbit/s queue 10KBytes
Introduzir um delay no tráfego:
ipfw add 1000 pipe 1 in
ipfw add 1100 pipe 2 out
ipfw pipe 1 config delay 250ms bw 1Mbit/s
ipfw pipe 2 config delay 250ms bw 1Mbit/s
Devemos dar atenção ao tamanho da queue (fila) nos pipes quando
fazemos limitação de banda, pois apesar de limitarmos a largura
de banda em 50 Kbit/s, por exemplo, o MTU da interface de rede continua o normal,
1500 bytes. Se não for especificado o tamanho da fila, ela será
muito grande e irá gerar um delay não desejado no tráfego.
O tamanho padrão da fila é 50 slots, que multiplicado pelo MTU
de 1500 bytes, dá o valor de 600 Kbits. Essa fila iria levar 12 segundos
para ser preenchida por uma banda de 50 Kbit/s, o que é um atraso muito
grande na comunicação.
Atualizado em 03/02/04.
Heini Thomas Geib.
http://www2.unijui.edu.br/~heini