como limitar a largura de banda de upload por usuário no linux?

2

Alguém pode fornecer o comando tc para limitar a largura de banda de upload por usuário no Debian Lenny?

Eu descobri que para marcar pacotes por usuário com o iptables eu posso usar o seguinte comando

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner testuser -j MARK --set-mark 500

mas não tenho ideia de como usar tc

atualização

executando os seguintes comandos, eu consegui limitar a largura de banda do upload do testuser para 10Mbit

iptables -t mangle -N HTB_OUT
iptables -t mangle -I POSTROUTING -j HTB_OUT
iptables -t mangle -A HTB_OUT -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -m owner --uid-owner testuser -j MARK --set-mark 10

tc qdisc replace dev eth0 root handle 1: htb default 30
tc class replace dev eth0 parent 1: classid 1:1 htb rate 10Mbit burst 5k
tc class replace dev eth0 parent 1:1 classid 1:10 htb rate 10Mbit ceil 10Mbit
tc qdisc replace dev eth0 parent 1:10 handle 10: sfq perturb 10
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10

agora o problema é que eu não quero limitar a largura de banda FTP do testador, mas ao executar os comandos acima, a velocidade do FTP também é limitada a 10Mbit.

Atenciosamente

    
por Gihan Lasita 09.12.2012 / 14:45

2 respostas

2

Alguns problemas óbvios que vejo com a configuração do htb.

Primeiro, você não tem um identificador de 1:30, e você deve, dado o default 30 . Talvez você quisesse dizer default 1 ? Isso anexaria todo o tráfego ao classid 1: 1, a menos que a regra anexasse o tráfego a uma classe diferente.

Em segundo lugar, você precisa definir sua taxa na classe de nível mais alto de 1: 1 do htb para algo razoável e menor que sua taxa de linha. Por exemplo, se sua taxa de linha é 100Mbit, a taxa deve ser talvez 90% que: 90Mbit. Algumas pessoas recomendam configurações mais conservadoras, como uma taxa de linha de 75%; Eu jogo um jogo perigoso em 90% e funciona bem para mim - reduza se você notar pacotes descartados ou alocação imprópria de largura de banda. Este último é indicativo de buffer upstream.

Em terceiro lugar, sua classe com taxa limitada deve ser configurada com um rate definido para a largura de banda garantida que você deseja alocar da classe e o ceil definido para o nível máximo que você permitirá ao usuário. Por exemplo, digamos que você queira dar ao testuser 400kbit de largura de banda garantida, mas se a linha estiver ociosa, deixe-a crescer até a taxa de linha. Defina rate 400kbit e ceil para o que você colocar como taxa para 1: 1. Se você não definir o ceil, o padrão será a taxa.

Em quarto lugar, para atingir seu objetivo de isentar o tráfego FTP, você precisará usar o connmark em vez de apenas marcar. Caso contrário, sua conexão de dados relacionada não será isentada da marca --set 10. O Connmark selecionará corretamente as conexões relacionadas.

Sugiro que as seguintes regras (não testadas!) estão no topo da minha cabeça:

# flush rules out of postrouting so you're not constantly inserting during testing.
iptables -t mangle -F POSTROUTING
iptables -t mangle -X HTB_OUT

# The use of RETURN here is to fall out of our user chain and hit 
# -j CONNMARK --save-mark in the POSTROUTING chain.
iptables -t mangle -N HTB_OUT
iptables -t mangle -A HTB_OUT -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -p tcp --dport 21 -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -m mark ! --mark 0 -j RETURN
iptables -t mangle -A HTB_OUT -m owner --uid-owner testuser -j MARK --set-mark 10
iptables -t mangle -A HTB_OUT -m mark ! --mark 0 -j RETURN

iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A POSTROUTING -j HTB_OUT
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

Então, para tc, algo como o seguinte:

# set a script variable that will represent our line-rate minus some change
CAPRATE=90Mbit
CAP_SUB_400=89Mbit

# clear our qdisc settings for eth0 so we're starting from a clean slate.
tc qdisc del dev eth0 root

tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1: classid 1:1 htb rate ${CAPRATE} burst 5k
# this is our capped class:
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 400kbit ceil ${CAPRATE}
# this is our default, catch-all class:
tc class add dev eth0 parent 1:1 classid 1:20 htb rate ${CAP_SUB_400} ceil ${CAPRATE}
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10

Pontos a serem lembrados: A soma de todos os rate s para os filhos imediatos de qualquer pai não deve exceder o pai rate ever. Eu trapaceei um pouco aqui e arredondou a taxa de 1: 20 para 89Mbit ao invés de 89600kbit. Você pode subestimar, mas nunca deve comprometer demais.

As regras do iptables são avaliadas na ordem . Se sua política permitir, as correspondências mais comuns devem aparecer primeiro; A maior parte disso é obviada pelas regras POSTROUTING antes de entrar na cadeia HTB_OUT, mas é uma boa regra prática.

Então, o que é o SFQ para ... é como mexer o pote. O SFQ tenta dar a cada conexão (par de terminais, na verdade) uma parcela justa da largura de banda, então cada segundo perturba as coisas de novo, no caso de muitas conexões terem acabado no mesmo bucket interno (o que é possível devido ao hashing feito em src / dst / portpair). Para mais informações, verifique lartc ou a mancage tc-sfq.

    
por 20.05.2014 / 00:44
0
iptables -A OUTPUT -m conntrack --connbytes from:to --connbytes-mode packets/bytes/avgpkt -m owner --uid-owner owner -J DROP

Outras possibilidades -m connlimit -m hashlimit

    
por 09.12.2012 / 23:42