Часто возникает необходимость, особенно в офисе компании более-менее ровно распределить трафик между сотрудниками.
Такую задачу можно решить с помощь встроенной утилиты 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.
Используя данную логику можно и дальше разбить на классы и выделить разную ширину каждому. Так же (если компания большая) можно разбить всю сеть на подсети и классифицировать каждую подсеть, раздавая подсети разным отделам, например.