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