Наши читатели часто спрашивают, каким образом можно ограничить скорость или разделить канал между клиентами. Сегодня мы рассмотрим как это можно сделать с помощью прокси-сервера Squid, взяв за основу уже настроенный нами роутер.
Излагая материал данной статьи мы будем считать, что читатель уже имеет настроенный по нашим рекомендациям роутер и владеет начальными навыками его администрирования: знает где находятся конфигурационные файлы, умеет их редактировать и сохранять, а также перезапускать службы.
За ограничение скорости в Squid отвечает механизм пулов, работающий по следующему принципу: каждый пул имеет свой размер и свою скорость заполнения. Любой запрошенный клиентом объект сначала помещается в пул, а затем отдается клиенту. Размер буфера и скорость его заполнения задается в байтах и записывается следующим образом: 120000/120000, эта запись обозначает пул с размером буфера в 120 кБ и скоростью заполнения 120 кБ/с. Неограниченный размер буфера / скорости указывается как -1/-1.
В зависимости от значений возможны три варианта работы пула:
Пример 1. Необходимо ограничить скорость сети на уровне 1024 кб/с и скорость каждого клиента на уровне 256 кб/с.
Для этой цели нам понадобится пул второго класса с характеристиками 128000/128000 32000/32000 (не забываем переводить килобиты в килобайты)
Пример 2. Необходимо обеспечить серфинг на полной скорости канала (1024 кб/с), а для закачек более 1 МБ ограничить скорость на 128 кб/с. Создадим пул первого класса с параметрами 1000000/16000. Все объекты размером меньше 1 МБ будут отдаваться на максимальной теоретической скорости 8 Мбит/с, реально ограниченной максимальной скоростью канала, все объекты размером свыше одного МБ будут скачиваться на скорости не выше 128 Кб.
Теперь рассмотрим практический пример конфигурирования Squid для наших нужд, попробуем реализовать следующую схему:

