Simule pacotes atrasados ​​e descartados no Linux

Respostas:

323

O netem aproveita a funcionalidade já incorporada no Linux e nos utilitários de espaço do usuário para simular redes. É a isso que a resposta de Marcos se refere, por um nome diferente.

Os exemplos na página inicial já mostram como você pode conseguir o que pediu:

Exemplos

Emulação de atrasos na rede de área ampla

Este é o exemplo mais simples, apenas adiciona uma quantidade fixa de atraso a todos os pacotes que saem da Ethernet local.

# tc qdisc add dev eth0 root netem delay 100ms

Agora, um simples teste de ping para hospedar na rede local deve mostrar um aumento de 100 milissegundos. O atraso é limitado pela resolução do relógio do kernel (Hz). Na maioria dos sistemas 2.4, o relógio do sistema é executado em 100 Hz, o que permite atrasos em incrementos de 10 ms. Em 2.6, o valor é um parâmetro de configuração de 1000 a 100 Hz.

Exemplos posteriores apenas alteram os parâmetros sem recarregar o qdisc

Redes reais de área ampla mostram variabilidade, portanto é possível adicionar variação aleatória.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

Isso faz com que o atraso adicionado seja de 100 ± 10 ms. A variação do atraso da rede não é puramente aleatória, de modo a emular que também existe um valor de correlação.

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

Isso faz com que o atraso adicionado seja de 100 ± 10 ms, com o próximo elemento aleatório dependendo de 25% no último. Isso não é uma correlação estatística verdadeira, mas uma aproximação.

Atraso na distribuição

Normalmente, o atraso em uma rede não é uniforme. É mais comum usar algo como uma distribuição normal para descrever a variação no atraso. A disciplina netem pode usar uma tabela para especificar uma distribuição não uniforme.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

As tabelas reais (normal, pareto, paretonormal) são geradas como parte da compilação iproute2 e colocadas em / usr / lib / tc; portanto, é possível com algum esforço fazer sua própria distribuição com base em dados experimentais.

Perda de pacotes

A perda aleatória de pacotes é especificada no comando 'tc' em porcentagem. O menor valor diferente de zero possível é:

2 −32 = 0.0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

Isso faz com que 1/10 de um por cento (ou seja, 1 em 1000) pacotes sejam descartados aleatoriamente.

Uma correlação opcional também pode ser adicionada. Isso faz com que o gerador de números aleatórios seja menos aleatório e pode ser usado para emular perdas de burst de pacotes.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

Isso fará com que 0,3% dos pacotes sejam perdidos e cada probabilidade sucessiva depende de um quarto da última.

Problema n = 0,25 × Problema n-1 + 0,75 × Aleatório

Observe que você deve usar tc qdisc addse você não possui regras para essa interface ou tc qdisc changese já possui regras para essa interface. Tentar usar tc qdisc changeem uma interface sem regras dará o erro RTNETLINK answers: No such file or directory.

efémero
fonte
2
O site original tem esse erro, eu apenas copiei esse texto diretamente. Mas sim, 2 ^ (- 32) = 2.33e-10
ephemient
34
Note que tc -p qdisc ls dev eth0irá listar regras definidas atuais, e tc qdisc del dev eth0 rootirá excluí-los
Quamis
1
upvoted por apontar erro ao tentar alterar uma entrada inexistente
Neo
Você sabe por que eu recebo esses erros? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / RESULTADOS $ sudo tc qdisc adiciona dev eth0 root netem delay 100ms RTNETLINK responde: Arquivo existe ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / RESULTADOS $ sudo tc qdisc change dev eth0 root netem delay 100ms RTNETLINK respostas: Argumento inválido serverfault.com/questions/743885/…
Mona Jalal
Provavelmente seria uma boa idéia para incluir detalhes como limitar as interfaces inteiras rendimento para simular ligações de baixa velocidade
Pavel P
91

Para pacotes descartados, eu simplesmente usaria o iptables e o módulo estatístico .

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

Acima, o pacote será recebido com uma probabilidade de 1%. Tenha cuidado, qualquer coisa acima de 0,14 e a maioria das conexões TCP provavelmente travará completamente.

Dê uma olhada no man iptables e procure por "estatística" para obter mais informações.

Bjarke Freund-Hansen
fonte
6
Por que as conexões TCP ficam paralisadas acima de 14%?
David Wolever
2
@ DavidWolever: Devido à maneira como o tamanho das janelas deslizantes tcp é ajustado. Mas os 14% são puramente da experiência, experimente você mesmo e verá que o ssh se torna inutilizável em 14% ou mais, mas na verdade funciona muito bem em níveis mais baixos de taxas de queda de pacotes.
Bjarke Freund-Hansen
12
Por questões de segurança, provavelmente é melhor limitar a regra a ser aplicada apenas às portas que você deseja testar: iptables -A INPUT --dport FOO -m statistics .... Dessa forma, seu ssh e outras conexões serão permaneça inalterado e você pode aumentar a taxa de drop para o serviço de interesse para poder reproduzir quaisquer problemas com ele mais rapidamente.
21813 Mikhail T.
5
Observe que, DROPnas conexões de saída, o ridículo faz com que as send()operações retornem EPERM, em vez de apenas soltar pacotes (como deveria).
Fake Name
2
É tudo o que é necessário para desfazer esse comando? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314
6

Um dos meus colegas usa o tc para fazer isso. Consulte a página do manual para obter mais informações. Você pode ver um exemplo de seu uso aqui .

Marca
fonte
Eu acho que é mais fácil de usar iptables :)
c4f4t0r
certeza, mas tc é muito mais rápido do que iptables
teknoraver
5

O iptables (8) possui um módulo de correspondência estatística que pode ser usado para corresponder a cada enésimo pacote. Para descartar este pacote, basta acrescentar -j DROP .

hillu
fonte
1

Ainda não tentei, mas esta página possui uma lista de módulos de plug-in que são executados no sistema de filtragem de iptables embutido no Linux. Um dos módulos é chamado "enésimo" e permite que você configure uma regra que reduzirá uma taxa configurável dos pacotes. Pode ser um bom lugar para começar, pelo menos.

descontrair
fonte
1

Uma ferramenta de injeção de falhas de rede fácil de usar é o Saboteur . Pode simular:

  • Partição total de rede
  • Serviço remoto inoperante (não escutando na porta esperada)
  • Atrasos
  • Perda de pacote - Tempo limite da conexão TCP (normalmente acontece quando dois sistemas são separados por um firewall com estado)
Alex Giotis
fonte
1
Infelizmente, o último comprometimento com esse projeto foi em 28 de agosto de 2015, ou seja, quase 4 anos atrás. As questões abertas agora têm 5 anos.
Ali
1

Uma das ferramentas mais utilizadas na comunidade científica para esse fim é o DummyNet . Depois de instalar o ipfwmódulo do kernel, para introduzir um atraso de propagação de 50ms entre duas máquinas, execute estes comandos:

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

Para introduzir também 50% das perdas de pacotes, você deve executar:

./ipfw pipe 1 config plr 0.5

Aqui mais detalhes.

gaetano
fonte