Depois de algumas pesquisas, aqui está o que eu encontrei:
Primeiro, alguma configuração:
# download quota (Mb)
dl_quota_mb=150
dl_quota=$(($dl_quota_mb * 1024 * 1024))
# max speed once overquota (k/s)
dl_cap_kb=50
dl_cap=$(($dl_cap_kb * 8))
# wifi interface
if_lan=wlan0
# lan subnet
lan=192.168.1
Crie classes tc para cada ip para limitar a velocidade de download:
TCA="tc class add dev $if_lan"
TQA="tc qdisc add dev $if_lan"
SFQ="sfq perturb 10"
$TQA root handle 1: htb
# over quota speed limits
for i in 'seq 1 254'; do
$TCA parent 1: classid 1:$i htb rate ${dl_cap}kbit ceil ${dl_cap}kbit prio 2
$TQA parent 1:$i handle $i: $SFQ
done
Crie ipset para lan ips com contabilidade:
ipset create IP_QUOTA bitmap:ip range $lan.0/24 counters
ipset add IP_QUOTA $lan.1-$lan.254
Classifique pacotes overquota ips com iptables para fazer com que os limites sejam acionados:
IPT="iptables -t mangle"
IPT_POST="iptables -t mangle -A POSTROUTING -o $if_lan"
$IPT -N overquota
$IPT_POST -m set --match-set IP_QUOTA dst --bytes-gt $dl_quota -j overquota
# classify packets
for i in 'seq 1 254'; do
$IPT -A overquota --dst $lan.$i -j CLASSIFY --set-class 1:$i
done
Isso nos dá as cotas de download por endereço IP. Para obter cotas de download por endereço mac, uma maneira é observar as alterações dos pares mac / ip e configurar / redefinir os contadores IP de acordo.
Eu configurei um projeto no github, que implementa a solução completa para o OpenWrt.
Observação: a partir de junho de 2017, as cotas de download da Gargoyle são por endereço IP. Seria bom implementar algo assim no Gargoyle eventualmente.