Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Ограничение полосы пропускания через Squid (delay pools)

Практика



Ограничение пропускной способности канала интернет для различных пользователей или компьютеров - тема не новая и достаточно избитая. Одним из самых распространенных методов решения является использование встроенных в ядерные файерволы IPFW или IPTABLES возможностей "нарезания" трафика или ограничение его скорости.

Несмотря на то, что использование файерволов для этой задачи - наверное, один из самых популярных способов, существуют так-же и другие решения. Например, если у Вас установлен кеширующий прокси-сервер Squid, то можно использовать его.

Зачем заморачиваться за Squid? Например, Вы не шибко дружите с IPTABLES или IPFW (для Linux и FreeBSD соответственно), не хотите подвергать риску шлюз, стоящий в удалении от Вас (ошибочно запоров конфиг файервола и, соответственно, потеряв возможность управлять им) или хотите привязать ограничение ширины канала к залогиненному пользователю (например, когда Squid работает с авторизацией подключаемых пользователей и с одной и той же машины могут в интернет выходить люди с разными правилами ограничения скорости).

Заметка. Следует так-же учесть и обратную сторону медали - Squid может контролировать скорость трафика только для HTTP/S. Все остальное, что не завернуто на прокси-сервер, будет проходить на максимальной скорости или так, как это задано через файервол.


Для ограничения скорости канала в Squid используется технология под названием Delay pools. Однако по-умолчанию Squid собирается без нее и Вам, вероятно, придется переустановить прокси-сервер для включения данной опции.


Включаем delay-pools

Для FreeBSD:

Здесь я предположу, что у Вас Squid 3.1. Для 3.0 используйте путь "../squid30"
$ cd /usr/ports/www/squid31
$ make config

Если в строчке "SQUID_DELAY_POOLS" галочка не стоит - значит, прокси-сервер собран без поддержки данной опции. В таком случае выполняем следующее (выйдя из make config без сохранения):
$ sudo make deinstall
$ sudo make config
(включаем SQUID_DELAY_POOLS)
$ sudo make reinstall


Для Linux Debian/RHEL:

По-умолчанию Squid, устанавливаемый через apt-get (или yum для rhel) идет с поддержкой delay pools, потому в данном случае делать ничего не надо.

Если же Вы собираете Squid из исходников - то для ./configure не забудьте указать ключ "--enable-delay-pools".



Настраиваем delay-pools

Для этого нам необходимо открыть файл конфигурации Squid: squid.conf. Для каждой ОС он лежит в своем месте:
  • FreeBSD: /usr/local/etc/squid/squid.conf
  • Debian: /etc/squid/squid.conf
  • CentOS/RedHat: /etc/squid/squid.conf

Итак, открываем этот файл на редактирование.



Количество пулов

Сначала определите - сколько пулов Вы будете настраивать. Например, один пул для ограниченных пользователей, один - для обычных, и один - для начальства (итого - 3).

После этого дописываем в конфиг-файл опцию:
delay_pools 3
где вместо 3 указываем количество пулов.


Настраиваем каждый пул

Теперь определим параметры для каждого пула. Пулы определяются своим номером: 1, 2, 3...

Сначала зададим классы пулов. Дело в том, что Squid предоставляет нам несколько классов, отличающихся своими свойствами.

Например:
delay_class 1 1
delay_class 2 2
delay_class 3 2
здесь первая цифра в параметре - это номер пула, а вторая - класс пула.


Теперь указываем ACL, для которой будет работать данный пул. ACL мы должны предварительно созлать с помощью обычного для Squid синтаксиса, поместив в нее набор подсетей, компьютеров или пользователей.

Например:
# Начальство
delay_access 1 allow chiefs

# Простые пользователи
delay_access 2 allow users

# Особо ограниченные пользователи
delay_access 3 allow minusers

И указываем параметры для каждого пула. Например:
# Пул 1 - неограниченная скорость
delay_parameters 1 -1/-1

# Пул 2 - общая скорость всех пользователей не ограничена, но каждый
# пользователь не может превышать 1024Кбит/с (128КБайт/с). Разделить
# ограничения скоростей позволяет класс 2 (об этом ниже).
# При этом первые 128КБайт для каждого соединения будут скачаны без ограничения
delay_parameters 2 -1/-1 128000/128000

# Пул 3 - общая скорость всех пользователей - не более 2048Кбит/с (256КБайт/с),
# но каждый пользователь не может превышать 512Кбит/с (64КБайт/с). Разделить
# ограничения скоростей позволяет класс 2 (об этом ниже).
# При этом первые 128КБайт для каждого соединения будут скачаны без ограничения
delay_parameters 3 256000/128000 64000/128000

Как видно, параметры разделаются на пары. Первое число в паре - это ограничение скорости в Байтах/секунду (не Битах!), а второе - это "первые XX байт, которые будут переданы пользователю на максимальной скорости".

Вместо какой-то цифры можно использовать -1, что означает "не учитывать этот параметр".

Количество параметров и их значение зависит от класса пула (о классах - ниже).

Давайте разберем 3 примера, из которых, как я надеюсь, станет немного более понятно действие параметров:
  • а) 256000/128000 : Здесь мы ограничиваем скорость 256000 байт/с (256КБайт/с), а первые 128000 байт (128Кбайт) каждого запроса будут скачаны на максимальной скорости - т.е. без ограничения.
  • б) 256000/-1 : Здесь мы ограничиваем скорость 256000 байт/с (256КБайт/с), причем сразу с первого байта трафика.
  • в) -1/-1 : Здесь мы говорим, что для данного трафика никаких ограничений не сущесвует.


