A modelagem de rede usando 'tc netem' não parece funcionar

2

Estou tentando simplesmente atrasar o tráfego direcionado para determinado endereço IP na caixa do Ubuntu 16.06 sem sorte. Existem muitos recursos como este isto isso ou isso que eu estudei. Acabei com esses dois conjuntos de comandos, nenhum desses trabalhos:

tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 100ms
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.19.0.2/32 flowid 1:1

- ou -

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
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 100ms
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.19.0.2/32 flowid 1:1

Depois de executá-los, todo o tráfego é bloqueado - ou seja, nada é exibido, host inacessível:

$ ping pingserver2
PING pingserver2 (172.19.0.4) 56(84) bytes of data.
From 14d25a894559 (172.19.0.3) icmp_seq=1 Destination Host Unreachable
From 14d25a894559 (172.19.0.3) icmp_seq=2 Destination Host Unreachable

$ ping pingserver
PING pingserver (172.19.0.2) 56(84) bytes of data.
From 14d25a894559 (172.19.0.3) icmp_seq=1 Destination Host Unreachable
From 14d25a894559 (172.19.0.3) icmp_seq=2 Destination Host Unreachable

Ele faz isso mesmo depois que eu executo apenas a primeira linha.

Alguém tem uma idéia do que há de errado com a abordagem que estou tomando?

    
por peetonn 06.04.2018 / 22:42

1 resposta

1

Eu finalmente percebi isso. Depois de estudar cuidadosamente o presente e este capítulo eu tenho uma compreensão muito melhor de como ele deve funcionar e como tc processa pacotes.

Então, basicamente, o que eu preciso fazer é construir esse tipo de árvore:

          1:   root qdisc
         / | \ 
       /   |   \
       /   |   \
     1:1  1:2  1:3    classes
      |    |    |
     10:  20:  30:    qdiscs    qdiscs
    netem sfq  ---
band  0    1    2

O que significa que, além de adicionar netem qdisc, eu precisava adicionar sfq à segunda banda e adicionar um filtro para o caso "catch-all". Aqui estão todos os comandos que estou usando:

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 172.19.0.2 match ip dport 6363 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

Aqui estão explicações para cada linha acima:

  1. Adicione prio disciplina de enfileiramento à raiz com o identificador (id) 1:0 (0 não é obrigatório) na interface eth0 . prio qdisc tem três classes por padrão - 1: 1 1: 2 e 1: 3. Essas classes receberão filtros nas próximas três linhas (a ordem é importante!). É importante entender como os pacotes de saída são processados - eles entram na árvore da raiz e a saem da raiz também (não caindo das folhas!).

  2. Adicione um filtro para o tráfego que queremos desacelerar (é o tráfego que vai para 172.19.0.2 na porta 6363 no meu caso). Filtro anexado ao nó raiz ( parent 1: ) - significa que todos os pacotes de saída serão verificados por este filtro. Filtrar verificações de ip e porta ( ip dst ... ip dport ... ) e redireciona para a classe 1:1 ( flowid 1:1 ).

  3. De maneira semelhante ao acima, é assim que o filtro "catch-all" é definido (graças a essa postagem ), redireciona para a classe 1:2 .

  4. Da mesma forma, este filtro é um "pega-tudo" para pacotes ICMP (pacotes ping), também redireciona para 1:2 .

  5. Anexe o qdisc à classe 1:1 , atribua a ele% de10:0 e deixe-o netem qdisc com atraso de 10 ms.

  6. Anexe o sfq qdisc à classe 1:2 - este qdisc lidará com todos os outros pacotes que corresponderem ao filtro "pega-tudo" em um estilo "justiça estocástica".

É altamente recomendável ler esses capítulos aos quais dei links, pois eles esclarecem muitas coisas e permitem que você pare de procurar por uma solução desesperadamente e comece a projetar a modelagem de rede por conta própria.

Além disso, achei esses comandos extremamente úteis para depuração / análise:

tc -s qdisc ls dev eth0
tc -s filter ls dev eth0
    
por 07.04.2018 / 05:35