Você precisa escolher uma classe ciente de qdisc como HFSC ou HTB.
Então você terá que construir uma árvore de classes como esta:
Root Class (10MBit)
|
\--- XyZ Class (rate 3Mbit ceil 3Mbit)
| |
| \--- Client 10 (rate 1.5Mbit ceil 3Mbit)
| \--- Client 11 (rate 1.5Mbit ceil 3Mbit)
|
\--- Client 30 (rate 3.5Mbit ceil 10Mbit)
\--- Client 40 (rate 3.5Mbit ceil 10Mbit)
E isso em ambas as interfaces (para upload e formatação de download).
Com o HTB para obter resultados previsíveis, você deve certificar-se de que a soma dos filhos seja sempre igual à dos pais. Então o Root tem 10Mbit, e seus filhos diretos são iguais (Xyz 3Mbit + Client30 3.5Mbit + Client40 + 3.5Mbit == 10Mbit). Da mesma forma, o XyZ tem 3Mbit e seus filhos Client10 + Client11.
Anos e anos atrás eu escrevi um script que fazia algo semelhante:
Não é mantido hoje, mas talvez possa lhe dar algumas ideias de qualquer maneira.
A modelagem de tráfego no Linux era um pouco um campo negligenciado / esotérico, difícil encontrar uma boa documentação também. Não tenho certeza se isso já mudou ...
Existe link (ignore a parte do Wondershaper)
e o link (também o FAQ)
do Kernel Packet Traveling DiagramOu se tudo for complicado, talvez um qdisc sem estado como o ESFQ faça o truque para você. Ele tenta alcançar algum tipo de equilíbrio entre os clientes sem realmente aplicar nenhum limite de largura de banda.
Boa sorte.