Добавить в избранное | Сделать стартовой страницей

Большая Linux библиотека для пользователей OS Linux и ПО для нее
Есть что сказать? Нужен совет? Посети наш форум.




Что есть Squid?

Те из вас, кто читал сентябрьский номер LG, помнят, что я писал статью об использовании Apache. Я получил несколько неплохих откликов (спасибо всем, кто прислал свои комментарии). Я подумал, что будет неплохо написать небольшой "букварь" по squid.

Для тех, кто не в курсе, Squid (http://www.squid-cache.org) (не путайте с морским созданием, родственником цефалоподов) -- это программа, работающая под Linux и выполняющая функции proxy-сервера Интернет. Почему он так называется? Очевидно потому что (цитирую: "все нормальные имена уже заняты").

Squid обрабатывает туннельные интернет-запросы, посылаемые через машину, тоже именуемую proxy-сервер.

Дополнительно он предоставляет возможность фильтровать определённые web-страницы, соответственно позволяя или блокируя их просмотр пользователем. Это осуществляется при помощи ACL (Access Control Lists -- списки контроля доступа). Более подробно об этом мы поговорим позже.


Инсталляция

Инсталляция squid не слишком сложна. Он поддерживается в большинстве дистрибутивов (RedHat, SuSE, Caldera, Debian и т.д.), так что я уверен, что вы обязательно найдёте его на своих компакт-дисках.

Если ваш Linux-дистрибутив поддерживает RPM-пакеты, то вы можете проверить установлен ли squid на вашей машине вот такой командой:

rpm -qa | grep -i squid11

Если пакет установлен, то rpm вернёт вам примерно такую строку (или что-то на неё похожее):

squid2-2.2.STABLE5-190

Если же squid не установлен, то его можно поставить с компакт-дисков дистрибутива. 3

Если по какой-то причине на компакт-дисках вашего дистрибутива squid не оказалось, или вы используете дистрибутивы Linux'а (такие как Debian или Slackware), которые не поддерживают формат пакетов RPM, то загрузите "тарбол" (.tgz или .tar.gz) с исходным кодом proxy-сервера: http://www.squid-cache.org/download.

Для установки squid из "сырцов" распакуйте "тарбол" в "/tmp" и выполните следующие команды:

1. Если вы сейчас не зарегистрированы как пользователь "root", то
воспользуйтесь либо su, либо sudo, либо авторизуйтесь в системе как root через
отдельную консоль
2. cd /tmp
3. tar xzvf ./имя_пакета_squid.tar.gz -- [или возможно .tgz]
4. Теперь запустите скрипт конфигурации:

 ./configure

5. После того, как он без ошибок закончит свою работу , введите

make && make install

для компиляции и установки файлов, относящихся к squid.

Обычно при установке из RPM-пакета файлы squid размещаются по директориям

/usr/bin
/etc
/etc/squid (возможно, использовалось в RH 5.0)
/var/squid/log/
[/usr/local/etc] -- может устанавливаться, как "симлинк" на /etc

Если же вы собрали squid из исходников, то файлы располагаются иначе: 4

/etc
/etc/squid (возможно, использовалось в RH 5.0)
/usr/local/bin
/var
[/usr/local/etc] -- может устанавливаться, как "симлинк" на /etc

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

Теперь, когда вы установили squid, давайте перейдём к следующему разделу, а именно, к его настройке.


Настройка

Итак, вы установили squid и слегка удивлены...."И это всё?" Если бы это было так, мой дорогой читатель. Увы нет....нам предстоит сделать ещё массу вещей, прежде чем в наших руках окажется старый добрый (и к тому же работающий) proxy-сервер.

Теперь наши усилия должны быть сосредоточены на /etc/squid.conf12. Этот файл содержит все настройки squid и, учитывая, что нам придётся его редактировать, советую сделать резервную копию. Хотя бы так

cp /etc/squid.conf /etc/squid.conf.orig

После чего запустить ваш любимый редактор и приступить к редактированию squid.conf

На самом деле, попытка использовать оригинальный файл /etc/squid.conf без внесения исправлений ни к чему хорошему не приведёт. Прежде чем у нас получится поднять и запустить proxy-сервер, в конфигурационном файле необходимо сделать множество изменений. На первый взгляд может показаться, что этот файл длиною в несколько миль. Но вашу задачу облегчат комментарии, которые вставлены везде, где только возможно.

Во-первых, нужно сообщить squid'у IP-адрес вашей машины и номер порта, на котором он будет "слушать" запросы. В squid.conf вы найдёте вот такую закомментированную строку:

#http_port 3128

Раскомментируйте её, удалив символ "решётки" (#). По умолчанию выбран порт 3128. Тем не менее, вы можете задать squid'у слушать другой порт!! На своей машине я указал такие параметры:

http_port 10.1.100.1:8080

Это заставляет squid "слушать" пакеты, приходящие на адрес 10.1.100.1, порт 8080. Прежде чем выбирать номер порта, убедитесь, что он не занят другим приложением. Это самая часто встречаемая ошибка при настройке squid.

Движемся дальше. В процессе настройки конфигурационного файла важной опцией является cache_mem. Она определяет количество оперативной памяти, которую может использовать proxy-сервер для кеширования.

Я просто раскомментировал эту строку и оставил значение по умолчанию -- 8 Мб.

Далее следуют опции, указывающие процент минимального и максимального уровня заполнения дискового кеша. При достижении уровня cache_swap_high, начинается ускоренный процесс удаления данных из кеша. Процесс прекращается при уровне заполнения cache_swap_low.

#cache_swap_low  90
#cache_swap_high 95

Я раскомментировал и изменил эти строки. Указанные мною значения были выбраны исходя из того, что в моём распоряжении был жесткий диск на 60 Гб:

cache_swap_low  97
cache_swap_high 98

Так....пока всё хорошо. Мы сообщили squid'у на каком порту и для какого адреса он должен слушать приходящие пакеты, сколько памяти он может использовать и какую долю объема дискового кеша (в процентах) он может занимать, прежде чем начнёт удалять старую информацию. Замечательно! Если вы внесли все изменения, о которых я говорил, то самое время сохранить их.

Следующая и предпоследняя опция, которую я менял, была одной из наиболее важных -- она определяла местоположение и размер подкаталогов дискового кеша. Настроил я её вот так:

cache_dir /var/squid/cache 100 16 256

Что о чём тут говорит? "/var/squid/cache" указывает на путь к дисковому кешу с максимальным размером в 100 Мб, содержащему 16 подкаталогов верхнего уровня, каждый из которых в свою очередь содержит 256 подкаталогов.

Последнее, что нужно "подкрутить" в этом файле, прежде чем переходить к настройке фильтров, это использование регистрационных журналов. Следующими за опциями настройки кеша (cache_dir) идут опции, описывающие расположение регистрационных журналов (логов). Как правило, squid пишет информацию в четыре журнала:

  • access log
  • cache log
  • store log
  • swap log

Каждый из журналов имеет в работе proxy-сервера своё собственное назначение. Обычно я "веду" только два из них -- access log и cache log (журналы доступа и использования кеша). По здравому размышлению, остальные мне просто не нужны. :-)

Журнал доступа (access log) регистрирует все запросы, которые делает пользователь (т.е. на какой сайт он хочет попасть, какой файл скачать и т.д.). Когда я учился в школе, мне было не очень интересно, кто и куда пытался попасть. Теперь же я рекомендую всем сисадминам включать эту опцию -- этот журнал очень важен.

Итак, я сделал следующее (раскомментировав TAGS):

cache_access_log /var/squid/logs/access.log
cache_log /var/squid/logs/cache.log

Рекомендую вам оставить пути к файлам журналов как есть.

Обычно я оставляю большинство опций в squid.conf закомментированными. Существует множество ключей, подходящих для различных ситуаций. Каждая опция хорошо (я бы сказал, избыточно) документирована, поэтому, если вы захотите выяснить, что она делает, то прочтите соответствующие комментарии в squid.conf.5


Фильтрация (контроль доступа)

В этом разделе мы продолжаем рассматривать "/etc/squid.conf" и я собираюсь подробнее остановиться на контроле доступа (access control).

Контроль доступа предоставляет системному администратору способ контролировать то, какие пользователи могут подключаться к proxy-серверу, через какие IP-адреса, порты и т.д. Такой контроль может быть удобен в больших сетях.

Обычно ACL (Access Control Lists -- списки контроля доступа) содержат следующие настройки:

  • src - Источник, т.е. IP-адрес клиента
  • dst - Пункт назначения, т.е. IP-адрес сервера
  • srcdomain - Источник, т.е. имя домена клиента
  • dstdomain - Пункт назначения, т.е. имя домена сервера
  • time - Время суток и день недели
  • url_regex - Шаблон (регулярное выражение) для поиска в URL
  • urlpath_regex - Шаблон (регулярное выражение) для поиска в пути, содержащемся в URL, исключая протокол и имя хоста
  • proxy_auth - Аутентификация пользователя посредством внешних процессов
  • maxconn - Максимальное количество соединений для конкретного IP-адреса клиента

Все правила контроля доступа имеют следующий формат:

acl   acl_config_name   type_of_acl_config values_passed_to_acl

В конфигурационном файле squid.conf найдите строку:

http_access deny all

После неё добавьте следующее:

acl weekendmechnetwork 10.1.100.1/255.255.255.0
http_access allow weekendmechnetwork

Вы можете изменить имя ACL-правила "weekendmechnetwork" на любое другое по вашему выбору. В нашем случае правило с именем "weekendmechnetwork" используется для определения IP-адреса 10.1.100.1 (proxy-сервер) с сетевой маской 255.255.255.0 Таким образом, "weekendmechnetwork" является именем, ассоциируемым с клиентом сети.

Строка "http_access allow weekendmechnetwork" говорит, что для клиента "weekendmechnetwork" разрешён доступ через http-протокол.

Следующее, что мы должны сделать -- разрешить доступ в Интернет определённым клиентам. Этот приём используется в случае, когда доступ к Интернет должны получить не все пользователи в сети, а только часть из них.

Кроме того, что мы уже добавили в squid.conf, мы можем добавить примерно следующее:

acl valid_clients src 192.168.1.2 192.168.1.3 192.168.1.4
http_access allow valid_clients
http_access deny !valid_clients

Эти правила разрешают клиентам "valid_clients" с указанными IP-адресами http-доступ (http_access allow valid_clients) и запрещают его для для клиентов, чей IP-адрес отличается от "valid_clients" (http_access deny !valid_clients).

Если вы хотите разрешить доступ в Интернет любой машине, то объявите следующее правило:

http_access allow all

В дальнейшем мы можем расширить список правил, говоря squid'у, какое из ACL-правил будет активно в определённое время. Например:

1.   acl clientA src 192.168.1.1
2.   acl clientB src 192.168.1.2
3.   acl clientC src 192.168.1.3
4.   acl morning time 08:00-12:00
5.   acl lunch time 12:30-13:30
6.   acl evening time 15:00-21:00
7.   http_access allow clientA morning
8.   http_access allow clientB evening
9.   http_access allow clientA lunch
10.  http_access allow clientC evening
11.  http_access deny all

[ ** N.B. При создании правил, не забудьте опустить номера строк. Я добавил их, чтобы сделать понятнее дальнейшие объяснения -- Thomas Adam ** ]

Строки 1-3 задают имена ACL-правил, которыми идентифицируются машины.
Строки 4-6 задают имена ACL-правил, обозначающих временные отрезки (24-часовой формат).
Строка 7 разрешает clientA (и только ему) доступ в "утренние" часы.
Строка 8 разрешает clientB (и только ему) доступ в "вечерние" часы.
Строка 9 разрешает clientA (и только ему) доступ в "обеденное" время.
Строка 10 разрешает clientC (и только ему) доступ в "вечерние" часы.
Строка 11 отвергает попытку соединения любого другого клиента, за исключением тех клиентов и правил для них, что описаны выше.

Но мы можем применять ACL-правила, запрещая доступ к URL, соответствующим заданным регулярным выражениям. Хорошо "зашвырнуть" такие запросы в корзину для мусора или, что более корректно, в "&>/dev/null" :-)

