Squid + Sarg

Squid — программный пакет, реализующий функцию кеширующего прокси-сервера для протоколов HTTP, FTP, Gopher и (в случае соответствующих настроек) HTTPS. Разработан сообществом как программа с открытым исходным кодом (распространяется в соответствии с GNU GPL). Все запросы выполняет как один неблокируемый процесс ввода/вывода. Используется в UNIX-системах и в ОС семейства Windows NT. Имеет возможность взаимодействия с Active Directory Windows Server путём аутентификации через LDAP, что позволяет использовать разграничения доступа к интернет ресурсам пользователей, которые имеют учётные записи на Windows Server, также позволяет организовать «нарезку» интернет трафика для различных пользователей.

Sarg (Squid Analysis Report Generator) — генератор отчетов на основании анализа лог-файла прокси сервера Squid. Отчеты позволяют выяснить какой пользователь в какое время обращался к какому сайту.Суммарный отчет может оказать большую помощь в тарификации работающих через Squid пользователей, так как включает в себя суммарный трафик и число коннектов для каждого пользователя за определенный период времени.

Установка и настройка Squid

Существует две версии Squid — 2.x и 3.x. Последняя бета версия — 3.1. Мы будем ставить третью ветку прокси-сервера. На момент написания статьи, стабильной версией была 3.0.STABLE15.

# cd /usr/ports/www/squid30/
# make install clean

Пока искал описания всех опций на английском, понял, что если опция не будет использована в течении месяца, то ставить ее нет смысла, т.к. если я правильно понял, то часть опций, начиная с релиза 3.1 будут активироваться в конфиге (например SQUID_PINGER). По этому, я не стал отмечать те опции, которые не планирую использовать после начальной конфигурации. Иными словами, мне нужен простой кеширующий прокси сервер.

В опциях установки я выбрал SQUID_SSL, SQUID_IDENT, SQUID_PF, SQUID_KQUEUE.

Все конфигурационные файлы squid находятся в папке /usr/local/etc/squid/
Директория с кешем: /usr/local/squid/cache/
Логи пишутся в /usr/local/squid/logs/

Добавляем следующую строчку в /etc/rc.conf:

squid_enable="YES"

Перед началом работы, надо инициализировать директории с кешем. Делается это командой:

# squid -z

Команду надо выполнять от пользователя root или squid. И выполнять ее надо после того, как вы создали готовый конфигурационный файл, а то могут выдаваться ошибки.

По умолчанию, конфигурация Squid будет запрещать всем доступ к proxy-серверу. Чтобы это изменить, надо отредактировать параметры http_access в файле /usr/local/etc/squid/squid.conf.

Документация рекомендует перед началом работы всегда проверять конфигурационный файл на наличие ошибок командой:

# squid -f /usr/local/etc/squid/squid.conf -k parse

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

В конфигурационном файле предусмотрено использование директивы include для подключения дополнительных конфигурационных файлов, например:

include /путь/до/файла/конфигурации/squid.acl.config

Следует учитывать, что количество уровней include ограничено 16. Сделано это для того, чтобы предотвратить «петли», когда Squid бесконечно включал файлы конфигурации, указанные в других файлах.

Моя конфигурация будет актуально для сетей, где Squid в связке с PF используется в качестве прозрачного прокси-сервера (transparent proxy). Весь доступ будет открыт из внутренней локальной сети и закрыт всем извне. По этому, никакие параметры авторизации использоваться не будут. Так же, т.к. это прозрачные прокси-сервер, то надо перенаправлять все запросы через PF на порт 3128.

Так же, надо помнить, что по умолчанию Squid принимает запросы на порте 3128.

Теперь, когда покончено с небольшой теоретической частью, пора приступать к конфигурационной части. В целях экономии места, здесь я буду указывать лишь те параметры, которые я менял, и те параметры, на которые стоит обратить внимание. Итак, приступим. Файл конфигурации:

# закомментировал следующие строчки, т.к. этих подсетей у меня нет
#acl localnet src 10.0.0.0/8
#acl localnet src 172.16.0.0/12

# так же, закомментировал неиспользуемые порты и добавил нужные
# я не знаю на сколько это верно, может правильнее было бы их оставить
acl WEBMIN_ports port 10000
acl Safe_ports port 8080        # www
acl Safe_ports port 10000       # webmin
#acl Safe_ports port 70         # gopher (сетевой протокол распределенного поиска и передачи документов)
#acl Safe_ports port 210        # wais (сетевая информационная поисковая система)
#acl Safe_ports port 1025-65535 # незарегистрированные порты
#acl Safe_ports port 280        # http-mgmt
#acl Safe_ports port 488        # gss-http
#acl Safe_ports port 591        # filemaker (кросс-платформенные реляционные базы данных)
#acl Safe_ports port 777        # multiling http (какой-то доисторический протокол, о котором никто ничего не знает)

# если это не указать, то нельзя будет покдлючиться к Webmin через адрес https://webmin_address:10000
http_access allow CONNECT WEBMIN_ports

# раскомментируем следующую строку... она отвечает за то, чтобы на прокси-сервере не осуществлялся доступ
# к http://localhost через сам прокси-сервер
# это рекомендуем параметр, но не обязательный
http_access deny to_localhost

# т.к. это у нас будет прозрачный прокси-сервер, то надо изменить значение по умолчанию на следующее
# а еще я добавляю ip-адрес на котором принимать запросы, т.к. в компьютере две сетевые карты
http_port 192.168.0.10:3128 transparent

# сколько памяти могут занимать процессы Squid; по умолчанию 8 Мб, но в версии 3.1
# этот параметр будет увеличен до 256 Мб - увеличим и мы
cache_mem 256 MB

# максимальный размер объектов в памяти... опять же, в версии 3.1 этот параметр будет увеличен
# с 8 кб до 512 кб; делаем так же
maximum_object_size_in_memory 512 KB

# указываем директорию с кешем. параметр имеет вид:
# cache_dir ufs Directory-Name Mbytes L1 L2 [options], где
# Directory-Name - это сама директория
# Mbytes - количество мегабайт, которые выделены для директории (я выделяю 2 гига)
# L1 - количество директорий, которое может быть создано в папке с кешем (по умолчанию 16)
# L2 - количество поддиректорий, которое может быть в каждой директории (по умолчанию 256)
cache_dir ufs /usr/local/squid/cache 2048 256 512

# параметр я не трогал, но хочу сделать небольшое пояснение по нему
# максимальный размер объектов, который будет сохранен в кеш
# если вы хотите сэкономить траффик, то стоит увеличить этот параметр
# если хотите производительность - понизить
# maximum_object_size 4096 KB

# если свободное место в директории с кешем израсходовано на 90% (cache_swap_low), то
# начинается постепенная утилизация (замещение) сохраненных объектов
# когда процент занятого пространства достигает отметки 95% (cache_swap_high), утилизация
# происходит более "агрессивно"
# так же стоит учитывать, то если под кеш директорию выделено много пространства, то разница
# между 90% и 95% может быть сотни мегабайт... стоит задуматься о уменьшении разницы между
# этими параметрами
# cache_swap_low 90
# cache_swap_high 95

# этот лог отвечает за то какие объекты удаляются из кеша, какие сохраняются и на сколько
# т.к. нет утилит для создания отчетов по этим данным, то их можно смело отключить
cache_store_log none

# указываем какую часть ip-адреса клиента указывать в логе. по умолчанию указывается весь адрес.
# но если, например, указать значени  255.255.255.0, то в логе будут отображены три первые октета
# ip-адреса. т.е. если клиент (192.168.0.15 делает запрос), то в логе будет отображено - 192.168.0.0
# я не менял параметр, т.к. хитрый и хочу знать кто куда ходит
# client_netmask 255.255.255.255

# закомментируем это, т.к. не используем этот протокол
#refresh_pattern ^gopher:   1440   0%   1440

# e-mail человека, который отвечает за кеш. сюда будет выслано письмо, если с кешем что-то случится
cache_mgr av3nger

# имя сервера
visible_hostname имя_компьютера

# не используем это
#icp_port 3130

# в самом низу конфига есть раздел DNS OPTIONS. можно с ним еще поиграться, если нужна большая "стандартизация"

И вот теперь стоит инициализировать директории с кешем. Чтобы его сделать «прозрачным», надо в конфигурационный файл Packet Filter /etc/pf.conf добавить следующую строчку:

rdr on $int_if proto tcp from $int_if:network to !(self) port 80 -> ip_адрес_прокси_сервера port 3128

Напоминаю, что пример настройки PF можно посмотреть тут.

Проблемы, с которыми я столкнулся

1. При переадресации заменяется ip-адрес отправителя, адресом сервера. Т.е. например, если я (192.168.0.3) пытаюсь через прокси подключиться к 192.168.0.10:8080 (веб сервер), но при этом, на веб-сервере стоит ограничение на подключение только с IP 192.168.0.3, то подключение НЕ произойдет. Т.к. в логах будет написано, что подключение шло с адреса 192.168.0.10. Способа решения два. Первый — это заморачиваться с NAT, второй — просто поправить конфиг Apache. Ведь прокси сервер все равно запрещен для пользования из вне. Мы лишь теряем защиту сайта в локальной сети. Что, конечно же, не очень хорошо, но терпимо.

Установка и настройка Sarg

Сразу приступим к установке:

# cd /usr/ports/www/sarg/
# make install clean

Единственная доступная опция установки — GD. Отмечаем ее. GD — это графическая библиотека, скорее всего отвечает за отображение красивых графиков. Если выскочет окошко, где надо будет выбрать опции установки для GD, то не надо ничего выбирать.

Все конфигурационные файлы лежат в /usr/local/etc/sarg/. Нам нужен файл sarg.conf, открываем его в любом редакторе и приводим примерно вот к такому виду:

# язык (из русских есть еще Russian_windows1251 и Russian_UTF-8)
language Russian_koi8

# указываем, где лежат логи Squid
access_log /usr/local/squid/logs/access.log

# используем графики, где это возможно
graphs yes

# указываем название страниц
title "Статистика использования Squid"

# директория для временных файлов
temporary_dir /tmp

# куда кидать отчеты (у меня так)
output_dir /usr/local/www/secure/squid-reports

# если хочется, чтобы репорты приходили вам на почту, то можно воспользоваться следующим параметром
# при этом, отчеты в папку, указанную вышу, сохраняться не будут
# output_email ваш_email

# преобразовываем ip в адрес
resolve_ip yes

# по какому полю и как сортируем отчеты для страницы с топовыми пользователями
# поля бывают USER, CONNECT, BYTES и TIME
# способы сортировки - normal и reverse
topuser_sort_field BYTES reverse

# тоже самое, но для страницы пользователи
user_sort_field BYTES reverse

# европейский формат дат
date_format e

# удаляем временные файлы
remove_temp_files yes

# генерируем файл index.html
index yes

# если папка с отчетом уже создана, то мы ее перезаписываем
overwrite_report yes

# удаляем из отчета записи, содержащие следующие коды (400, 404 и т.д.)
# кода надо вписать в указанный файл
exclude_codes /usr/local/etc/sarg/exclude_codes

# я раскомментировал следующую строчку, чтобы получить все отчеты
# строчку полностью не привожу, т.к. она длинновата
report_type ...

# в следующем файле мы указываем пары ip-адрес - пользователь
# формат следующий: 192.168.0.1 Василий Пупкин
# в конце обязательно должны быть символы конца строки (иными словами - надо нажать Enter)
usertab /usr/local/etc/sarg/users

# кодировка создаваемых отчетов
charset Koi8-r

# убираем лого; оно только мешается
show_sarg_logo no

# заменяем байты на более понятные величины (кб и мб)
displayed_values abbreviation

Все! Теперь, чтобы сгенерировать отчеты, надо лишь выполнить команду:

# sarg

Чтобы постоянно не выполнять эту команду, можно добавить следующую запись в crontab. Sarg будет запускаться каждый день в полночь.

@daily /usr/local/bin/sarg

Полезные ссылки

1. Официальный сайт Squid (на английском)
2. Подробная документация всех опций конфигурационного файла (на английском)
3. Официальный сайт Sarg (опять же, на английском)

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

Ваш адрес email не будет опубликован.