У меня есть шлюз с ОС 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 Мбит / с, используйте скрипт как есть.