Como Configurar um Emulador de Latência(atraso) de Redes WAN.

Bem vindos!!

Mais uma do PreciseiPostei para você!!


PROBLEMA:

PRECISEI verificar o funcionamento de uma aplicação “Cliente-Servidor” que estava apresentando problemas. Os usuários estavam reclamando de  lentidão excessiva durante seu uso e alegavam problemas com a largura de banda disponível.

Para descartar ou confirmar as alegações dos usuários, utilizamos uma ferramenta que monitorava a largura de banda do enlace utilizado pelo módulo cliente para acessar o módulo servidor da aplicação.

Ao final da análise dos resultados registrados pela ferramenta, constatamos que o problema não era Largura de Banda ,pois tinha . Foi então que a hipótese do problema estar sendo causado pela Latência(atraso) da rede  foi levantada, mas essa possibilidade gerou dúvida nos usuários principalmente pelo desconhecimento da definição de Latência da Rede.

Assim sendo, deixo uma breve definição de Latência(atraso) de rede:

” É um termo para descrever a quantidade de tempo necessária para os dados serem processados ou movidos. Latência tem haver com distância, velocidade da luz e o tempo que o hardware tem para processar os dados. Envolve diretamente os conceitos de Atraso de Propagação e Atraso de Processo.” (Livro Network Warrior- Gary A. Donahue “O’Reilly Media, Inc.)

Da mesma forma que provamos que o problema não era Largura de Banda ,foi necessário comprovar que problema era Latência (Atraso) da rede, para isso utilizamos o Netem (Network Emulation)

Essa ferramenta permite que se emule testes de protocolos em redes com propriedades WAN(Wide Area Network). Conforme descrição do wiki da ferramenta

