como posso limitar a largura de banda por usuário?

32

Para resumir: Eu tenho um servidor dedicado com alguns amigos executando um cliente de torrent com GUI da web. Cada usuário está executando um cliente com o nome de usuário no servidor, para que os downloads ocorram no diretório do usuário e somente eles tenham acesso aos seus próprios arquivos etc.

Como posso monitorar e limitar a largura de banda por mês, por usuário?

Eu estava pensando que deve haver uma maneira de usar o iptables, talvez. E monitorando a largura de banda usada por todos os processos do usuário X. E se eles usaram mais do que a largura de banda mensal permitida de Y GB, eles recebem uma mensagem dizendo que a rede é bloqueada para o cliente de torrent ou o cliente é morto completamente. Também pensei no squid, mas, como seria usar vários clientes de torrent, isso poderia usar muitos recursos do servidor ...

Estou usando o debian lenny.

Não sei bem como fazer isso ...

isso seria possível? Sou grato por soluções apenas parciais para isso ...

loco41211
fonte
Poderíamos saber com o SO que você está usando.
9339 Sam Cogan
debian. Adicionado em uma edição.
Loco41211 09/08/2009
apenas curioso, você está usando TorrentFlux?
cop1152
é uma das coisas que estou tentando. No momento, estamos olhando para qualquer coisa que possa ser usada para um seedbox com limite de espaço em disco (para o qual temos uma solução) e largura de banda em que estamos presos .... e alguns de meus amigos usam cerca de 1 TB por mês enquanto outros apenas alguns Mbs. Gostaria realmente de limitar isso por usuário igualmente.
Loco41211 09/08/2009

Respostas:

13

Você pode usar o comando de modelagem de tráfego 'tc'.

Dê a cada um de seus amigos uma porta diferente para usar no BitTorrent. Marque os pacotes TCP com iptables para cada porta.

iptables -t mangle -A FORWARD -p tcp --sport 6881 -j MARK --set-mark 100
iptables -t mangle -A FORWARD -p tcp --dport 6881 -j MARK --set-mark 100

Em seguida, use o comando tc para definir a largura de banda e a taxa máximas para cada usuário.

No final do mês, você pode excluir e adicionar os comandos 'tc' para redefinir as contagens.

Você pode monitorar o uso de cada usuário:

tc filter show dev ethX

Se você estiver usando o Debian install shorewall, será realmente fácil modelar o tráfego sem mexer com o iptables. Você apenas edita tcdevices, tcclasses e tcrules no diretório / etc / shorewall. Mais informações aqui: http://www.shorewall.net/traffic_shaping.htm

Como a outra pessoa sugeriu, marcar pacotes por nome de usuário provavelmente é melhor do que por porta, dessa forma as portas podem ser alteradas sem atualizar o iptables.

chris.moos
fonte
você poderia dar um exemplo sobre como definir um limite? Diga 100GB de entrada e saída juntos?
Loco41211 09/08/2009
O torrent pode (e realmente é) usar outras portas, portanto, o exemplo é que realmente não resolve o problema.
cstamas
que remove essas duas opções como uma solução ...
loco41211
cstamas: você pode definir uma porta ou várias portas ao usar um cliente bittorrent. veja isto: dessent.net/btfaq/#ports
chris.moos
13

Você pode tentar usar a --quotaopção em iptables, que permite definir um limite de transferência em bytes. Como você está executando vários clientes de torrent, cada um com um nome de usuário diferente, você pode combinar isso com a --uid-owneropção, como sugerido por katriel.

Dessa forma, você pode impor um limite de transferência por período (dia / semana / mês / etc) sem precisar limitar a velocidade de download dos usuários.

Para tornar os contadores de pacotes persistentes, é necessário salvá-los periodicamente (por exemplo, através de um trabalho cron), para que você possa restaurá-los caso precise reiniciar o servidor ou liberar as regras de firewall.

alemartini
fonte
isso parece que iria funcionar. Portanto, com a ajuda do iptables, posso marcar todo o tráfego que entra e sai para um usuário definido. E posso limitá-lo por um período definido. Ainda não consigo descobrir como será o conjunto. Então, é o comando exato que eu poderia usar para marcar o tráfego de entrada e saída: "iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner someuser -j MARK --set-mark 100"? Ou como eu faria isso? Qual, por exemplo, o comando seria marcar o nome de usuário bob com o ID 56 com um limite mensal de 100 GB? Eu acho que um trabalho mensal cron iria redefinir o contador de tráfego?
Loco41211 10/08/09
12

Apenas para adicionar a pergunta acima.

Você pode usar o iptables com o usuário correspondente para colorir os pacotes da seguinte maneira:

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner someuser -j MARK --set-mark 100

E, em seguida, use 'tc' para limitar por usuário.

katriel
fonte
Você poderia dar um exemplo de como usar o tc para definir um limite de, digamos, 100 GB para o nome de usuário blablaX? E um exemplo do código que deve ser usado para redefinir o limite após um mês? Obrigado
loco41211
Isto irá limitar o usuário de forma permanente, e não em uma cota cronometrado
Katriel
8

