iptables: cota de download por endereço mac para todos os hosts

2

Em um roteador Linux, como configurar cotas de download para todos os hosts?

Isto é para uma rede wifi compartilhada com muitos convidados:

  • Cada convidado deve começar com uma cota de download de 150 Mb e sem restrição
  • Quando a cota é atingida, a velocidade de download deve ser limitada a 50 k / s
  • A filtragem deve basear-se no endereço mac, os endereços IP podem mudar com o dhcp.

Gárgula roteador implementa algo assim, infelizmente usar gárgula não é uma opção aqui, eu preciso fazer isso com tc e iptables .

Esta resposta é um bom ponto de partida:

iptables -A INPUT -p tcp -s 192.168.0.2 -m quota --quota 13958643712 -j ACCEPT
iptables -A INPUT -p tcp -j CLASSIFY --set-class 1:12

Tornar o uso de endereços mac em vez de IP é fácil, mas requer que os endereços sejam conhecidos com antecedência, o que não é o caso aqui.

    
por lemonsqueeze 27.06.2017 / 12:10

1 resposta

2

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.

    
por 06.07.2017 / 11:49