Линуксоидам: Республика Squid

 | 14.06

Мой Компьютер, №15, 07.04.2008

Все описанные действия будем производить в Ubuntu 6.06 Server LTS… и пару слов посвятим FreeBSD 6.3, так как этот вариант предполагает долгосрочную поддержку (до лета 2011 года). Кроме GNU/Linux есть версии Squid для: *BSD, MacOS X, SunOS/Solaris, Windows и некоторых других систем. За вычетом некоторых особенностей установки Squid в конкретном решении, все сказанное будет действительно и для них.

В Ubuntu есть еще один момент, о котором необходимо помнить. Так, в репозитарии Dapper Drake находится пакет с версией Squid 2.5, в последнем Gutsy Gibbon — 2.6.14. Но начиная с Festy Fawn (7.04) в репозитарии доступны пакеты с третьей версией Squid. Во всех вариантах — 2.5, 2.6 и 3.0 — есть небольшие изменения в отдельных параметрах конфигурационных файлов, поэтому следует быть внимательным. Но все описанное в статье будет работать в любой версии.

Установка Squid

Нужные пакеты, в том числе и сопутствующих приложений, можно найти, введя команду:

sudo apt-cache search squid

Установка второй версии Squid в Ubuntu стандартна:

$ sudo apt-get install squid

Или для Squid 3:

$ sudo apt-get install squid3

В портах FreeBSD также присутствуют обе версии. Для установки 2.6.x (2.6.18) вводим:

# cd /usr/ports/www/squid

Или для 3.0:

# cd /usr/ports/www/squid30

И далее:

# make install

После инсталляции Squid будет запущен с установками по умолчанию. Просмотреть их можно, введя:

$ sudo grep -v «^#» /etc/squid/squid.conf | sed -e ‘/^$/d’

В FreeBSD конфигурационный файл squid.conf находится в каталоге /usr/local/etc/squid/.

Если невозможно получить правильное имя компьютера, то в процессе первого запуска появляется ошибка:

FATAL: Could not determine fully qualified hostname. Please set ‘visible_hostname’

В выводе присутствует и подсказка — необходимо установить значение переменной ‘visible_hostname’.

Настраиваем запуск

Формат squid.conf стандартен для Unix, каждая запись состоит из строк вида:

параметр значение

Cтроки, начинающиеся со знака решетки, являются комментариями. Для удобства настройки все параметры разбиты по секциям, хоть, в принципе, можно прописывать свои параметры в любом месте файла, лишь бы затем было понятно. Но следует помнить — установки применяются в порядке очередности. Для начала запустим Squid, устранив ошибку, указанную выше. Заносим в этот файл строку с именем сервера Squid (оно не обязательно должно совпадать с DNS):

visible_hostname mysquidserver

В Ubuntu уже все готово, запускаем:

$ sudo /etc/init.d/squid start

После перезагрузки в настройках по умолчанию Squid будет стартовать автоматически, ничего больше делать не нужно.

Настройка сервера во FreeBSD имеет особенности. Вначале необходимо для автоматического старта добавить в /etc/rc.conf строку “squid_enable=YES”. Теперь создаем swap-каталог:

# /usr/local/sbin/squid -z

И запускаем Squid:

# /usr/local/sbin/squid -D

Еще один важный момент. После всех изменений в конфигурационных файлах необходимо, чтобы Squid его перечитал. Для этого в Ubuntu используем команду:

$ sudo /etc/init.d/squid restart

А во FreeBSD:

# /usr/local/sbin/squid –k reconfigure

Теперь можно переходить к другим настройкам.

Настройки рабочего порта

В настройках по умолчанию Сквид принимает входящие сообщения на 3128 порту всех сетевых интерфейсов компьютера. Проверить, слушается ли этот порт, можно, введя команду:

“netstat –ant | grep 3128”.

Пользователи вначале должны настроить соответствующим образом web-браузер. Для Firefox открываем Настройки, переходим в Основные, нажимаем кнопку Параметры соединения, устанавливаем флажок Настройка прокси вручную и заполняем поля.

Чтобы не перестраивать клиентские системы, можно использовать iptables, например так:

iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp —dport 80 -j DNAT —to-destination 192.168.0.1:3128

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp —dport 80 -j REDIRECT —to-ports 3128

Во FreeBSD при помощи PF заносим в /etc/pf.conf следующие строки:

rdr on $int_if inet proto {tcp, udp} from $int_net to any port $www_port -> 192.168.0.1 port 3128