Чтобы сделать это, мы можем определить новые именованные ACL-правила, содержащие регулярные выражения. Например:

1.  acl naughty_sites url_regex -i sex
2.  http_access deny naughty_sites
3.  http_access allow valid_clients
4.  http_access deny all
[ ** И опять напоминаю -- не используйте номера строк!! ** ]

Строка 1 настраивает связь между словом "sex" и ACL-правилом под именем "naughty_sites""; ключ url_regex указывает на тип правила, т.е. оно проверяет совпадение между шаблоном и URL. Ключ -i устанавливает режим поиска без учёта регистра.
Строка 2 запрещает доступ всем клиентам к web-сайту, чьё имя совпадает с шаблоном, описанным в "naughty_sites"
Строка 3 разрешает доступ клиентам "valid_clients".
Строка 4 блокирует все остальные запросы.

Хммм... Думаю, вы задаёте себе вопрос...."как определить несколько регулярных выражений?" Что ж, ответ прост....вы можете их разместить в отдельном файле. Предположим, вы хотите фильтровать слова

sex
porn
teen

и блокировать доступ к тем URL, в которых они встречаются. Вы можете добавить их в файл (каждое слово на отдельной строке), назовём его:

/etc/squid/bad_words.regex

Теперь в "/etc/squid.conf" укажите следующее:

