Ограничение пропускной способности канала интернет для различных пользователей или компьютеров - тема не новая и достаточно избитая. Одним из самых распространенных методов решения является использование встроенных в ядерные файерволы 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
Термины: Операционная система LINUX