nat on $ext_if from $int_net to any -> ($ext_if)

Здесь $int_if — имя сетевого интерфейса локальной сети, $int_net — адрес локальной сети (в нашем случае это будет 192.168.0.0/24),

Если порт 3128 уже занят, можно использовать любой другой свободный. Для этого следует его указать в файле squid.conf в параметре http_port, не забыв изменить правила пакетного фильтра.

http_port 8080 transparent

Можно ограничить подключение к Squid только по конкретному адресу (интерфейсу):

http_port 192.168.0.1:3128 transparent

Но параметр transparent будет работать только в 2.6 и 3.0, версия 2.5 его не поддерживает. Для проверки правильности введенных параметров используейте “sudo squid –k parse”.

$ sudo squid -k parse

FATAL: Bungled squid.conf line 53: http_port 192.168.0.1:3128 transparent

Squid Cache (Version 2.5.STABLE12): Terminated abnormally.

Настраиваем acl

В настройках по умолчанию разрешена работа через Squid только с локального адреса (localhost). При попытке подключиться с другого компьютера в сети получаем Access Denied. Чтобы в Интернет могли попасть остальные пользователи сети, нужно установить разрешения, используя связку ACL/http_access. По умолчанию интересующие нас правила в секции “ACCESS CONTROL”выглядят так:

acl all src 0.0.0.0/0.0.0.0

acl localhost src 127.0.0.1/255.255.255.255

http_access allow localhost

http_access deny all

Вторая строка — all и localhost — это название нового списка доступа. Третья строка — тип списка доступа. В нашем случае использован src (от «source»). При помощи других параметров можно указать внешний адрес (dst), МАС-адрес (arp), доменное имя (srcdomain, dstdomain), порт (port), протокол (proto), время (time) и многие другие.

Чтобы разрешить всем пользователям сети 192.168.0.0 подключаться к Squid, добавляем описание нового списка доступа:

acl localnet src 192.168.0.0/24

Если нужно настроить доступ не для всей сети, а для отдельных ее узлов, проще записать их адреса в файл (по одному в строке), который и указать в качестве последнего параметра:

acl localip src “/etc/squid/ip”

Можно в ACL указывать и время. Например, чтобы указать рабочее время, используем такую конструкцию:

acl work_hours time M T W T F 9:00-18:00

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

acl SSL_ports port 443 563 873

acl Safe_ports port 80 21 443 563 1025-65535

Следует внимательно просмотреть весь список и закомментировать строки с портами ненужных или неиспользуемых сервисов.

Настройка доступа

Когда списки составлены, самое время раздать всем по заслугам при помощи параметра http_access. Общий формат вызова такой:

http_access allow|deny [!] название_ACL

Восклицательный знак инвертирует значение списка — «все кроме». В самом конце списка должно стоять правило:

http_access deny all

То есть все соединения, которые явно не будут разрешены, блокируются. Чтобы разрешить подключение к Squid с указанных адресов и работу только с нужными портами, пишем:

http_access allow localnet

http_access deny !Safe_ports

http_access deny !SSL_ports

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

http_access allow work_hours localnet

http_access deny localnet

Первая строка разрешит доступ при совпадении двух ACL: рабочее время и IP-адрес. Вторая запретит доступ всех записанных в ACL workip при несовпадении с первым правилом, то есть в другой временной промежуток.

Используя связку ACL/http_access, можно блокировать доступ к определенным ресурсам и резать баннеры, но об этом в следующий раз. Чтобы картина была полной, разберем настройку кэша.

Настройки кэша

Squid полезен еще и тем, что при повторном запросе ресурса он берет информацию из своего кэша, а не с сайта. Тем самым позволяя разгрузить канал и увеличить скорость доступа, ведь из кэша файл или страница отдается мгновенно. При большом количестве пользователей экономия трафика может быть приличной. Кэш находится в каталоге, на который указывает переменная cache_dir. В Ubuntu это /var/spool/squid, во FreeBSD — /usr/local/squid/cache. В других дистрибутивах может быть иначе. Формат переменной такой:

cache_dir type путь размер L1 L2 [options]

Например, во FreeBSD:

cache_dir ufs /usr/local/squid/cache 100 16 256