acl bad-sites url_regex -i "/etc/squid/bad_words.regex"
http_access deny bad_sites
http_access allow valid_clients
http-access deny all

Это делает нашу жизнь намного проще! :-) В случае необходимости вы сможете добавлять в этот файл новые слова.

Существует более простой способ фильтрации с использованием регулярных выражений и доменных имён -- это программа SquidGuard. Но об этом чуть позже.....


Инициализация Squid

Теперь мы переходим к более важной части -- запуску squid. К сожалению, если вы впервые столкнулись со squid, то вам придётся "перелопатить" несколько опций, используемых при его запуске.

Большая часть ключей, как правило используемых при запуске squid, представлена в таблице.

Флаг Описание
-z Ключ заставляет создать swap-директории, необходимые для squid. Используется только в том случае, если squid запущен впервые или ваши кеш-директории были удалены.
-f Эта опция позволяет вместо "/etc/squid.conf" использовать альтернативный конфигурационный файл. Однако, эта опция используется не часто.
-k reconfigure Этот ключ говорит squid перегрузить конфигурационный файл, без остановки демона squid.
-k rotate Эта опция заставляет squid произвести ротацию журналов -- старые записи удаляются и журналы начинаются заново. Как правило, этот ключ используется при запуске squid через cron.
-k shutdown Остановить выполнение squid.
-k check Проверить запущен ли демон squid.
-k parse То же, что и "-k reconfigure".

