| Squid: ограничиваем скорость |
Перепечатано из журнала "Хакер"
Возможностей у Squid столько, что разработчики часто даже не успевают их подробно описывать. Общая настройка, как правило, проблем не вызывает. Cложности начинаются, когда необходимо настроить ограничения на использование канала, организовать доступ к прокси при помощи внешних средств или выбрать программу для работы с журналами. Все поделим поровнуСитуация, когда один канал нужно справедливо разделить между пользователями, отнюдь не редкость. В Squid регулировка пропускной способности канала производится при помощи пулов. За настройки отвечает группа параметров «Delay Pools». Большинство параметров этой секции требуют компиляции squid с опцией '--enable-delay-pools'. По умолчанию – так и есть. Узнать параметры сборки установленного Squid, можно введя команду «squid –v». Принцип ограничения скорости прост. Каждый запрашиваемый объект сначала попадает в буфер, а только затем передается клиенту. Каждый пул определяется двумя параметрами: скоростью заполнения и размером буфера. Если объем данных меньше размера буфера, то клиент получает их с максимальной скоростью, но при достижении лимита информация будет выдаваться в соответствии с установками. По мере опустошения пула Squid будет получать остальную часть запрашиваемой информации. Скорость заполнения пула зависит от класса. Для каждого пула при помощи delay_class должен быть установлен один из пяти классов (до версии 2.6 – один из трех):
Отсюда можно сделать вывод, что чем выше класс, тем через большее количество ограничений проходит соединение. Так для четвертого класса сначала действуют общие ограничения, затем ограничения подсети, отдельного узла и, наконец, для пользователя. Не стоит ожидать, что пользователь получит четко прописанную часть канала, если его подсеть выбрала свой лимит. Класс для пула задается при помощи параметра delay_class, аргументами которого являются номер пула и номер класса. Количество пулов задается параметром delay_pools. Например, создадим два пула и определим для каждого из них свой класс. Для этого прописываем в squid.conf следующие строки: # vim /etc/squid/squid.conf # Задаем списки доступа, по которым будем распределять юзеров по пулам acl office src 192.168.1.0/24 acl office2 src 192.168.2.0/24 acl user src 192.168.1.20/32 acl boss src 192.168.1.12/32 delay_pools 2 # 2 пула delay_class 1 2 # пул 1, класс 2 delay_class 2 3 # пул 2, класс 3 Принадлежность пользователей к пулу задается при помощи delay_access. Его синтаксис напоминает http_access: delay_access pool allow/deny ACL Поиск пула для конкретного адреса будет происходить только до первого совпадения, поэтому при объявлении пулов необходимо соблюдать нужный порядок. В одной строке следует использовать только один ACL. Если прописать их несколько, в пул попадет только первый. Также как и в http_access, чтобы в него не попал «лишний» адрес, каждый пул следует закрывать при помощи конструкции deny all. delay_access 1 allow office delay_access 1 allow user delay_access 1 deny all delay_access 2 allow office2 delay_access 2 allow boss delay_access 2 deny all http_access allow office office2 boss user http_access deny all В первый пул включены клиенты, описанные в ACL office и user, во второй – office2 и boss. Важно помнить, что ACL, не указанные в delay_access, будут выходить в Сеть без ограничений. При помощи delay_parameters задаем ограничения по скорости для каждого пула. В зависимости от класса пула количество аргументов будет различным. Так для четвертого класса полный формат записи выглядит так: delay_parameters пул общий сеть индивидуальный_пользователь Соответственно, в третьем классе не используется последний аргумент, а во втором отсутствуют «сеть» и «пользователь». Количество пар должно соответствовать классу. Если что-то пропустить, сквид откажется работать. Ограничения на каждой из позиций состоят из пары скорость заполнения/объем пула. Значения здесь указываются в байтах, а скорость провайдеры считают в битах. В позициях, в которых нет ограничений, устанавливаем «-1»: delay_parameters 1 16000/16000 8000/8000 delay_parameters 2 32000/32000 -1/-1 16000/16000 Для первого пула установлено общее ограничение в 128К и 64К для индивидуального адреса. Для второго общее ограничение – 256К; лимита на подсеть нет, но есть установка для отдельного IP-адреса. Для каждого пула должна быть только одна строка delay_parameters. Используя различные типы acl (смотри ][ за май этого года), можно ввести ограничения по времени, протоколам, типу файлов и др. Например, при помощи такой конструкции легко ограничить скорость любителям качать мультимедиа: acl multimedia urlpath_regex -i \.mp3$ \.mpeg$ \.avi$ delay_pools 3 delay_class 3 1 delay_access 3 allow multimedia delay_access 3 deny all delay_parameters 3 8000/8000 Теперь при закачке файлов указанных типов скорость выше 64 кбит подниматься не будет. Аналогично устанавливаются ограничения по времени. Например, чтобы уменьшить для всех пользователей скорость до 32 кбит в рабочее время, применяем правило: acl work_hours time M T W T F 9:00-18:00 delay_class 4 2 delay_access 4 allow work_hours delay_access 4 deny all delay_parameters 4 -1/-1 4000/4000 Таким же образом настраиваются ограничения по протоколам, адресам и другим типам ACL, поддерживаемым Squid. Но чтобы правила работали верно, их нужно располагать в том порядке, в котором они должны применяться. Например, если одним пользователям устанавливаются ограничения по адресу, а другим по времени, то сначала следует прописать пул для первых, а затем для вторых. Будь внимателен! Аутентификация в SquidДо этого момента списки доступа формировались на основе IP-адреса компьютера или его принадлежности к некоторой сети. Нередко возникает ситуация, когда за одним компьютером работают несколько человек, и необходимо предоставить доступ только после ввода логина и пароля. Squid поддерживает различные варианты аутентификации. Чтобы обеспечить проверку «подлинности» клиентов, следует использовать тип ACL proxy_auth и определить с помощью параметра auth_param (ранее authenticate_program) программу для аутентификации. acl USERS proxy_auth REQUIRED http_access allow USERS http_access deny all auth_param /usr/lib/squid/ncsa_auth /etc/squid/passwd auth_param children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours В первых трех строках объявлен новый acl и при помощи http_access разрешен доступ для всех клиентов, входящих в данный список. Значение REQUIRED указывает на то, что любой пользователь, прошедший аутентификацию, будет допущен. Как вариант, здесь можно прописать конкретные логины. В строке ниже указываем программу для аутентификации и расположение файла паролей. В разных дистрибутивах месторасположение ncsa_auth отличается. Найти его просто: $ dpkg -L squid3 | grep ncsa_auth Или – для RPM: # rpm -ql squid | grep nsca_auth Параметр children позволяет задать максимальное количество процессов, используемых для аутентификации. Небольшое количество процессов может ее замедлить. Используя realm, определим сообщение Squid, выводимое юзеру в окне ввода пароля. В принципе, текст здесь можно ввести и на русском, но то, как он будет выведен пользователю – зависит от настроек браузера. И, наконец, credentialsttl указывает время кэширования пароля. Файл паролей создается при помощи утилиты htpasswd, которая входит в состав пакета Apache. Создадим пользователя grinder: $ sudo htpasswd -c /etc/squid/passwd grinder New password: Re-type new password: Adding password for user grinder Напомню, что ключ '–с' используется только однажды (для создания файла). В дальнейшем добавляем учетные записи с ключом '-b'. Для удобства пароль можно указывать прямо в командной строке: $ sudo htpasswd -b /etc/squid/passwd user 123456 Перезапускать Squid при изменении списка пользователей не требуется. Чтобы никто другой не мог получить доступ к файлу паролей, следует установить соответствующие права: $ sudo chmod 440 /etc/squid/passwd $ sudo chown squid:squid /etc/squid/passwd Пробуем подключиться к прокси-серверу. Чтобы не вводить каждый раз логин и пароль, их можно указать в настройках клиентского браузера. |
Squid: ограничиваем скорость