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

20

Eu sou novo em usar tc e netem . Quero atrasar o envio de pacotes 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 abrangente 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 faria isso funcionar?

Matt White
fonte

Respostas:

14

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

Matt White
fonte
Obrigado por voltar e postar a resposta. Estranhamente, achei que funcionou bem nos dois sentidos, mas de qualquer maneira. Eu escrevi um script wrapper em torno desses três comandos para ajudar com os testes, só pensei em dar de volta um pouco :)
Arran Cudbard-Bell
13

A resposta escolhida está incorreta / incompleta. Eu enfrentei um problema 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 'apagará' a raiz do qdisc, mas será imediatamente substituído por um pfifo_fast (para que você não perca a conectividade).

O segundo comando:

tc qdisc add dev identificador de raiz eth0 1: prio

Substituirá o qdisc pfifo_fast pelo primeiro. Por padrão, a fila do prio possui 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 netem qdisc:

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

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

Mas existem duas advertências:

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

A seguir, resolvi meu problema para não ser afetado pelo netem enquanto o filtro não é aplicado. Em vez das etapas 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 2

Por padrão, isso enviará todo o tráfego para a banda 1: 3.

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

tc qdisc add dev eth0 pai 1: 1 identificador 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 / porta escolhido será afetado, pois redirecionamos o tráfego escolhido para a banda 0.

Todo o outro tráfego continua inalterado, pois continua a fluir para a banda 3.

Telegrafista
fonte
o que é o "ip dst 10.0.0.1/32"? Esse é o ip de destino? isso significa que existe um "ip src xxx.yyy.zz.www / aa"?
Zach Folwick #
Sim, é o IP de destino no meu exemplo. E sim, existe uma opção 'ip src'.
Telegrapher
O motivo do primeiro comando (tc qdisc del) é limpar qualquer estado anterior - como você pode ter se estiver tentando fazer isso funcionar. FWIW, a resposta aceita funcionou para mim.
Dan Pritts 02/08/19
Obrigado, esta resposta foi realmente útil.
PepeHands
1

Exemplo simples de https://wiki.linuxfoundation.org/networking/netem que permite adiar 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
NeilenMarais
fonte
Devo acrescentar uma ressalva, mais tarde pareceu que o atraso foi aplicado de maneira mais ampla do que eu esperava e não consegui chegar ao fundo disso. Nem todo o tráfego parecia atrasado.
NeilenMarais 18/01
0

Não consegui atrasar o tráfego para um IP, mantendo o tráfego normal para outros IP normal com o método descrito neste segmento.

No entanto, eu consigo fazer isso usando os seguintes comandos.

tc qdisc add dev eth0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
tc qdisc add dev eth0 parent 1:2 handle 20: netem delay 0ms
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip src `hostname -I` flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 15001ms
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.2.3.4 flowid 1:1

Atrasar o 15001mstráfego para o IP 1.2.3.4do host em que o comando é executado. O comando hostname -Ié usado para obter o IP principal do host, mas o valor pode ser substituído diretamente dentro do comando.

Eu tive que adicionar outro filtro com 0msatraso para corresponder ao tráfego vindo do host. Com certeza não é elegante, mas não consegui que algo melhor funcionasse.

O último comando pode ser substituído para corresponder a uma única porta.

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 18583 0xffff flowid 1:1

Atrasar o tráfego para a porta em 18583vez do IP 1.2.3.4.


Também encontrei um segundo método nesta resposta para atrasar o tráfego 1.2.3.4:18583sem causar impacto em outro tráfego.

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip  parent 1: prio 1 u32 match ip dst 1.2.3.4 match ip dport 18583 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
Nicolas Henneaux
fonte