Если бы я должен был что-то построить для решения этой проблемы, я бы настроил это:
Здесь мы собираемся взять ваш пример 4 компьютеров с одной ссылкой. Сеть будет иметь такую форму:
{ ISP }=========[ SOHO router] ===LAN1=== [eth0 |Linux Box| eth1] ===LAN2=== Home Desktops/Laptops
Допустим, вы используете статическую IP-адресацию в LAN2:
Linux Box 192.168.1.1 Home 1 192.168.1.11 Home 2 192.168.1.12 Home 3 192.168.1.13 Home 4 192.168.1.14
Сначала я написал бы небольшой скрипт, чтобы определить, какие клиенты работают, проверяя их и записывая результат где-нибудь. «Это оставлено в качестве упражнения для читателя». Рассчитайте общее количество подключенных хостов (1-4).
Обязательно разберитесь со случаем отсутствия хостов онлайн.
Разделите общую полосу пропускания, но количество подключенных хостов. (12 МБ для 1, 6 МБ для 2, 4 МБ для 3, 3 МБ для 4)
Затем используйте tc с алгоритмом HTB, чтобы ограничить пропускную способность каждого адреса на устройстве на стороне WAN. Сначала создайте корневой класс:
DEV="eth0" TC="/sbin/tc" TOT_BW=12 $TC qdisc add dev $DEV root handle 1: htb default 99
Затем добавьте класс для каждого «клиента» (здесь, например, 3 клиента)
NB_CLT=3 CLT_BW=$(($TOT_BW/$NB_CLT))mbit for i in seq $NB_CLT do $TC class add def $DEV parent 1: classid 1:$i htb rate $CLT_BW ceil $CLT_BW burst 15k cburst 1500 $TC filter add dev $DEV protocol ip parent 1:0 prio 1 flowid 1:$i u32 \ match ip dst 192.168.1.1$i/32 \ match ip src [Router IP in LAN1]/32 done
(приведенный выше скрипт полностью не проверен и НЕ печатает без ошибок)
Теперь вам все еще нужно правильно написать скрипт, который будет запускаться каждую минуту, и обновлять блоки / фильтры каждый раз, когда новый хост поднимается или опускается.
Я надеюсь, что это укажет вам правильное направление, удачи.
Альтернативное решение
Установите локальное программное обеспечение QoS на всех хостах, чтобы ограничить их пропускную способность. Я персонально использую NetLimiter (не бесплатно)