Photo by Joshua Hoehne
Ограничение скорости локальной сети

Ограничение трафика в локальной сети

24.03.22
24.08.23

Часто возникает необходимость, особенно в офисе компании более-менее ровно распределить трафик между сотрудниками. 

Такую задачу можно решить с помощь встроенной утилиты tc (Traffic Control) 

Если у нас есть шлюз на Linux (например, Ubuntu), интерфейс eth1 которого смотрит в интернет, а eth0 — в локальную сеть. Ширина канала от провайдера — 100 Мбит.

Подключим дисциплину HTB в качестве корневой:

# tc qdisc add dev eth0 root handle 1:0 htb default 20

Опция «default 20» — неклассифицированный трафик будет обработан как класс «1:20».

Создадим корневой класс, куда будет попадать весь трафик:

# tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbps

Создадим в нем нужное нам количество подклассов. Может быть любое количество, зависит от того как вы будете разбивать весь трафик. Если всем поровну, то достаточно создать один, а если, например, руководителю (и сисадмину, конечно) немного побольше, а всем остальным — поровну, то два:

# tc class add dev eth0 parent 1:1 classid 1:11 htb rate 30mbps ceil 100mbps
# tc class add dev eth0 parent 1:1 classid 1:20 htb rate 10mbps ceil 20mbps

В этом примере мы создали два подкласса. Первый: получает 30 Мбит с возможностью занять весь канал, если больше никого нет в офисе. Второй, 10 Мбит и может занять до 20, если свободно.

Далее можно добавить дисциплину sfq, чтобы канал равномерно распределялся между всеми участниками:

# tc qdisc add dev eth0 parent 1:11 handle 10:0 sfq perturb 10
# tc qdisc add dev eth0 parent 1:20 handle 20:0 sfq perturb 10

Теперь надо классифицировать трафик (указать кто будет в каком классе):

iptables -t mangle -A POSTROUTING -d "ip руководителя" -j CLASSIFY --set-class 1:11

Все остальные попадут в класс 1:20. 

Используя данную логику можно и дальше разбить на классы и выделить разную ширину каждому. Так же (если компания большая) можно разбить всю сеть на подсети и классифицировать каждую подсеть, раздавая подсети разным отделам, например.