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
priodisciplina de enfileiramento à raiz com o identificador (id)1:0(0 não é obrigatório) na interfaceeth0.prioqdisc 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.2na porta6363no 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:0e deixe-onetemqdisc com atraso de 10 ms. -
Anexe o
sfqqdisc à 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