Usando tc para atrasar pacotes para apenas um único endereço IP

14

Eu sou novo em usar tc e netem . Eu quero atrasar pacotes sendo enviados para um endereço IP específico. No entanto, os comandos abaixo fazem com que todos os pacotes no sistema sejam atrasados, em vez de apenas para o endereço IP 1.2.3.4:

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1

Meu palpite é que preciso de algum tipo de filtro "pega-tudo" no final para especificar que todo o tráfego restante não deve passar pelo netem. Mas não consigo fazer nada funcionar. Como eu conseguiria que isso funcionasse?

    
por Matt White 15.05.2012 / 17:38

3 respostas

13

Ok, resolvi meu próprio problema. Acontece que se você executar as primeiras 3 linhas acima (as "tc qdisc"), isso atrasará todos os pacotes porque ainda não há filtros. A quarta linha muda para atrasar somente os pacotes daquele único endereço IP. Linhas de filtro adicionais podem ser adicionadas para adicionar endereços IP adicionais à lista "atrasada". Então, não crie uma linha "netem delay" sem um filtro apontando para ela.

    
por 22.05.2012 / 16:47
8

A resposta escolhida está incorreta / incompleta. Eu enfrentei uma questão semelhante, a resposta escolhida deu alguma ajuda, mas não o suficiente.

Primeiro, o seguinte comando não é realmente necessário.

tc qdisc del dev eth0 root

Ele irá 'deletar' o qdisc da raiz, mas será substituído imediatamente por um pfifo_fast (para que você não perca a conectividade).

O segundo comando:

tc qdisc add dev eth0 root handle 1: prio

Substituirá o qdisc pfifo_fast pelo prio. Por padrão, a fila do prio tem 3 bandas (0, 1, 2), cada uma gerenciada por uma classe (1: 1, 1: 2 e 1: 3).

Os pacotes serão enviados para uma dessas bandas usando o campo TOS do pacote IP. Esta configuração é mostrada quando você executa:

tc qdisc ls

olhando para os valores do 'priomap'.

Em seguida, você adiciona um qdisc netem:

tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms

Com este comando você atrasa todo o tráfego indo para a banda 1: 1 (até que o filtro esteja no lugar).

Mas há duas ressalvas:

  • Seu tráfego pode ter um valor de TOS diferente e ser enviado para outra banda.
  • O qdisc do prio pode ser configurado para que o tráfego vá para outra banda.

O seguinte resolveu meu problema para não ser afetado pelo netem enquanto o filtro não é aplicado. Em vez dos passos acima, eu fiz:

tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Isso enviará todo o tráfego por padrão para a banda 1: 3.

Em seguida, adicionei a regra para atrasar o tráfego:

tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 100ms 10ms

Isso cria o qdisc na banda 0, mas como todo o tráfego vai para a banda 3, isso não me afetou.

Depois, adicionei o filtro:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.0.0.1/32 match ip dport 80 0xffff flowid 1:1

Agora com o filtro, apenas o IP / port escolhido será afetado, já que redirecionamos o tráfego escolhido para a banda 0.

Todo o tráfego restante não é afetado, pois continua a fluir para a banda 3.

    
por 31.03.2017 / 21:00
0

Exemplo simples do link que permite atrasar pacotes para um determinado IP sem afetar nenhum outro tráfego, mesmo durante a configuração:

tc qdisc del dev eth0 root # Ensure you start from a clean slate
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 500ms
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
   match ip dst 192.168.1.2 flowid 1:3
    
por 24.10.2018 / 12:54