Dependendo da quantidade de tráfego mensal que você deseja permitir para cada usuário por mês, você pode definir um limite de largura de banda adequadamente, usando algumas das ferramentas sugeridas pelos outros usuários.

Por exemplo, digamos que você queira definir um limite máximo de download de 250 GB / mês . Agora, se você dividir isso pelo número de horas em um mês (~ 730) e depois por 3600, obterá a taxa máxima de download, que neste exemplo seria de 100 KB / s .

Então, se você definir uma taxa máxima de DL de 100 KB / s, imporá automaticamente seu limite de download de 250 GB / mês (supondo, é claro, que seu modelador de tráfego esteja funcionando corretamente). Se seus usuários não puderem baixar mais de 100 KB / s, eles não poderão baixar mais de 250 GB / mês.

Para limitar a taxa de download, você pode usar tcou algumas das outras ferramentas mencionadas. Se você não quiser lidar diretamente tc, pode usar o cbq.init , que é bastante simples de configurar. Este script estava presente no Debian Etch como o shaperpacote, mas parece ter sido removido depois disso. Enfim, é apenas um script simples que você pode baixar do SourceForge.

É claro que essa abordagem pode não ser útil no seu caso (por exemplo, se você quiser que seus usuários possam fazer o download na velocidade máxima disponível, mas ainda imponha seu limite mensal, minha sugestão não funcionará).

mfriedman
fonte
A principal razão que nós usamos um seedbox ao invés de apenas torrentes em nossos computadores porque é muito mais rápido, por isso, infelizmente, isto não resolve o problema ... Obrigado de qualquer forma
loco41211
7

Eu sei que este é um post antigo, mas até eu o encontrei hoje procurando respostas e, eventualmente, reuni algo que funciona perfeitamente para mim. Eu tenho um downlink de 25 Mb e um uplink de 2.5 Mb e existem 4 pessoas e 5 servidores compartilhando esse link. com servidores, a largura de banda do uplink é crítica, mas o downlink é útil para 4 pessoas, portanto, ninguém monopoliza tudo.

Estou executando o centos 6.3 como roteador, mas esses comandos devem funcionar em qualquer linux. eth0 é o meu uplink para o provedor eth1 é a minha LAN via switch de 24 portas e ponto de acesso wifi. Limito os downloads a 5 dos 25 Mbs (aproximadamente 500 KB / s). Limito os uploads a 200 Kbits (aproximadamente 25 KB / s)

tc qdisc add dev eth0 root handle 1:0 htb default 99
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 200Kbit ceil 200Kbit prio 2
tc qdisc add dev eth0 parent 1:11 handle 10: sfq perturb 10

tc qdisc add dev eth1 root handle 2:0 htb default 99
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 100Mbit ceil 100Mbit
tc class add dev eth1 parent 2:1 classid 2:11 htb rate 5Mbit ceil 5Mbit prio 2
tc qdisc add dev eth1 parent 2:11 handle 20: sfq perturb 10

para limitar os usuários, você usa 2 linhas de tabelas de ip por usuário

para limitar envios:

iptables -t mangle -A POSTROUTING -o eth0 -p tcp -s 192.168.0.100 -j CLASSIFY --set-class 1:11

limitar downloads

iptables -t mangle -A POSTROUTING -o eth1 -p tcp -d 192.168.0.100 -j CLASSIFY --set-class 2:11

basta alterar seu endereço IP e portas eth para corresponder a quem você deseja limitar

BrierMay
fonte
3

Para completar, existe um daemon de espaço de usuário chamado trickle. Pode ser usado para limitar a largura de banda de um único processo. O uso é muito simples: fe, para limitar a largura de banda usada pelo aptitude, você pode escrever: trickle -d 10 aptitude install wesnothNo entanto, como funciona com LD_PRELOAD, pode ser facilmente substituído por um usuário com acesso ao shell.

liori
fonte
Nenhum dos usuários além de mim tem acesso ao shell. Além disso, com a largura de banda limitada, quero dizer por mês ou por um período definido. Isso seria possível?
Loco41211 09/08/2009
1
Não, o gotejamento limita a velocidade como em um segundo.
Liori 9/08/09
2

Dê uma olhada no patch do kernel useripacct (isso realmente tem um longo histórico ). Nos documentos da versão antiga, ele parece também fornecer imposição de cotas, além de monitoramento, e também é possível fornecer seus próprios scripts de política.

Dado que os criadores de useripacct tiveram que recorrer a um patch do kernel para obter o comportamento desejado, parece improvável que exista um método mais simples disponível por padrão. As únicas alternativas parecem limitar a largura de banda (por algo como tc ou trickle), conforme sugerido pela maioria das outras respostas aqui (mas não realmente o que você está procurando), ou criar uma VM para cada usuário (usando virtualização leve do SO por algo como OpenVZ ) e tráfego de contabilidade por VM (o que é razoavelmente fácil avaliado por algo como vnstat ). Isso parece um exagero (de repente você tem várias VMs para administrar, em vez de um sistema).

timday
fonte
é um pouco exagerado, pois drenaria os recursos do servidor ... mas obrigado pela ideia!
loco41211