Я настраиваю среду, в которой у меня есть один сервер Linux, один маршрутизатор OpenBSD и один клиент Linux, и я хочу иметь возможность ограничивать полосу пропускания, которую должен использовать клиент.
Я проводил эти тесты с netcat и time (используя время для измерения времени передачи с netcat), и что происходит при попытке этих тестов (используя протокол TCP, очереди по какой-то причине не работают с UDP) заключается в том, что очереди совсем не точны.
Например: при установке ограничения пропускной способности в 10 Мбит клиент не может использовать более пяти Мбит, при установке ограничения в 100 Мбит клиент не может использовать более 50 Мбит.
Конфигурация выглядит так (в примере используется ограничение в 100 Мбит):
#queue rules
altq on { $int_if, $ext_if } cbq bandwidth 100Mb queue { def, low }
queue def bandwidth 0Mb cbq(default)
queue low bandwidth 100Mb cbq(default)
#Passrules test
pass out quick from $int_if to $ext_if queue low
pass in quick from $ext_if to $int_if queue low
pass out quick from $ext_if to $int_if queue low
pass in quick from $int_if to $ext_if queue low
По моему опыту, для того, чтобы altq работал хорошо, вам действительно нужно добавить red
, rio
или ecn
вариант для ваших ограничивающих очередей, иначе по мере приближения к насыщению (физическому или виртуальной очереди) вы попадете в некоторые неприятные ситуации. Взгляните на раздел RED (случайное раннее обнаружение) в altq howto для получения дополнительной информации.
Кроме того, две проблемы с вашим фрагментом выше:
default
очереди: это не разрешено (на самом деле pf должен устроить фурор).