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 web gui. Cada usuário está executando um cliente sob seu nome de usuário no servidor para que os downloads entrem em seu diretório de 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 em uma base por usuário?

Eu estava pensando que deve haver uma maneira de usar iptables talvez. E monitorando a largura de banda usada por todos os processos do usuário X. E se eles tiverem usado mais do que sua largura de banda mensal permitida de Y GB, receberão uma mensagem dizendo que a rede é bloqueada para seu cliente de torrent ou o cliente é morto completamente. Eu também pensei sobre o squid, mas vendo como ele estaria usando múltiplos clientes de torrent isso poderia usar muitos recursos do servidor ...

Estou usando o debian lenny.

Não sei como fazer isso ...

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

    
por loco41211 09.08.2009 / 22:56

7 respostas

13

Você pode usar o comando 'tc' traffic shaping.

Dê a cada um de seus amigos uma porta diferente para usar no BitTorrent. Marque os pacotes TCP com o 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 por:

tc filter show dev ethX

Se você está usando o Debian Install Shorewall, ele facilita muito a modelagem do tráfego sem mexer no iptables. Você acabou de editar os dispositivos, tcclasses e tcrules no diretório / etc / shorewall. Mais informações aqui: link

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

    
por 09.08.2009 / 23:30
13

Você pode tentar usar a opção --quota no 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 combiná-los com a opção --uid-owner , como sugerido por katriel.

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

Para tornar os contadores de pacotes persistentes, é preciso salvá-los periodicamente (por exemplo, por meio de um cron job), para que você possa restaurá-los caso precise reinicializar o servidor ou liberar as regras do firewall .

    
por 10.08.2009 / 14:21
12

Só para adicionar a pergunta acima.

Você pode usar o iptables com correspondência de usuário para colorir os pacotes da seguinte forma:

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.

    
por 09.08.2009 / 23:39
8

Dependendo de quanto tráfego mensal você deseja permitir para cada usuário por mês, você pode definir um limite de largura de banda de acordo, 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, em seguida, por 3600, você obterá a taxa máxima de download, que neste exemplo seria 100 KB / s .

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

Para limitar a taxa de download, você pode usar tc ou algumas das outras ferramentas mencionadas. Se você não quer lidar diretamente com tc , você pode usar o cbq.init , que é bem simples de configurar . Este script estava presente no Debian Etch como o pacote shaper , mas parece ter sido removido depois disso. De qualquer forma, é 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 imponham seu limite mensal, minha sugestão não funcionaria).

    
por 10.08.2009 / 03:21
7

Eu sei que este é um post antigo, mas até eu me deparei com ele procurando por respostas hoje e finalmente reuni algo que funciona perfeitamente para mim. Eu tenho um downlink de 25Mbs e um uplink de 2,5Mbs e há 4 pessoas e 5 servidores compartilhando este link. com servidores uplink bandwith é crítico, mas o downlink é útil para 4 pessoas, então ninguém acredita em tudo.

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

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

depois, para limitar os usuários, você usa 2 linhas iptables por usuário

para limitar os envios:

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

para limitar os downloads

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

apenas altere o endereço IP e as portas eth para corresponder a quem você deseja limitar

    
por 16.01.2013 / 10:09
3

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

    
por 09.08.2009 / 23:46
2

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

Dado que os criadores useripacct tiveram que recorrer a um patch de 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) como sugerido pela maioria das outras respostas aqui (mas não exatamente 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 contábil por VM (que é bastante fácil de ser avaliado por algo como vnstat ). Isso parece um exagero (de repente você tem um monte de VMs para administrar ao invés de um sistema).

    
por 10.08.2009 / 00:18