Заметки ИТ-шника

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 (опять же, на английском)