Linux Advanced Routing & Traffic Control HOWTO
Шрифт:
12.2. Классификатор route.
Этот классификатор тесно связан с таблицами маршрутизации. Когда пакет достигает такого фильтра, то дальнейшая его судьба зависит от информации, находящейся в таблицах маршрутизации.
В
Тут вся хитрость состоит в том, чтобы определить некую 'область' (realm), основываясь на адресе отправителя или получателя. Примерно таким образом:
Для примера зададим номер 'области', равным 10, для нашей сети 192.168.10.0.
# ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1 realm 10
В фильтрах, основанных на классификаторе route, мы можем использовать номер 'области' (realm) для представления сетей или отдельных узлов сети.
Под действие данного правила попадут пакеты, направляющиеся в сеть 192.168.10.0
Фильтры данного типа можно строить и на основе адреса отправителя. Рассмотрим пример, когда к маршрутизатору, под управлением Linux, через интерфейс eth2 подключена сеть.
Этот фильтр говорит о том, что пакеты из подсети 192.168.2.0 (область 2) будут отнесены к идентификатору класса 1:2.
12.3. Фильтры-ограничители трафика.
Более сложные системы управления трафиком можно строить на основе фильтров, которые зависят от пропускной способности и загруженности канала. Вы можете объявить фильтр, который не будет срабатывать, если загрузка канала превысила некоторую величину или наоборот, срабатывать только в том случае, если пропускная способность превысила заданное значение.
Так, если вы решили ограничить 5 Мбитный канал величиной в 4 Мбит/сек, вы можете вообще прекратить прием пакетов, если загруженность канала превысит 4 Мбит/сек, либо отбросить 1 Мбит/сек, а 4 Мбит/сек передать заданному классу.
При превышении заданного порога вы можете отбрасывать "лишние" пакеты, переклассифицировать их или передать
12.3.1. Способы ограничения.
Существует две основных возможности ограничения. Если вы собрали ядро с "функциями оценки" (estimators), то оно сможет более или менее точно измерять объем трафика, переданного тому или иному фильтру. Устройство функции оценки достаточно несложное — 25 раз в секунду подсчитывается объем переданных данных, на основе которого вычисляется загруженность канала.
Другой способ — Token Bucket Filter, который реализуется в пределах вашего фильтра. Это типичный шейпер, который может использоваться, если вам нужно просто ограничить полосу пропускания по какому-нибудь критерию.
12.3.1.1. Оценочная функция в ядре (estimator).
Тут все очень просто и имеется всего один параметр: avrate. Либо объем трафика остается ниже avrate и фильтр классифицирует его как сконфигурированный classid, либо, в случае превышения заданной границы, выполняется указанное действие, которое по-умолчанию выполняет переклассификацию.
Для оценки загруженности канала, ядро использует экспоненциальное взвешенное смещенное среднее значение, которое менее чувствительно к коротким пикам.
12.3.1.2. Token Bucket Filter.
Используются следующие параметры:
• burst/buffer/maxburst
• mtu/minburst
• mpu
• rate
Которые ведут себя идентично описанным в разделе Token Bucket Filter. Обратите внимание, если вы установите mtu слишком низким, то входящий трафик будет подавлен, в то время как исходящий TBF qdisc передаст с более низкой скоростью.
Еще одно важное отличие такого фильтра – он может только либо пропустить пакет, либо отбросить. Он не может задержать пакет на какое-то время.
12.3.2. Действия в случае превышения ограничения.
Если правило "решит", что произошло превышение заданного предела, то оно выполнит соответствующее действие. Имеются четыре вида действий:
continue
Выполняется в случае несовпадения с условной частью правила, чтобы передать пакет следующему фильтру.
drop
Очень жестокое действие, которое просто отказывает "в праве на жизнь" трафику, объем которого превысил заданную величину. Часто используется во входных фильтрах и имеет ограниченное применение. Например, представим, что имеется сервер имен, который не в состоянии работать при нагрузке выше чем 5Мбит/сек, в этом случае можно построить входной фильтр, который ограничит входящий трафик для нашего сервера.
Pass/OK
Пропустить трафик. Может использоваться для того, чтобы отключить сложный фильтр, оставив его на месте.