Стоит следующая задача. Локальная сеть состоит из порядка 10 подсетей,
в каждой примерно по 4000 IP-адресов, реально компьютеров примерно по
300 в каждой из подсетей. Для каждого компьютера каждой подсети необходимо
индивидуально ограничить полосу пропускания. Для компьютеров, принадлежащих
одной подсети, параметры шейпинга одинаковы.Если назначать шейпинг на подсеть - компьютеры одной подсети будут делить
между собой назначенную полосу. Если задавать отдельные правила шейпинга
для каждого адреса каждой подсети - tc отказывается добавлять правила при
примерно 10000 правил (может и меньше, точно не знаю). Кроме того, при
количестве правил tc порядка нескольких тысяч даже неслабый комп под
нагрузкой затыкается до полной потери интерактивности. В этой же ситуации
под управлением FreeBSD процессор загружен менее чем на 10%.
В FreeBSD всё делается просто:
ipfw add 800 pipe 10 ip from any to 10.1.128.0/20
ipfw pipe 10 config bw 128Kbit/s mask dst-ip 0x0000ffff
Вторая команда создаёт отдельный "канал" для каждого адреса подсети
10.1.128.0/20, попадающего под маску 0x0000ffff. При этом добавление
правил происходит быстро (всего два правила), и много памяти не тратится.
Есть ли в Linux аналог маски в pipe? Или, возможно, есть другой, более
рациональный, способ ограничения ширины полосы пропускания?