Este documento descreve como configurar o Dummynet e IPFW no FreeBSD para controlar o tráfego de rede, criando túneis ("pipes") que canalizam o tráfego para endereços específicos e limitam a banda de cada máquina a 100Kbps. Ele fornece exemplos de regras IPFW e configurações de "pipes" para separar o tráfego por origem/destino IP.
1. Traffic Shapping – Dummynet
Autor: Vinícius Batista da Silva
Data: 13/11/2015
RESUMO
“Dummynet nada mais é do que uma regra
de Traffic Shapping que controla o
roteamento, canalizando as informações
que posteriormente irão trafegar por
endereços específicos de rede. A criação
desses túneis é feita com o comando
“pipe” do ipfw(8). O tráfego é
redirecionado à esses tuneis por meio do
comando “pipe <pipe #>” no ipfw(8). “
Tracanelli, Patrik.
Imagem 1: Diagrama Dummynet
Fonte: http://info.iet.unipi.it/~luigi/dummynet/
Este documento exemplifica a configuração necessária para
uma boa prática de utilização do traffic shapping com a ferramenta
Dummynet + IPFW. A grande vantagem da sua utilização é o controle da
utilização do nosso link de produção, o qual, hoje não temos um completo
controle de “gastos” deste recurso.
1 – INSTALAÇÃO E COMPILAÇÃO MÓDULO DUMMY
Para o funcionamento do controle de banda em nossa
infraestrutura, será necessário a utilização de pilha dupla em nosso
firewall (PF + IPFW). Esta configuração resume-se em utilizar a camada
do package filter (PF) como firewall principal e o IPFW como controle
de banda.
Para prover tal funcionamento, será necessário recompilar o kernel
do FreeBSD com suporte as seguintes opções:
options IPFIREWALL
options IPDIVERT
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=10
2. options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_NAT
options LIBALIAS
options DUMMYNET
Nota: Execute os passos padrões para uma nova compilação e
reinicie a máquina.
Para validar a instalação do novo módulo, execute o seguinte comando:
root@lab_gprs4:~ # ls /boot/kernel | grep -v kernel | grep dummy
Imagem 2: Listagem de módulos compilados via kernel
2 – CRIAÇÃO DE REGRAS IPFW E PIPES
Neste tópico serão abordadas as criações regras e pipes via
ipfw. Abaixo exemplo de regras e Queues:
2.1 – Enfileiramento de pipes (Pipe Queues):
Vamos assumir ideia onde cada estação deve ter uma banda de
100Kbit/s. Se nós simplesmente direcionarmos todo o tráfego para um
túnel (como modelado anteriormente), o valor do tráfego será a somatória
de todas as estações, podemos realizar uma representação matemática deste
exemplo:
{nM}/{dB} = cB
nM – Número de máquinas;
dB – Banda delimitada;
cB – Banda concorrente;
“Utilizar banda pré-definida para um
número definido de máquinas não é a
melhor saída, pois poderemos perder o
controle do fluxo, imagine que uma de
nossas aplicações publicadas receba
conexão de várias partes do mundo”
Balmant, Jeferson.
Para utilização de máscaras para as estações às quais o tráfego deverá
ser separado por filas específicas, será possível realizar esta após
criar o seguinte conjunto de regras:
Exemplo 1:
pipe 10 config mask src-ip 0x000000ff bw 100Kbit/s queue 10Kbytes
pipe 20 config mask dst-ip 0x000000ff bw 100Kbit/s queue 10Kbytes
add 1000 add pipe 10 all from 192.168.200.0/24 to any out via bce2
add 2000 add pipe 20 all from 192.168.200.0/24 to any in via bce2
0x000000ff -> representação em hexa para qualquer IP;
Bw -> Variável de configuração da banda;
3. Máscaras que podem ser utilizadas para orientação do fluxo de
dados:
"dst-ip" – máscara para IP de destino do pacote que está sendo enviado
pelo túnel;
"src-ip" – máscara da origem;
"dst-port" – máscara para porta de destino;
"src-port" – máscara para porta de origem;
"proto" – máscara do protocolo a ser utilizado;
"all" - máscara geral, que especifica todos os bits nos campos (dst-
ip, src-ip, etc) como importantes e válidos;
Cálculo de filas:
Número de Slots * MTU = Valor em Kbytes
10 * 1500 = 15000bytes (Cálculo de banda para fila)
1500/1024 = 14Kbyte/s (Transformação de unidade de medida)
Nota: No exemplo supracitado “Exemplo 1” é possível ajustar um valor pré-definido
para qualquer saída pela interface “bce2”. Este modo de configuração permite
mantermos um valor padrão de banda
3.0 - Remanejamento de Pacotes por Túneis (Packet Reinjection);
Em 99% dos casos, assim que um pacote é direcionado à um túnel
(pipe), é a configuração definida pro túnel que toma parte do pacote, e
nesse momento a busca nas regras termina, como de costume no
ipfirewall(4). Contudo você pode forçar que o pacote seja reinjetado (ou
remanejado) no firewall, a partir da regra seguinte, mesmo depois de ter
sido direcionado para o túnel. Para fazer isso basta desativar a seguinte
opção no sysctl (8):
Sysctl –a net.inet.ip.fw.one_pass=1
Nota: Para persistir a configuração basta criar a seguinte
entrada no arquivo de configuração:
echo “net.inet.ip.fw.one_pass=1” >> /etc/sysctl.conf
4.0 – Referências
[1] - http://info.iet.unipi.it/~luigi/ip_dummynet/original.html
[2] - http://www.joemiller.me/2010/08/31/simulate-network-latency-
packet-loss-and-bandwidth-on-mac-osx/
[3] - http://www.gta.ufrj.br/grad/13_1/firewall/classificacao.html
[4] - https://www.freebsd.org/cgi/man.cgi?ipfw
[5] - http://www.free.bsd.com.br/~eksffa/freebsd/ipfw.txt