Назад | Перейти на главную страницу

Как ограничить скорость для каждого устройства на MAC-адрес шлюза с помощью команды Linux «tc»?

У меня есть шлюз с ОС Linux. Предположим, у меня пропускная способность нисходящего канала 100 Мбит / с. Я хочу ограничить максимальную скорость загрузки до 1 Мбит / с для каждого устройства, которое использует этот шлюз. Другими словами, если есть 100 устройств, каждое устройство может получить пропускную способность 1 Мбит / с в теории. Я попытался сформировать трафик с помощью команды Linux «tc». Ниже приведены мои команды. Имя моего интерфейса - "eth0". Но проблема в том, что эти команды могут ограничивать скорость только для определенного устройства (здесь его MAC-адрес - M0M1M2M3M4M5). Я хочу ограничить скорость для каждого устройства. Команды должны быть общими, потому что я не знаю MAC-адрес устройства, которое будет отправлять пакеты на шлюз. Есть ли какие-нибудь простые команды / способы сделать это? Нужно ли нам динамически добавлять правила TC? Заранее спасибо.

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

Используйте этот пример:

 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

При необходимости добавьте еще

 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

при необходимости добавьте еще Mac

или используйте более простую версию ip:

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

при необходимости добавьте еще ip

Вот пример, основанный на https://amd.co.at/adminwiki/Linux_Trafficshaping:

#!/bin/bash

#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

Если вы хотите, чтобы каждый IP-адрес использовал более 1 Мбит / с при условии, что гарантированная пропускная способность не менее 1 Мбит / с для каждого IP-адреса, генерирующего в настоящее время трафик, вам следует изменить ceil 1mbit к ceil 100mbit.

Если ваша цель - ни при каких условиях не позволять клиентам работать со скоростью более 1 Мбит / с, используйте скрипт как есть.