А это полный список существующих ключей:

Usage: squid [-dhsvzCDFNRVYX] [-f config-file] [-[au] port] [-k signal]
       -a port   Установить номер HTTP-порта (по умолчанию: 3128).
       -d level  Записывать отладочную информацию в stderr.
       -f file   Использовать конфигурационный файл, вместо
                 /etc/squid.conf
       -h        Напечатать справочное сообщение.
       -k reconfigure|rotate|shutdown|interrupt|kill|debug|check|parse
                 "Парсить" конфигурационный файл, затем послать сигнал
                 запущенной копии (исключая -k parse) и выйти.
       -s        Включить запись в syslog.
       -u port   Определить номер ICP-порта (по умолчанию: 3130), 0 - отключить.
       -v        Показать номер версии.
       -z        Создать swap-директории
       -C        Не обрабатывать критические сигналы (fatal signals).
       -D        Отключить начальные тесты DNS.
       -F        Заново загрузить все мета-данные прежде, чем приступить к выполнению запросов.
       -N        Запустить squid в не-демон режиме.
       -R        Не устанавливать REUSEADDR на порт.
       -V        Виртуальный хост httpd-акселератор.
       -X        Включить отладочный режим.
       -Y        Возвращать  только UDP_HIT или UDP_MISS_NOFETCH при быстрой перезагрузке.

Если вы запускаете squid первый раз, то запустите его под правами root'а с ключом "-z":

squid -z

Это создаёт кеш на диске.

Теперь вы можете выполнить команду:

squid

Вот и всё!! Теперь в вашем распоряжении находится работающий proxy-сервер.


Примечания переводчика

[Если у вас возникнет вопрос: "А почему ссылки не по порядку?", отвечу: "Вам шашечки или чтобы ехать?" ;-)]

1 Перевод Р.Гальпериной, сборник рассказов Эдгара Аллана По, Москва, 1980, "Художественная литература".

3 Для rpm-совместимых дистрибутивов:

rpm -ivh полное_имя_пакета_squid

Для обладателей ALT Linux Master 2.0 или/и Debian:

apt-get install squid

2 LWM -- Linux Weekend Mechanic.

4 Для этого достаточно "поиграть" с настройками конфигурационного скрипта configure (--prefix, --exec-prefix и т.п.).

5 Если вы с английским на "ты" или хотя бы на "вы".

11 Хм... Проще будет воспользоваться командой:

rpm -q squid

12 Либо /etc/squid/squid.conf


Обсудить данную тему на нашем форуме "Все о Linux"