Поле type определяет формат кэша: ufs («unix file system»), aufs и diskd. Его можно не трогать. Максимальный размер, после которого кэш будет очищаться, установлен в 100 Мб. В больших сетях этого мало, поэтому есть смысл увеличить его до нескольких гигабайт. Кстати, можно указать несколько cache_dir, расположив кэш на разных дисках, что положительно сказывается на производительности. В Squid каждый кэшируемый объект располагается в отдельном файле, сами файлы не сваливаются в одно место, а используется двухуровневая иерархия каталогов. Количество каталогов 1 и 2 уровней определяют параметры L1 и L2. По умолчанию их значения — 16 и 256 соответственно. Дополнительно для каждого cache_dir можно определить параметр read-only (только чтение) и max-size (максимальный размер объекта).

Глобально максимальный размер объекта в кэше определяется переменной maximum_object_size, значение по умолчанию которой 4 Мб, имеет смысл его увеличить:

maximum_object_size 10240 Kб.

Объем оперативной памяти, используемый Squid для хранения обрабатываемых объектов, определяется параметром cache_mem (по умолчанию 8 Мб). Оставшееся пространство может быть использовано для хранения часто используемых и других объектов. Объемы современных ОЗУ позволяют использовать больший размер cache_mem, иначе Squid будет сбрасывать информацию на диск.

Отключенный по умолчанию параметр reload_into_ims разрешает игнорировать nocache или reload и выдавать объект из кэша. Это нарушение стандарта HTTP, и есть определенный риск при его использовании, но большинство серверов умеют корректно обработать такой запрос, потому:

reload_into_ims on

Хотя можно вместо глобальной установки установить параметры кэширования для конкретных типов файлов в refresh_pattern. В общем, шаблон записи выглядит так:

refresh_pattern [-i] regex min percent max [options]

В regex пишем регулярное выражение, которому будет отвечать правило; проверка производится до первого совпадения.

Поэтому последним всегда устанавливается «.», то есть правило для всех объектов. Параметр min и max указывают соответственно на минимальное и максимальное время в минутах, в течение которого объект считается новым. В percent указывается процент от времени последней модификации объекта, в течение которого объект считается новым. В min рекомендуется устанавливать 0, чтобы корректно работать с динамически обновляемыми страницами. В версии Squid 3.0 по умолчанию используются инструкции:

refresh_pattern ^ftp:    1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|?) 0 0% 0

refresh_pattern .    0 20% 4320

В версии 2.6 третье правило отсутствует. В поле options через пробел указываются дополнительные параметры. В версии 2.x таких параметров семь, в 3.х добавилось еще два. Большинство из них противоречит стандартам HTTP, и их использование может вызвать проблемы при работе с некоторыми серверами.

В самом простом случае вместо правил по умолчанию можно написать одно правило, заставляющее принудительно кэшировать объекты на целый год:

refresh_pattern .   518400 80% 518400 override-expire override-lastmod reload-into-ims ignore-no-cache ignore-private ignore-auth ignore-no-store

И устанавливаем размер кэша побольше. Это даст весьма ощутимую экономию трафика. Не всегда такой подход приемлем, да и кэш старыми файлами заполнится быстро. Лучше установить свои варианты кэширования, для разных типов файлов. Например, укажем для некоторых файлов время хранения — в течение месяца:

refresh_pattern .exe$   43200 100% 43200 override-expire override-lastmod reload-into-ims ignore-no-cache ignore-private ignore-auth ignore-no-store

refresh_pattern .zip$   43200 100% 43200 override-expire override-lastmod reload-into-ims ignore-no-cache ignore-private ignore-auth ignore-no-store

И так далее. Таким же образом «вырезают» рекламу. Так как создавать универсальное правило для ACL/http_access тяжело и всегда можно допустить ошибку, рекламу админу проще кэшировать, чем запрещать. Например, так:

refresh_pattern http://ad. 43200 100% 43200 override-expire override-lastmod reload-into-ims ignore-no-cache ignore-private ignore-auth ignore-no-store

Это самый простой способ. Запускаем во FreeBSD:

# tail -f /usr/local/squid/logs/access.log

Или в Ubuntu:

$ sudo tail -f /var/log/squid/access.log

И составляем коллекцию адресов, которые нужно поместить в вечный кэш. Но есть и другие способы.

Мы рассмотрели лишь самые простые настройки Squid. Базовая настройка занимает совсем немного времени, после чего пользователи будут наслаждаться скоростью Интернета, а руководство — использованием трафика. Если ручная настройка не кажется удобной, то обратитесь к Webmin, в котором большинство установок можно произвести в удобной наглядной форме.

Linux forever!

Сергей «grinder» ЯРЕМЧУК

Robo User
Web-droid editor

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *