Como limitar a velocidade de cada dispositivo por endereço MAC no gateway via comando “tc” do Linux?

1

Eu tenho um gateway cujo sistema operacional é o Linux.Assim, minha largura de banda de downlink é de 100 Mbps. Eu quero limitar a velocidade máxima de download para 1Mbps para cada dispositivo que usa este gateway.Em outras palavras, se houver 100 dispositivos, cada dispositivo pode obter 1 Mbps de largura de banda em teoria.Eu tentei fazer traffic shaping via comando Linux "tc". Abaixo estão meus comandos.O nome da minha interface é "eth0" .Mas o problema é que esses comandos só podem limitar a velocidade para um dispositivo específico (aqui, seu endereço MAC é M0M1M2M3M4M5) .O comando que eu quero é limitar a velocidade para cada dispositivo. Os comandos devem ser gerais porque eu não sei o endereço MAC do dispositivo que enviará os pacotes para o gateway. Existe algum comando / forma simples para fazer isso? Precisamos adicionar regras de TC dinamicamente? Agradecemos antecipadamente.

tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 1mbit
#dst MAC=M0M1M2M3M4M5
tc filter add dev eth0 parent 1: protocol ip prio 5 u32 match u32 0xM2M3M4M5 0xffffffff at -12 match u16 0xM0M1 0xffff at -14 flowid 1:1
    
por Shuangfeng He 21.02.2017 / 09:21

2 respostas

1

Aqui está um exemplo baseado em ligação :

#!/bin/bash
tc=/sbin/tc

#Cleaning up
$tc qdisc del dev eth0 root handle 1: > /dev/null 2>&1

#Add the root handle, setting the default leaf
$tc qdisc add dev eth0 root handle 1: htb default 5

#Set the basic speed of the device
$tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit

# add a leaf for every IP in the 10.0.1.0/24 class, with mimimum guaranteed bandwidth of 1mbit and max available bandwidth of 1mbit, as per OP request
for i in $(seq 2 255); do 
   $tc class add dev eth0 parent 1:1 classid 1:$i htb rate 1mbit ceil 1mbit
   #Add SFQ queueing disciplines
   $tc qdisc add dev eth0 parent 1:$i handle $i: sfq perturb 10

   #prioritize traffic
   $tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.0.1.$i flowid 1:$i
done

Se você quer deixar cada IP usar mais de 1Mbps, desde que haja pelo menos 1 Mbps de largura de banda garantida para cada IP tráfego gerando atualmente, você deve alterar ceil 1mbit para ceil 100mbit .

Se o seu objetivo é não deixar que os clientes ir mais rápido do que 1Mbps em qualquer condição, utilize o script como é.

    
por 07.04.2018 / 16:18
0

Use este exemplo:

 tc qdisc del dev eth1 root 
 tc qdisc add dev eth1 root handle 1: htb default 10
 tc class add dev eth1 parent 1: classid 1:10 htb rate 1mbit ceil 1mbit
 tc class add dev eth1 parent 1: classid 1:11 htb rate 1mbit ceil 1mbit
 tc class add dev eth1 parent 1: classid 1:12 htb rate 1mbit ceil 1mbit

Adicione mais se necessário

 tc filter add dev eth1 parent 1: protocol ip prio 5 u32 match u16 0x0800 0xFFFF at -2 match u32 0x23AD5518 0xFFFFFFFF at -12 match u16 0x0800 0xFFFF at -14 flowid 1:11
 tc filter add dev eth1 parent 1: protocol ip prio 5 u32 match u16 0x0800 0xFFFF at -2 match u32 0x23AD5520 0xFFFFFFFF at -12 match u16 0x0800 0xFFFF at -14 flowid 1:12

adicione mais mac se necessário

ou use a versão ip mais simples:

tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.10.101 flowid 1:11
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.10.102 flowid 1:12

adicione mais ip, se necessário

    
por 07.04.2018 / 04:41

Tags