Будем считать, что у нас имеется входящий интернет канал шириной 2048 кб/с который требуется разделить на две подсети LAN1 (192.168.0.0/24) и LAN2 (192.168.1.0/24) выделив по 1024 кб/с на каждую. В каждой из подсетей скорость конечных клиентов требуется ограничить на уровне 128 кб/с. Также в подсети LAN1 необходимо выделить неограниченный канал для ноутбука директора (192.168.0.110).
Задача ясна, приступим к реализации. Все изменения следует вносить в конфигурационный файл Squid /etc/squid/squid.conf.
Сначала зададим списки доступа (ACL), следует помнить, что поиск в списках ведется по порядку и до первого совпадения, поэтому нужно соблюдать необходимую очередность, сначала указываем хосты, затем подсети. Аналогичных правил следует придерживаться и при указании пулов.
Установим необходимые права доступа
Теперь создадим пулы. Для решения данной задачи нам потребуется два пула: первого и третьего классов.
Для параметра delay_class указывается номер пула и его класс, так вторая строка создает первый пул первого класса, третья второй пул третьего класса.
Следующим шагом зададим принадлежность групп доступа к пулам:
Осталось задать параметры пулов. Следует помнить, что параметры указываются по порядку: общие - подсеть - хост и в том же порядке перекрывают друг друга. Если, например, на общем уровне действуют ограничения на размер файла, то они автоматически распространяются на подсеть и хост.
Сохраняем конфигурационный файл, перезапускаем Squid. Проверяем, все должно работать.
За ограничение скорости в Squid отвечает механизм пулов, работающий по следующему принципу: каждый пул имеет свой размер и свою скорость заполнения. Любой запрошенный клиентом объект сначала помещается в пул, а затем отдается клиенту. Размер буфера и скорость его заполнения задается в байтах и записывается следующим образом: 120000/120000, эта запись обозначает пул с размером буфера в 120 кБ и скоростью заполнения 120 кБ/с. Неограниченный размер буфера / скорости указывается как -1/-1.
В зависимости от значений возможны три варианта работы пула:
- Размер буфера и скорость заполнения равны. Клиент всегда качает с максимальной скоростью, равной скорости заполнения.
- Размер буфера меньше скорости заполнения. Клиент получает трафик с постоянной скоростью, численно равной размеру буфера, но Squid не подкачивает данные пока буфер не будет опустошен. Наполнение буфера (т.е. скачивание информации из интернета) происходит на скорости заполнения.
- Размер буфера больше скорости наполнения. Клиент получает объекты не превышающие объем буфера на максимальной скорости, численно равной размеру буфера. Объекты большего размера он получает на скорости равной скорости заполнения буфера.
- Первый - ограничивается общая скорость загрузки
- Второй - ограничивается общая скорость загрузки и скорость каждого хоста.
- Третий - ограничивается общая скорость загрузки, скорость подсети и скорость каждого хоста.
Пример 1. Необходимо ограничить скорость сети на уровне 1024 кб/с и скорость каждого клиента на уровне 256 кб/с.
Для этой цели нам понадобится пул второго класса с характеристиками 128000/128000 32000/32000 (не забываем переводить килобиты в килобайты)
Пример 2. Необходимо обеспечить серфинг на полной скорости канала (1024 кб/с), а для закачек более 1 МБ ограничить скорость на 128 кб/с. Создадим пул первого класса с параметрами 1000000/16000. Все объекты размером меньше 1 МБ будут отдаваться на максимальной теоретической скорости 8 Мбит/с, реально ограниченной максимальной скоростью канала, все объекты размером свыше одного МБ будут скачиваться на скорости не выше 128 Кб.
Теперь рассмотрим практический пример конфигурирования Squid для наших нужд, попробуем реализовать следующую схему:
Будем считать, что у нас имеется входящий интернет канал шириной 2048 кб/с который требуется разделить на две подсети LAN1 (192.168.0.0/24) и LAN2 (192.168.1.0/24) выделив по 1024 кб/с на каждую. В каждой из подсетей скорость конечных клиентов требуется ограничить на уровне 128 кб/с. Также в подсети LAN1 необходимо выделить неограниченный канал для ноутбука директора (192.168.0.110).
Задача ясна, приступим к реализации. Все изменения следует вносить в конфигурационный файл Squid /etc/squid/squid.conf.
Сначала зададим списки доступа (ACL), следует помнить, что поиск в списках ведется по порядку и до первого совпадения, поэтому нужно соблюдать необходимую очередность, сначала указываем хосты, затем подсети. Аналогичных правил следует придерживаться и при указании пулов.
acl direktor src 192.168.0.110/32acl lan1 src 192.168.0.0/24acl lan2 src 192.168.1.0/24
Установим необходимые права доступа
http_access allow direktorhttp_access allow lan1http_access allow lan2Теперь создадим пулы. Для решения данной задачи нам потребуется два пула: первого и третьего классов.
delay_pools 2delay_class 1 1delay_class 2 3Для параметра delay_class указывается номер пула и его класс, так вторая строка создает первый пул первого класса, третья второй пул третьего класса.
Следующим шагом зададим принадлежность групп доступа к пулам:
delay_access 1 allow direktordelay_access 1 deny alldelay_access 2 allow lan1delay_access 2 allow lan2delay_access 2 deny allОсталось задать параметры пулов. Следует помнить, что параметры указываются по порядку: общие - подсеть - хост и в том же порядке перекрывают друг друга. Если, например, на общем уровне действуют ограничения на размер файла, то они автоматически распространяются на подсеть и хост.
delay_parameters 1 -1/-1delay_parameters 2 -1/-1 128000/128000 16000/16000Сохраняем конфигурационный файл, перезапускаем Squid. Проверяем, все должно работать.