"..netem provides Network Emulation functionality for testing protocols by emulating the properties of wide area networks. The current version emulates variable delay, loss, duplication and re-ordering.."(ref: https://wiki.linuxfoundation.org/networking/netem)

PARA SOLUCIONAR:

Precisamos de(o):

  • uma Estação de Trabalho com duas Placas de Rede;
  • uma Distribuição Linux (Em nosso cenário utilizamos Ubuntu 18.04.3 LTS -LIVE-CD)
  • pacote net-tools instalado
  • pacote bridge-utils Instalado
  • pacote iproute instalado
OBSERVAÇÃO: Não irei colocar como instalar os pacotes acima, pois dependendo da distribuição que for escolhida os métodos para instalar podem diferenciar bastante.

Tendo a Estação de Trabalho com as duas placas de redes instaladas, o sistema operacional carregado e os pacotes instalados, coloquei-a entre um notebook com o módulo cliente instalado  e a infra que se conecta ao servidor que possuia o módulo servidor.

A topologia  ficou semelhante a desenhada abaixo:

Nosso ambiente estava pronto para ser configurado como um Emulador de Latencia de Redes WAN. Para isso utilizamos como referência o site https://calomel.org/network_loss_emulation.html. Os comandos utilizados nos passos a seguir foram retirados desse site.


PASSO 1

IMPORTANTE: O nomes das interfaces eth0 e eth1, no comando acima, deverão ser substituidos pelos nomes previamente configurados pelo seu sistema operacional para suas interfaces de rede.

Configurei as interfaces de rede, que iriam ser utilizadas,  em modo promíscuo.Para isso executei os dois comandos abaixo.

# ifconfig eth0 0.0.0.0 promisc up

# ifconfig eth1 0.0.0.0 promisc up

Beleza, mas por que esses parâmetros para o ifconfig?

Explicando…

Como essas interfaces serão foram utilizadas em bridge, não precisei configurar IP válidos para elas, logo preenchi os octetos com zero  utilizando o parâmetro 0.0.0.0, 

A interfaces deverão ficar em modo Promiscuo sendo esse configurado individualmente(promisc) 
O parâmetro promisc é necessário para que as interfaces capturem todo o tráfego que passar por ela, ao invés de capturar apenas o tráfego endereçado a elas.(ref:Steal This Computer Book 4.0) 

Ativei as configuração para as interfaces com o parâmetro up

PASSO 2

Configurei uma interface lógica bridge e inclui as interfaces de rede(física) que iriam fazer parte dela. Foram executados três comandos.

# brctl addbr br0

# brctl addif br0 eth0

# brctl addif br0 eth1

Explicando….

O Comando brctl é utilizado para configurar, manter e inspecionar uma bridge criada.Ele faz parte do pacote bridge-utils. A bridge será executada no nível de kernel do Linux.

" brctl is used to set up, maintain, and inspect the ethernet bridge configuration in the linux kernel (ref:brctl(8)-Linux man page ou https://linux.die.net/man/8/brctl)"

No primeiro comando, o parâmetro addbr irá criar a interface bridge br0 que é uma interface lógica que irá agregar as interfaces reais(físicas) da bridge.

No segundo comando, o parâmetro addif irá adicionar na interface lógica br0, a interface de rede eth0.

Por fim, no terceiro comando, o  parâmetro addif irá adicionar na interface lógica br0, a interface de rede eth1.


PASSO 3

Finalmente  utilizei o NetEM para adicionar uma latência de 100ms a interface eth0 e dessa forma Emular a Latência de uma Rede WAN em uma rede local. Para isso executei o comando abaixo.

# tc qdisc add dev eth0 root netem delay 100ms

O Netem(Network Emulator), é controlado pelo comando tc e faz parte do pacote iproute.





Netem is controlled by the command line tool 'tc' which is part of the iproute2 package of tools. The tc command uses shared libraries and data files in the /usr/lib/tc directory

……Agora explicando os parâmetros do comando executado.

O parâmetro qdisc é utilizado para manipular o qdisc (queueing discipline) da interface de rede. No qdisc ficam armazenados o enfileiramento dos pacotes enviados pelo kernel do linux para a interface de rede. Posteriormente o kernel irá tentar retirar máximo de pacotes do qdisc para entregar ao driver da placa de rede. Se queremos manipular a latência, precisamos de acesso ao qdisc. O qdisc possui a estrutura de uma árvore hierárquica parecida com uma MIB SNMP tendo uma raiz(root) e seus ramos(classes e subclasses).

Já os parâmetros add dev eth0 selecionam qual dispositivo de rede irá ser anexado o qdisc.

O parametro root é mandatório, uma vez que o  qdisc  a ser modificado será ClassLess (pois não possui classes ou subclasses).

Por fim os parametros netem delay 100ms informam qual qdisc será alterado, neste caso netem,e os parametros que serão modificados  nesta situação será o delay em 100 ms.

  Essas e outras explicações podem ser encontradas no link https://wiki.linuxfoundation.org/networking/netem#emulating_wide_area_network_delays ou na man page do comando tc digitando: $man tc (alternativamente acessando https://linux.die.net/man/8/tc).

PASSO 4

Para verificar se o comando funcionou, bastou executar o comando abaixo no notebook que estava com o módulo cliente.

$ping 192.168.3.2

Verifiquei que o tempo de resposta estava igual a 100ms, logo funcionou!!!

Claro que  o endereço de IP digitado trata-se do endereço configurado no servidor que contém o módulo servidor.


PASSO 5  (opcionais)

Utilizei algumas vezes o comando abaixo para alterar os parâmetros novamente do qdisc.

# tc qdisc del dev eth0 root netem

Ele remove as alterações realizadas no qdisc netem para a interface eth0.

Outro dois comandos opcionais são

#ifconfig br0 192.168.0.111 netmask 255.255.255.0 up
#route add default gw 192.168.0.1 dev br0

O primeiro comando adiciona um endereço IP a interface lógica br0 e o segundo adiciona um gateway padrão para a mesma interface lógica.

Com esses comandos é possível  acessar a Estação de Trabalho(utilizada para Emular a Latência WAN) remotamente.


FINALMENTE

Com  tudo verificado, utilizei o notebook com o módulo cliente da aplicação, conectado diretamente(com um cabo crossover) na Estação de Trabalho com as configurações todas prontas do Emulador de Latencia.

  • Fiz um primeiro teste sem utilizar o comando tc. Executei a aplicação cliente e tudo funcionou normal.
  • No segundo teste utilizei o comando tc ( como explicado no PASSO 3) e ao executar a aplicação cliente  instalada no notebook

a aplicação apresentou lentidão excessiva acessando o módulo servidor. Sendo assim comprovei que a aplicação apresentava problemas  quando utilizada em redes com alta Latencia na Rede


Resumindo…

O NetEM é um verdadeiro canivete suiço para testes e emulação de procolos em redes WAN. Existem diversos comandos, parâmetros  e outras classes e filtros que podem ser utilizados.Como só publico o que precisei e utilizei, me limitei a postar apenas esses comandos.

Assim sendo, PRECISEI dessa solução e após encontrá-la, POSTEI!!


logo_preciseipostei

É isso ai , mais uma do PreciseiPostei . Espero ter ajudado!!


Configuração do sistema utilizado:

Sistema: Linux

Distribuição: Ubuntu 18 LTS (LIVE-CD)

Pacotes: iproute, net-tools e bridge-utils

REFERÊNCIAS:

Livro Network Warrior- Gary A. Donahue “O’Reilly Media, Inc.

https://wiki.linuxfoundation.org/networking/netem

Steal This Computer Book 4.0

https://linux.die.net/man/8/tc

https://linux.die.net/man/8/brctl

Ajude a outros..Compartilhe!!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *