cytron
(usa Slackware)
Enviado em 13/06/2008 - 17:43h
O funcionamento é simples, cada vez que um cliente se conecta, o pppd no seu servidor executa o script ip-up caso ele exista (tem outros também, como ip-pre-up, mas não vem ao caso). É nesse script que você faz o controle. Ao desconectar, você desfaz pelo ip-down.
Esse scrpit eu mesmo fiz, baseado em artigos aqui no VOL:
=== ip-up ===
#!/bin/bash
#
# ip-up by cytron
# Script para limitar velocidade
#
ppp=$1
ip=$5
down=250 # velocidade download
up=32 # velocidade upoad
/sbin/tc qdisc add dev $ppp root handle 1: htb default 30
/sbin/tc class add dev $ppp parent 1: classid 1:1 htb rate ${down}kbit ceil ${down}kbit
/sbin/tc class add dev $ppp parent 1:1 classid 1:10 htb rate $[5*$down/100]kbit burst 5k prio 1 ceil ${down}kbit
/sbin/tc class add dev $ppp parent 1:1 classid 1:20 htb rate $[5*$down/100]kbit burst 5k prio 2 ceil ${down}kbit
/sbin/tc class add dev $ppp parent 1:1 classid 1:30 htb rate $[5*$down/100]kbit burst 5k prio 3 ceil ${down}kbit
/sbin/tc qdisc add dev $ppp parent 1:10 handle 10: sfq perturb 10
/sbin/tc qdisc add dev $ppp parent 1:20 handle 20: sfq perturb 10
/sbin/tc qdisc add dev $ppp parent 1:30 handle 30: sfq perturb 10
/sbin/tc qdisc add dev $ppp handle ffff: ingress
/sbin/tc filter add dev $ppp parent ffff: protocol ip prio 5 u32 match ip tos 0x10 0xff flowid :1
/sbin/tc filter add dev $ppp parent ffff: protocol ip prio 5 u32 match ip protocol 1 0xff flowid :1
/sbin/tc filter add dev $ppp parent ffff: protocol ip prio 5 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid :1
/sbin/tc filter add dev $ppp parent ffff: protocol ip prio 6 u32 match ip src $ip police rate ${up}kbit burst 10k drop flowid :1
==============
=== ip-down ===
#! /bin/bash
#
# ip-down by cytron
# Script para desativar limite de velocidade
#
ppp=$1
echo "Logout" $ppp `date` >> /usr/local/var/log/pppd.log
echo >> /usr/local/var/log/pppd.log
tc qdisc del dev $ppp root
tc qdisc del dev $ppp ingress
=============
Só tem um probleminha mas estou querendo trabalhar na solução, só falta tempo:
Ele apenas limita a velocidade máxima que o cliente pode chegar, mas não faz uma distribuição uniforme entre os clientes, tipo gerar uma média e estabelecer pra todos, considerando o critério da velocidade máxima.
Este script considera que você estabeleça a mesma velocidade para todos os clientes, se quiser velocidade individual tem que alterar, no meu caso uso Radius, faço controle de velocidades diferentes, por isso tive que alterar o script pra postar aqui. Se quiser o script que trabalha com radius é só me pedir... quando eu tiver tempo vou postar no VOL.