Автор, низкий поклон за этот ресурс.
Большое спасибо. Как только у нас будет хорошая скорость (в данный момент всего 256) обязательно применим. Но сейчас несколько другая проблема. Я уже смогу (прочитал Вашу инструкцию) разделить 256 на 10 - строго поровну. А если будет работать только 2-3 компьютера, или даже вообще один... Такое тоже бывает. Они же будут сидеть на этом ограничении, при наличии резерва скорости в сети.
Насколько мне показалось, данными средствами Squid невозможно динамически равномерно распределить скорость между клиентами. А лично мне хотелось бы именно этого.
Но всё равно, ещё раз спасибо за материал. Как всегда очень просто и понятно. Пригодиться.
Динамически распределять канал - это система совсем другого уровня сложности. Я бы советовал вам сделать по другому: на серфинге скорость не ограничивать, а для закачек свыше 300-500 кб ограничивать скорость. Таким образом серфить все будут на полной скорости, но закачки и тяжелые веб страницы будут ограничиваться и не допускать перегрузки канала одним пользователем.
Спасибо! Очень ждал этот материал. В связи с этой темой, хотелось бы получить комментарии к статье о борьбе с торрент-трафиком, а именно, можно ли заставить ходить торрент-трафик только через прокси и как будут влиять на него ограничения скорости описанные в настоящей статье
Попробовать можно, но проблема не в скорости, а в большом количестве устанавливаемых клиентом соединений, что черевато отказом в обслуживании со стороны прокси сервера. Плюс организационный вопрос - как вы будете контролировать использование прокси торрент клиентами?
А ограничения в скорости закачки не скажется на загрузке тех же обновлений для систем клиентов? Тот же Firefox весит за 30 метров. И если я использую на шлюзе и клиентах apt-cacher-ng, то сейчас обновления (кроме первого скачивания для клиента) идут "со свистом" :). На это ограничения по скачиванию не повлияют?
На то, что скачивается из кэша - нет, на скорость закачки из интернета - да.
А как ведет себя настройка по умолчанию? Если всего этого не настраивать, как поделится скорость между 10ю пользователями например?
По принципу "кто первый встал - того и тапки", если кто-то из пользователей нагрузит канал тяжелой закачкой, остальные будут довольствоваться тем, что останется.
А есть ли какой-нить быстрый способ настроить так что бы канал делился поровну между активными на текущий момент пользователями ?
Простых и быстрых способов нет. Да и в большинстве случаев это не нужно, достаточно ограничить закачки, потоковое видео и т.п. тяжелую нагрузку на канал, чтобы поставить пользователей в равные условия.
Здравствуйте!
Строку delay_parameters 2 записал в виде:
delay_parameters 2 -1/-1 1000000/64000 1000000/16000
Тем самым надеялся на то что файлы менее 1 Мб будут закачиваться на максимальной скорости. Однако, все файлы, даже самые маленькие загружаются со скоростью 16 кб в сек.
Что я понял не так?
Попробовал реализовать Пример 2 - ограничения скорости также сказываются на всём трафике не зависимо от размера загружаемых данных :(
Какая скорость канала, какой пул создавали?
канал 1024 кбит/сек, пул 1 го и 3 го класса, с цифрами пробовал по разному, последнее выглядит так:
acl test src 192.168.1.15/32
acl lan1 src 192.168.0.0/24
acl lan2 src 192.168.1.0/24
http_access allow test
http_access allow lan1
http_access allow lan2
delay_pools 2
delay_class 1 1
delay_class 2 3
delay_access 1 allow test
delay_access 1 deny all
delay_access 2 allow lan1
delay_access 2 allow lan2
delay_access 2 deny all
delay_parameters 1 1000000/16000
delay_parameters 2 -1/-1 1000000/64000 1000000/16000
скорость урезается для всего трафика, а хотелось бы что бы только на объекты более 1 мб
Вроде бы все правильно, попробуем промоделировать вашу ситуацию, какая у вас версия Ubuntu и Squid?
Ubuntu 10.04.1 LTS
Squid Cache: Version 2.7.STABLE7
Ubuntu 10.04.1 LTS - server
У кого нибудь реально работает Пример 2 ?
У нас на тестовой машине работает.
что же делать? от расположения в конфиге зависит результат? я добавлял эти записи в самый конец
Конечно зависят. Поиск в списках acl ведется по порядку и до первого совпадения. Возможно ваши правила перекрываются какими-либо вышестоящими. Просмотрите весь конфиг с начала. И вообще свои правила лучше добавлять не в конец, а в специально отведенные секции. Если вы внимательно посмотрите, что увидите, что конфиг squid хорошо документирован, сначала идет описание, затем пример, а потом параметры.
не получилось у меня, но я очень долго бился.. что может быть не так?
конфиг ведь рабочий! только работает не так как надо :)
может найдете время посмотреть на него:
ubuntuone.com/p/YlV/
Кое-какого результата удалось достигнуть "перевернув" соотношение из второго примера вместо 1000000/16000 -> 16000/1000000. Что позволяет, как я понимаю, получить на максимальной скорости первый миллион байт со страницы. Но это уже другая история?
Та же история со вторым примером. Скорость режется для всех закачек. Пробовал выставлять 100000000/125000, но все равно все файлы качаются с ограничением. Делал так
acl mynet src 192.168.1.10/24
delay_pools 1
delay_class 1 1
delay_access 1 allow mynet
delay_access 1 deny all
delay_parameters 1 100000000/125000
Что с не так? Не пойму((
Сейчас времени разбираться нет, на выходных постараюсь выделить пару часов.
Здравствуйте. Хотелось бы увидеть статью о настройки связки squid3+sams2+AD. У многих с этим проблемы.
Здравствуйте, спасибо за столь доходчивые howto.
И тем не менее, несмотря на нетривиальность задачи динамического распределения занятости канала, (см. первый коммент), не собираетесь ли вы сваять нечто подобное?. Ручаюсь, интерес к подобному материалу будет огромным. На широких каналах эта задача не так критична, но на модемных, где и 512Кб/с не редкость, а раздавать приходится на 10-20 компьютеров, это просто край, хоть вешайся.
спасибо вам огромное!
Сделал прокси после прикрутил авторизацию и хотел прокрутить ограничение скорости, но не работает в этой конфигурации:(
Неужели прокси и авторизация не работают в месте с ограничением скорости?
Должны работать, еще раз проверьте списки доступа, помните, что они обрабатываются по порядку до первого совпадения.
Должны ли работать эти ограничения,если установлен и работает DansGuardian,у меня не работают,смущает то что трафик заворачивается на порт DansGuardian (# Заворачиваем http на прокси
iptables -t nat -A PREROUTING -i eth1 -d ! 10.0.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 10.0.0.1:8081)пожалйста подскажите правильно ли я думаю.
Если у вас стоит DG вы можете ограничить только общую скорость канала или попробуйте следовать рекомендациям в теме: http://interface31.ru/tech_it/2011/03/sarg-analiziruem-logi-proksi-severa-squid.html#comment-1358
подскажите пожалуйста, когда выставляю скорость больше чем 4000/4000 ограничение перестает действовать. мне нужна скорость 15-20 кБ/с, но никак не выходит начинает качать почти на максимуме. заранее спасибо!
Какого класса пул у вас указан и какие параметры вы ему задали?
я все уже перепробовал с 1го по 3ий,ща 2 поставил.
acl mynet src 192.168.8.88/32
delay_pools 1
delay_class 1 2
delay_access 1 allow mynet
delay_access 1 deny all
delay_parameters 1 12800/128000 8000/8000
Вам нужен пул первого класса с параметрами 15000/15000, судя по 192.168.8.88/32 вы хотите ограничить скорость для единственного хоста?
Кстати перед squid'ом у вас ничего не стоит?
так тоже не работает,разгон начинается не сразу,но постепенно скорость все равно растет больше 100 000. проверяю downloadmestero'ом. а что имеете ввиду перед сквидом?
Вы уверены, что downloadmester качает через squid?
Перед squid'ом может стоять например DansGuardian.
master настроен через прокси 192,168,1,1:3128, DansGuardian я вообще не нашел.может что то еще есть в ip tables, но ip я взял рядовой,из тех за которыми сидят студенты,а старого админа я в глаза не видел.как быть не знаю
Смотрите в логах сквида каким образом был обработан запрос от этого клиента, в частности вас должен интересовать адрес источника.
Возможно ограничить в одной сети общую скорость загрузки по разным объемам закачки, например:
для закачек более 10 МБ ограничить скорость на 1024 кб/с
для закачек более 1 МБ ограничить скорость на 2048 кб/с
все что меньше 1Мб - на полной скорости
?
Здравствуйте хочу попробовать поставить squid,dansguardian,clamav и havp,но так чтобы первым из локальной сети запросы принимал squid затем dansguardian а затем все остальные.Вопрос следующий,можно ли такое организовать только при помощи iptables,если нет то поставить havp,clamav,dansguardian на виртуальную машину,а с неё направить на squid который будет стоять на реальном железе и смотреть в локальную сеть.
Нет, так не получится. Dansguardian можно поставить только перед squid, есть два варианта: еще один squid перед DG или изменить настройки squid, подробнее здесь: http://interface31.ru/tech_it/2011/03/sarg-analiziruem-logi-proksi-severa-squid.html#comment-1358
Спасибо большое,покопался в FAQ DG совет тот же самый
Looking in Squid's access.log, all entries have the client IP given as the box running DansGuardian (typically 127.0.0.1). How can I log the original client IPs?
Turn on the "forwardedfor" option in dansguardian.conf, and get Squid to obey the "X-Forwarded-For" header in incoming requests. For Squid 2.5, you will have to apply the following patch: http://devel.squid-cache.org/follow_xff/follow_xff-2.5.patch
This has become a core feature in Squid 2.6-STABLE1 and above. Be wary of also enabling the "usexforwardedfor" option in DG, as it is trivial for clients to spoof headers in the original request.
Не могли бы Вы,хоты бы в двух словах описать как запустить еще один Squid перед DG,пытался найти что-то похожее,наткнулся на каскадирование,но как понял это не совсем то.
Собственно каскадирование вам и нужно, хотя это не самый лучший вариант, лучше разобраться с опцией X-Forwarded-For, коротко как это сделать было выше.
Странно,в последних комментариях Ваш ответ видно,(Уваров А.С.: Собственно каскадирование вам и нужно, хотя это не самый лучший читать дальше)а тут его нет.
После добавления комментария Ваш ответ появился(страницу обновлять пробовал ))) ).Я только за X-Forwarded-For,но хочу сделать авторизацию по логину и паролю через Squid,то есть как я понимаю из Вашей статьи о авторизации в Squid,мне надо будет прописать адрес Squid в браузере, но тогда запросы будут ходить мимо DG.При помощи опции X-Forwarded-For в данном случае можно настроить авторизацию только по ip?
Теоретически будет достаточно прописать в браузере адрес DG, но это надо проверять.