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:
-
Adicione
prio
disciplina de enfileiramento à raiz com o identificador (id)1:0
(0 não é obrigatório) na interfaceeth0
.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!). -
Adicione um filtro para o tráfego que queremos desacelerar (é o tráfego que vai para
172.19.0.2
na porta6363
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 classe1:1
(flowid 1:1
). -
De maneira semelhante ao acima, é assim que o filtro "catch-all" é definido (graças a essa postagem ), redireciona para a classe
1:2
. -
Da mesma forma, este filtro é um "pega-tudo" para pacotes ICMP (pacotes ping), também redireciona para
1:2
. -
Anexe o
qdisc
à classe1:1
, atribua a ele% de10:0
e deixe-onetem
qdisc com atraso de 10 ms. -
Anexe o
sfq
qdisc à classe1: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