Контроль пропускной способности в Ubuntu с помощью Traffic Control

htb — корневой способ фильтрации с идентификатором 1. Не классифицированный траффик отнести к классу 1:15 (удалить — delete вместо add):

tc qdisc add dev enp17s10 root handle 1: htb default 15

создать родительский класс (для расширения канала, когда остальные не заняты):

tc class add dev enp17s10 parent 1: classid 1:1 htb rate 100MBit ceil 100MBit

создать подкласс подсети 30MBit (ceil — расширение канала):

tc class add dev enp17s10 parent 1:1 classid 1:11 htb rate 30MBit ceil 100MBit

создать подкласс подсети 20MBit (без расширения):

tc class add dev enp17s10 parent 1:1 classid 1:12 htb rate 20MBit

40MBit для всех остальных:

tc class add dev enp17s10 parent 1:1 classid 1:15 htb rate 40MBit

Подключить способ фильтрации «sfq» вместо «FIFO», для равномерного распределения:

tc qdisc add dev enp17s10 parent 1:11 handle 10:0 sfq perturb 10
tc qdisc add dev enp17s10 parent 1:12 handle 20:0 sfq perturb 10
tc qdisc add dev enp17s10 parent 1:15 handle 30:0 sfq perturb 10

Фильтры, по подсетям (для «всех остальных» уже всё задано):

# tc filter add dev enp17s10 protocol ip parent 1:0 prio 1 u32 match ip src 172.16.1.0/24 flowid 1:11
# tc filter add dev enp17s10 protocol ip parent 1:0 prio 1 u32 match ip src 172.16.2.0/24 flowid 1:12

Всем 4, когда не занято, а кое-кому 100 (рабочий вариант):

# tc qdisc add dev $DEV enp17s10 root handle 1: cbq avpkt 1000 bandwidth 100MBit
# tc class add dev $DEV enp17s10 parent 1: classid 1:1 cbq rate 4MBit allot 1500 prio 5 bounded isolated
# tc filter add dev $DEV enp17s10 parent 1: protocol ip prio 16 u32 match ip dst 192.168.3.0/24 flowid 1:1
# tc filter add dev $DEV enp17s10 parent 1: protocol ip prio 15 u32 match ip dst 192.168.3.104 flowid 1:0

При ограничении трафика на внутреннем интерфейсе, он скапливается на внешнем, по этому нужно использовать псевдо устройство IFB (ingress) на внешнем и классифицировать от него.