В остатке выше написанного примера мы будем иметь следующее:
  • 1) Начальство ходит без ограничений;
  • 2) Пользователи ограничиваются скоростью в 1Мбит/с на каждого, при этом первые 128КБайт будут скачаны на максимальной скорости;
  • 3) Органиченные пользователи: тут на каждого пользователя выдается ограничение в 512Кбит/с, при этом суммарно все пользователи ограничиваются скоростью в 2Мбит/с (т.е. все вместе они не могут качать быстрее, чем 2Мбит/с), и первые 128Кбайт для каждого соединения будут скачаны без ограничения скорости.


Классы пулов

Squid предоставляет несколько классов пулов, отличающихся возможностями по ограничению трафика. Сейчас мы рассмотрим их.


Класс 1

Ограничивает общюю скорость для всех хостов, входящих в определенный ACL. Т.е. он не различает индивидуальных пользователей - просто суммирует всю полосу пропускания от всех пользователей из указанной ACL и ограничивает всех пользователей поровну в зависимости от расходования выделенной полосы.

delay_class 1 1
delay_access allow myacl
delay_parameters 512000/-1
в данном примере мы ограничиваем всех пользователей из myacl суммарно 4Мбит/с (512Кбайт/с).


Класс 2

Ограничивает общую скорость для всех хостов, но позволяет ограничить самих пользователей отдельно. Т.е. "суммарно из ACL не быстрее A, но каждый пользователь - не быстрее B".

delay_class 1 2
delay_access allow myacl
delay_parameters 512000/-1 128000/-1
в данном примере мы ограничиваем всех пользователей myacl суммарно 4Мбит/с (512Кбайт/с), но при этом, даже при свободном канале, каждый пользователь в отдельности не получит скорость выше 1Мбит/с (128Кбай/с).

Второй пример:
acl myacl1 src 192.168.0.0/24
acl myacl2 src 192.168.1.0/24
delay_class 1 2
delay_access allow myacl1 myacl2
delay_parameters 512000/-1 128000/-1
здесь мы ограничиваем скорость myacl1 суммарно 4Мбит/с и myacl2 суммарно 4Мбит/с. Т.е. эти две ACL не ограничиваются суммарно, а правила применяются для каждой из них раздельно. В остальном - все то же.



Класс 3

Ограничивает общую скорость, скорость каждой ACL и каждого хоста. Т.е. это класс 2 + суммарное ограничение всех входящих в пул ACL.

acl myacl1 src 192.168.0.0/24
acl myacl2 src 192.168.1.0/24
delay_class 1 3
delay_access allow myacl1 myacl2
delay_parameters 768000/-1 512000/-1 128000/-1
здесь мы ограничиваем myacl1 скоростью в 4Мбит/с, myacl2 скоростью в 4Мбит/с, при этой каждый компьютер не может кушать больше 1Мбит/с даже при свободном канале. Но плюс ко всему мы ограничиваем суммарно myacl1 и myacl2 скоростью в 6Мбит/с (т.е. скорость myacl1 + myacl2 не может суммарно превысить 6Мбит/с).

Таким образом, хоть мы и раздали на каждый ACL по 4Мбит/с (что в сумме составляет 8Мбит/с), но мы показали, что вместе они не могут превысить скорость в 6Мбит/с.


Класс 4

Дополнительно к классу 3 позволяет разделять скорость для каждого залогиненного пользователя. Т.е. мы можем ограничивать:
  • а) Все ACL
  • б) + Каждый ACL
  • в) + Каждый компьютер в каждой ACL
  • г) + Каждого авторизованного пользователя

Например:
acl myacl src 192.168.0.0/24
acl authacl proxy_auth user1 user2 user3
delay_class 1 4
delay_access allow myacl authacl
delay_parameters -1/-1 512000/-1 -1/-1 128000/-1

Здесь:
  • Суммарно скорость не ограничена (-1/-1)
  • Скорость для myacl и authacl ограничена для каждой из них 4Мбит/с (суммарно для всех хостов внутри ACL)
  • Скорость для каждого компьютера в отдельности не ограничена
  • Скорость для пользователей user1, user2 и user3 (authacl) ограничена в 1Мбит/с на каждого. При этом если под одним и тем же логином пользователь зашел на нескольких компьютерах - то скорость считается суммарно со всех компьютеров, с которых залогинен этот пользователь.



Заключение

Вот так, в двух словах, как памятку, я описал - как пользоваться delay pools в Squid. Кстати, есть еще и пятый класс, который я не затронул. К сожалению, времени разбираться с ним у меня нет (он еще более заморочен и основывается на external_acl's и запросах, сгруппированных по тегам).

Еще раз хочется повторить основной минус данного метода - это то, что пользователей Вы можете ограничить только по HTTP/S трафику. Все, что проходит мимо Squid - не ограничивается.

 

Актуально для: Linux Debian/CentOS/RedHat или FreeBSD; Squid 3+
 
создано: 2017-05-09
обновлено: 2021-03-13
133097



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Компьютерные сети

Термины: Компьютерные сети