Estou tentando limitar a largura de banda de saída gerada por um aplicativo com o linux tc. Este aplicativo me envia a porta de origem da solicitação que eu uso tem um filtro para limitar cada usuário em uma determinada velocidade de download. Eu sinto que minha configuração poderia ser melhor gerenciada se eu tivesse um conhecimento melhor do linux tc.
No nível do aplicativo, os usuários são categorizados como membros de um grupo, cada grupo tem uma largura de banda limitada.
Exemplo:
Members of group A : 512kbit/s
Members of group B : 1Mbit/s
Members of group C : 2Mbit/s
Quando um usuário se conecta ao aplicativo, ele recupera a porta de origem para a origem da solicitação do usuário e me envia a porta de origem e a largura de banda na qual o usuário deve ser limitado, dependendo do grupo ao qual pertence. Com essas informações, devo adicionar as regras apropriadas para que o usuário (a porta de origem, na realidade) esteja limitado à largura de banda correta.
Se o usuário que se conectar não for membro de nenhum grupo, ele deverá ser limitado a uma velocidade de largura de banda padrão.
Na verdade, estou gerenciando isso usando um daemon criado automaticamente que adiciona ou remove regras de quando recebe uma solicitação do aplicativo. Com meu pequeno conhecimento de tc, não consigo limitar outros usuários (aqueles que não estão em um grupo, todos os outros de fato) com uma velocidade padrão e minha configuração me parece péssima.
Aqui está a base do meu qdisc e classes tc:
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbps ceil 125mbps
Para classificar um usuário em uma determinada velocidade, tenho que adicionar uma subclasse e associar um filtro a ela:
# a member of group A
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 512kbps ceil 512kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 50001 flowid 1:11
# a member of group A again
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 512kbps ceil 512kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 61524 flowid 1:12
# a member of group B again
tc class add dev eth0 parent 1:1 classid 1:13 htb rate 1000kbps ceil 1000kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 57200 flowid 1:13
Eu já sei que uma porta de origem pode ser a mesma se ela vier de um endereço IP diferente. A coisa é que o aplicativo está atrás de um proxy, então não preciso gerenciar nenhum endereço IP nessa situação.
Eu gostaria de saber como gerenciar o fato de que, para todos os outros usuários (solicitação / porta de origem, o nome que você escolher) pode ser limitado a uma determinada velocidade cada. Quero dizer que cada conexão deve ser capaz de usar no máximo 100kbit / s, por exemplo, não 100kbit / s compartilhada.
Eu também gostaria de saber se existe uma maneira de simplificar minhas regras. Não sei se é possível usar apenas uma classe por grupo e associar vários filtros à mesma classe para que cada usuário possa ser manipulado por uma classe e não por uma classe por usuário.
Agradeço qualquer conselho, obrigado.
Tags bandwidth linux traffic-shaping tc