configuração simples para modelagem de tráfego

1

Eu tenho:

  • 2 caixas de linux (A, B)
  • 1 switch (S)
  • 1 gateway (G) [Eu não tenho controle sobre este]
+---------------+          
|  switch S     +-------+  
+---+--------+--+       |  
    |        |       +--+-+
    |        |       | gw |
 +--+-+   +--+-+     +----+
 | A  |   | B  |           
 +----+   +----+

Apenas para alguns testes, preciso moldar o tráfego vindo de A antes que ele atinja o gateway G. Eu informo o tráfego em A na camada mac com tcpreplay , então não posso fazer o moldando diretamente em A.

Minha ideia é:

  • direcione para B todo o tráfego de A
  • aplica a modelagem de tráfego em B (controle de tráfego do Linux ou dummynet)
  • redirecionar para o gateway G todo o tráfego de A chegando em B

A minha solução está bem? Existe um mais simples que não requer duas interfaces de rede (Ethernet) em B?

Uma interface de rede virtual em B facilitaria minha vida?

Quais são alguns comandos típicos de que preciso para implantar a configuração acima (sem formatação de tráfego excluída)?

    
por Ricky Robinson 29.07.2014 / 16:14

2 respostas

1

Algumas ideias:

  1. Você pode até moldar o tráfego de saída proveniente de A e B, mesmo no GW!
  2. Se o seu switch fosse um pouco mais inteligente ... ele não tem um linux embutido?
  3. Se você rotear através de B, tenha cuidado, algumas configurações de sinalizador de rede serão necessárias em B para manipular corretamente os redirecionamentos arp.

O principal problema da sua solução é tornar a rede A dependente de B. Sua rede ficará mais instável.

Embora sua solução torne o B linux essencialmente um roteador inteligente baseado em Linux. Se "gw" e "switch S" forem falsos, e B for inteligente, você pode até pensar em jogar fora pelo menos um deles e fazer B no seu gateway real.

    
por 29.07.2014 / 16:27
1

Você não precisa fazer nenhum truque de roteamento para isso, nem precisa de uma interface virtual.

Você simplesmente molda seu tráfego quando sai do sistema A.

Descreva exatamente o que você quer fazer e é trivial escrever uma regra 'tc' para isso.

Por exemplo, digamos que você queira limitar A a 1mbit / s em todo o tráfego de saída:

# Flush tc
tc qdisc del dev eth0 root &> /dev/null

tc qdisc add dev eth0 root handle 1: htb default 1
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit

Feito.

Execute um teste de velocidade de A e você verá que o tráfego de entrada provavelmente não é afetado, mas o tráfego de saída é limitado em 1 Mebibit por segundo.

Por que eu digo: "provavelmente não foi afetado"? Porque se você tem uma taxa de entrada muito alta, seus pacotes ACK podem exceder o limite de 1Mbit, e serem acelerados. E se o seu ACK ficar lento, o mesmo acontece com o tráfego de entrada.

Se você não conseguir usar tc ou iptables em A - como se seu tráfego fosse invisível para tc / iptables - por exemplo, tcpreplay, então você precisa fazer o controle de tráfego em B.

Para isso, há pelo menos as três maneiras a seguir para fazer isso.

  1. Compre uma placa de rede para B e coloque A / B1 na rede 1 e B2 / gateway na rede 2. Ou seja, B se torna um gateway. Agora use 'tc' para modelar o tráfego de A.

  2. Multi home eth0 em B. ie, eth0: 1 - > 172.16.5.0/24 e dê a um endereço nesta rede. Configurar B para encaminhar o tráfego entre eth0 e eth0: 1, marcar e configurar o tráfego (tc) para o gateway principal.

  3. Use 'brctl' para criar uma ponte na eth0 e crie interfaces para A / B e B / gw e marque novamente e modifique o cabeçalho de tráfego (tc) para o gateway principal.
por 29.07.2014 / 18:35