Павел Малахов
Ведём статистику прокси-сервера Squid
Журнальные файлы прокси-сервера Squid даже для небольших предприятий могут быть очень объёмны. Разбирать их вручную малоэффективно, а вести статистику или учёт просто невозможно. Для этого существуют вспомогательные программы.
Рано или поздно мы (системные администраторы) хотим (или нас заставляют) установить контроль над использованием интернет-трафика. У меня пользователи периодически недоумённо осведомляются, на что истратилась их квота. Чаще всего они не глядя скачали какое-нибудь обновление, но бывают случаи, от них не зависящие. Например, не отвечал сервер mail.ru, а его агенты, пытаясь установить с ним связь, «съедали» у некоторых пользователей большую часть их скромной квоты. Приходилось несколько раз сталкиваться со злонамеренными самообновляющимися страницами. Ясность частично можно внести и штатными средствами, используя команды cat и grep. Например, сделать выборку из журнала для конкретного IP-адреса командой:
# cat /var/log/squid/access.log | grep 10.0.0.15 > /tmp/10.0.0.15.txt
а затем перенести файл на компьютер, где есть MS Excel, и там его просматривать. Так я и делал, пока не потребовалось проводить более серьёзный анализ и вести статистику.
Подготовительные работы
Ради универсальности процедуры установки программ под разные операционные системы (семейства UNIX) будем устанавливать их из исходных кодов. На сайтах программ указано, где можно взять уже собранные пакеты для определённых ОС. По возможности лучше использовать их, так как в этом случае пакет регистрируется в системе, что при автоматическом обновлении ОС позволит получить подробную информацию об установленном пакете, соблюдать зависимости при установке новых пакетов и в других случаях. Примите во внимание, что при установке собранного пакета пути к файлам могут отличаться от указанных в статье. Для просмотра отчётов через веб-интерфейс нам понадобится веб-сервер. Отчёты будем хранить в каталоге /var/www/html/reports.
Calamaris и LightSquid написаны на Perl, поэтому он должен уже стоять в системе. Автор Calamaris рекомендует ставить самую последнюю версию, хотя и упоминает, что некоторые пользователи успешно использовали его программу на Perl 5.001. Требования к Perl для LightSquid не приводятся, так что от себя скажу, что на версии 5.8.7 всё работает отлично.
Squid (www.squid-cache.org), конечно, уже должен быть установлен, вести журнал в родном формате (что определяется в squid.conf опцией emulate_httpd_log off) и проводить ежедневную ротацию журналов, не сжимая архивы. Последнюю задачу лучше поручить программе logrotate, указав в файле /etc/logrotate.d/squid следующее:
/var/log/squid/access.log {
daily
rotate 6
copytruncate
nocompress
notifempty
missingok
}
… # далее описана ротация cache.log и store.log
а Squid освободить от этой обязанности, указав опцию logfile_rotate 0.
Sarg
Sarg (Squid Analysis Report Generator – генератор аналитических отчётов Squid) доступен на нескольких языках, на русском – в трёх кодировках: koi-8, UTF-8, windows-1251.
- Сайт – sarg.sourceforge.net.
- Стабильная версия – 2.2.1.
- Объём – 376 Кб.
- «Понимает» журналы – Squid, Microsoft ISA, Novell Border Manager.
Собираем стандартным способом:
# ./configure
Если вы используете Linux и хотите размещать конфигурационные файлы в /etc/sarg (по умолчанию /usr/local/sarg), в этом случае укажите соответствующую опцию:
# ./configure --enable-sysconfdir='/etc/sarg'
# make
# make install
Создаём каталог, где будем хранить отчёты:
# mkdir -p /var/www/html/reports/
В /etc/sarg/sarg.conf устанавливаем параметры:
language Russian_koi8
access_log /var/log/squid/access.log.1 # вчерашний журнал
title "Squid report for proxy1"
output_dir /var/www/html/reports/sarg
date_format e
charset Koi8-r
www_document_root /var/www/html
Опцией date_format мы определяем, как будет выглядеть имя выходного файла, который состоит из форматированной даты. Возможные варианты значения этой опции:
- e – dd/mm/yyyy – европейский формат даты;
- u – mm/dd/yyyy – американский формат даты (предлагается по умолчанию);
- w – yyyy.ww – год и номер недели в году.
Все необходимые настройки сделаны, запускаем:
# sarg
SARG: Records in file: 19329, reading: 100.00%
SARG: Отчет успешно сгенерирован в: /var/www/html/reports/sarg/04Jun2006-06Jun2006
|
Видим, что всё прошло успешно. Теперь отчёт можно посмотреть в браузере. Ещё несколько параметров, которые могут понадобиться:
# оставить в отчёте только нескольких пользователей
include_users "petrov:ivanov:secretar"
# не учитывать записи журнала, содержащие подстроки
exclude_string "подстрока1:подстрока2"
# не учитывать обращения к перечисленным доменам
exclude_hosts /etc/sarg/hosts.txt
# сколько файлов отчётов нужно хранить в директории, самый старый убирается
lastlog 30
# создавать отчёт только для указанных дней недели, воскресенью соответствует 0
weekdays 1-5
#создавать отчёт только для определённых часов
hours 8-18
Можно отправлять отчёт по почте. Правда, в этом случае не будет формироваться html-файл.
В параметре report_type можно указать, какие отчёты нас интересуют. Sarg предоставляет следующие:
- topsites – отображает название сайта, количество подключений к нему, количество взятых с него байт и общее время соединений;
- sites_users – отображает список всех посещённых сайтов и какие пользователи на них заходили;
- users_sites – отображает список сайтов, на которые заходил пользователь, количество подключений к каждому и скаченный объём (рис. 1);
- date_time – отображает таблицу интенсивности использования прокси-сервера пользователем в часах и днях (рис. 2);
- denied – отображает список сайтов, в доступе к которым было отказано;
- auth_failures – отображает ошибки аутентификации;
- site_user_time_date – отображает для каждого пользователя дату и время всех обращений к сайту;
- downloads – отображает отчёт по загрузкам (download). Какие файлы отнести к этой категории, определяем в параметре donwload_suffix. Например, можно указать расширения аудио-файлов и узнать, кто, когда и откуда скачивал музыку.
Рисунок 1. Список сайтов, которые посетил пользователь
Рисунок 2. Активность пользователя в Интернете
Sarg также может обрабатывать журналы DansGuardian и SquidGuard – сторонних программ, написанных для Squid и ограничивающих доступ к сайтам на основании различных правил (по URL, по содержимому сайта и т. д.).
Calamaris 3
Переводится с английского так же, как и Squid, – кальмар, головоногий моллюск.
- Сайт – www.Calamaris.Cord.de.
- Стабильная версия – 2.59.
- Объём – 100 Кб.
- «Понимает» журналы – Squid, NetCache, Inktomi Traffic Server, Oops! proxy server, Compaq Tasksmart, Novell Internet Caching System, Netscape/iPlanet/SunONE Web Proxy Server, Cisco Content Engines.
Если не нужны графики, то достаточно одного скрипта. Распаковываем:
# tar -xzvf /path/to/calamaris-2.59.tgz
Если же хочется увидеть результаты ещё и в графиках, то нужно устанавливать бета-версию 2.99.4.0 (сбоев не замечено) и доустановить библиотеки и модули. Подробную инструкцию можно посмотреть в [1], но и идущая с пакетом инструкция вполне понятна (правда, на английском).
Создаём каталоги для самого Calamaris и для создаваемых им отчётов:
# mkdir -p /etc/calamaris /var/www/html/reports/calamaris
Копируем calamaris.conf в /etc/calamaris/ и редактируем:
$requester_report = -1;
$status_report = 1;
$type_report = -1;
$hostname = 'lookup';
$output_format = 'html,graph';
$output_path = '/var/www/html/reports/calamaris';
$output_file = 'index.html';
$show_reports = '0,2,5,6,8,10,11,13,14';
Копируем calamaris в /etc/calamaris/calamaris.pl. Расширение добавляем для определённости, что это скрипт на Perl.
Создаём каталог /usr/lib/perl5/calamaris (или там, где у вас находятся библиотеки perl) и копируем туда calAxestype.pm, calAxestype3d.pm, calBars3d.pm.
Копируем мануал calamaris.1 в /usr/local/man/man1/.
Будем использовать скрипт (см. листинг), который позволит нам создавать ежедневные, еженедельные и ежемесячные отчёты. Ежедневные будут храниться месяц, а еженедельные и ежемесячные – год. Скрипт поместим в /etc/calamaris/calam_rep.sh <files/scripts/calam_rep.sh>.
#!/bin/bash
# Скрипт для Calamaris 3. Создаёт отчёты по логам Squid
# Использование: calam_rep.sh [today|yesterday|week|month]
# Pavel Malakhov 28.03.05
CALAM_DIR='/etc/calamaris'; # Каталог программы
SQUID_LOG_DIR='/var/log/squid'; # Каталог логов Squid
# Корневой каталог отчётов, остальные создадутся
REP_PATH_PREFIX='/var/www/html/reports/squid';
# Каталог, где будем хранить недельные кэш-файлы
CACHE_DIR='/etc/calamaris/cache';
# Так как отчёт делаем за вчерашний день, то название отчёта должно это отражать. Определим для этого переменные.
# Для наглядности предположим, что сегодня 1 февраля 2006, среда, тогда вчера было 31 января, вторник
# Вчерашнее число, т.е. YESTD=31
YESTD=`date -d yesterday +%d`;
YESTW=`date -d yesterday +%V`; # Номер недели
# Для нашего примера номер недели не изменился и YESTW=5. Номер и название месяца, т.е. YESTM=01_January
YESTM=`date -d yesterday +%m_%B`;
# Существует проблема с обработкой не английских букв, если используется кодировка en_US.UTF-8.
# Поэтому переназначим переменную LANG. Если используется другая кодировка или проблем нет, то закомментируйте
# нижеследующие 2 строки
LANG=en_US
export $LANG
# --- Нижеследующий код изменять не нужно ---------------
# ---- [но исследование приветствуется!] ----------------
# Если параметр отсутствует, то прерываем выполнение скрипта
if [ "$1" = "" ]; then
echo "Usage: calam_rep.sh [today|yesterday|week|month]"
exit 1
fi
# Если каталог для отчётов не существует, то создаём
function checkdir {
if [ ! -e "$REPPATH" ];then
echo -n `date +%c` "Dir \"$REPPATH\" is absent. Creating..";
mkdir -p $REPPATH;
echo "Done.";
fi;
}
# Если каталог для кэша не существует, то создаём
if [ ! -e "$CACHE_DIR" ];then
echo -n `date +%c` "Cache dir \"$CACHE_DIR\" is absent. Creating... ";
mkdir -p $CACHE_DIR;
echo "Done.";
fi;
case "$1" in
"today" )
REPPATH=$REP_PATH_PREFIX'/today';
checkdir;
cd $CALAM_DIR;
echo -n `date +%c` "Processing data for today... ";
cat $SQUID_LOG_DIR/access.log | ./calamaris.pl --config-file ./calamaris.conf --output-path
$REPPATH;
;;
"yesterday" )
REPPATH=$REP_PATH_PREFIX'/days/'$YESTD;
checkdir;
cd $CALAM_DIR;
echo -n `date +%c` "Processing data for yesterday... ";
cat $SQUID_LOG_DIR/access.log.0 | ./calamaris.pl --config-file ./calamaris.conf --output-path $REPPATH --cache-output-file $CACHE_DIR/day.$YESTD;
;;
"week" )
REPPATH=$REP_PATH_PREFIX'/weeks/'$YESTW;
checkdir;
cd $SQUID_LOG_DIR;
echo -n `date +%c` "Processing data for week... ";
cat access.log.6 access.log.5 access.log.4 access.log.3 access.log.2 access.log.1 access.log.0 |
$CALAM_DIR/calamaris.pl --config-file
$CALAM_DIR/calamaris.conf --output-path $REPPATH --cache-output-file $CACHE_DIR/week.$YESTW;
;;
"month" )
REPPATH=$REP_PATH_PREFIX'/months/'$YESTM;
checkdir;
cd $CACHE_DIR;
CACHEFILES="";
for ((i=1; i<=31; i++)); do
FILE='day.'$i;
if [ -e "$FILE" ]; then
if ["$CACHEFILES" = ""]; then
CACHEFILES=$FILE;
else
CACHEFILES=$CACHEFILES':'$FILE;
fi
fi
done
echo 'files to process '$CACHEFILES;
echo -n `date +%c` "Processing data for month... ";
$CALAM_DIR/calamaris.pl --config-file
$CALAM_DIR/calamaris.conf --cache-input-file $CACHEFILES --no-input --output-path $REPPATH;
echo "Done";
# Очищаем кэш в начале месяца.
# Удаляем только записи для дней, для недель оставляем
DD=`date +%d`;
if [ "$DD" = "01" ]; then
echo -n `date +%c` "Cleaning up cache dir... ";
rm -f $CACHE_DIR/day.*;
fi
;;
esac
echo "Done";
echo `date +%c` "---Everything is done"
exit 0
Делаем этот скрипт исполняемым:
# chmod +x /etc/calamaris/calam_rep.sh
Cоздаём отчёт:
# ./calam_rep.sh yesterday
и смотрим его в браузере по адресу http://our.domain.ru/reports/calamaris/days.
Создаём журнальный файл /var/log/calam_rep.log, куда будем записывать результаты запуска скрипта по cron:
# touch /var/log/calam_rep.log
Слабое место Calamaris – статистика по пользователям и сайтам, сильная сторона – общая статистика по нагрузке на прокси-сервер. Все отчёты последовательно отображаются на одной html-странице. Некоторые отчёты не отображаются, если в журнале не найдены необходимые для него записи. Мне удалось получить 11 отчётов. Вот их описание:
- Summary – суммарная информация по работе прокси-сервера (рис. 3).
- Incoming requests by method – входящие запросы по методу (Get, Post и т. д.).
- Incoming UDP(TCP)-requests by status – входящие запросы по статусу (HIT, MISS, DENIED и т. д.).
- Outgoing requests by status – исходящие запросы по статусу.
- Outgoing requests by destination – исходящие запросы по месту назначения.
- Request-destinations by 2nd-level-domain – сгруппированная статистика для доменов 2-го уровня, т.е. запросы на site1.example.com и site2.example.com суммируются в статистике для домена example.com.
- Request-destinations by toplevel-domain – сгруппированная статистика для доменов 1-го уровня (ru, com, org и т. д.)
- TCP-Request-protocol – распределение трафика по протоколам (рис. 4).
- Requested content-type – распределение трафика по значению поля Content-type и по статусу входящих TCP-запросов (TCP_HIT, TCP_MISS, TCP_DENIED, и т. д.)
- Requested extensions – распределение трафика по расширениям запрошенных файлов (gif, htm и т. д.).
- Incoming UDP(TCP)-requests by host – статистика по пользователям (количество запросов, скаченный объём).
Рисунок 3. Cуммарная информация по работе прокси-сервера
Рисунок 4. Распределение трафика по протоколам
Если Calamaris будет не единственным обработчиком журналов Squid, то я бы не ставил поддержку графики (от них практической пользы нет) и не выводил статистику по пользователям (другие программы это делают и полнее, и красивее). В таком облегчённом варианте он ставится быстро, и генерируемые им отчёты в будущем будут занимать меньше места.
LightSquid
Перевести название программы можно как «освещённый Squid». В каком свете нам будет представлен Squid, а точнее наши пользователи, можно посмотреть по адресу http://lightsquid.sourceforge.net/demo16b/index.cgi?year=2005&month=04.
Берём последнюю версию с lightsquid.sourceforge.net и распаковываем:
# tar -zxvf ./lightsquid-1.6-beta.tgz
Создаём каталог, где будем хранить отчёты:
# mkdir -p /var/www/html/reports/lightsquid
Всё содержимое каталога lightsquid-1.6-beta копируем в созданный каталог. Меняем владельца на того, кто у нас в роли httpd-пользователя (например, webmaster) и делаем скрипты исполняемыми файлами:
# chown -R root.webmaster /var/www/html/reports/lightsquid
# cd /var/www/html/reports/lightsquid
# chmod +x *.cgi
# chmod +x *.pl
В конфигурационном файле lightsquid.cfg меняем значения переменных:
# пути к настроечным файлам
$tplpath ="/var/www/html/reports/lightsquid/tpl";
$langpath ="/var/www/html/reports/lightsquid/lang";
$reportpath ="/var/www/html/reports/lightsquid/report";
$ip2namepath ="/var/www/html/reports/lightsquid/ip2name";
# путь к журналам Squid
$logpath ="/var/log/squid/";
# какие сайты не учитывать в отчётах
$skipurl = "zdd.com|192\.168\.1\.|cnn.com";
# язык отчётов
$lang = "ru";
# определяем размер «большого файла» в 2 Мб
$bigfilelimit = 2*1024*1024;
# показывать отчёт о пользователях, превысивших квоту
$showoversizelink = 1;
# устанавливаем квоту 10 Мб (одна для всех)
$perusertrafficlimit = 10*1024*1024;
Проверяем, все ли настройки сделаны правильно:
# ./ check-setup.pl
Создаём отчёт:
# ./lightparser.pl
Проверим в браузере, что мы получили. Начальная страница отчёта должна быть, как на рис. 5.
Рисунок 5. Удобный интерфейс начальной страницы LightSquid
LightSquid поддерживает как родной формат журнала Squid, так и формат httpd.
Можно объединять пользователей в группы и смотреть отчёты по группе. Для этого в файле group.cfg определяем, какой пользователь к какой группе относится:
192.168.10.1 01 Sysadmin
192.168.10.9 02 Managers
192.168.10.14 02 Operators
192.168.10.30 02 Operators
192.168.10.74 03 Managers
Можно вместо IP-адресов выводить имя компьютера и каждому имени компьютера сопоставить реальное имя пользователя. Для первой цели автор программы предлагает либо использовать DNS, либо подставлять из списка. Скрипты, обрабатывающие файлы списков, находятся в подкаталоге ip2name. Можно написать свой, но нам сейчас достаточно использовать имеющийся. Для того чтобы получить отчёт, как на рис. 6, определяем в lightsquid.cfg следующие параметры:
$ip2name = "list";
$showgrouplink = 1;
$userealname = 1;
Рисунок 6. Популярные сайты. Можно сортировать по «Соединениям» и по «Байтам»
В ./ip2name/ip2name.list меняем значение переменной:
sub StartUser() {
my $ipfile = "/var/www/html/reports/lightsquid/users.txt";
и создаём указанный файл следующего содержания:
192.168.10.1 Myself
192.168.10.9 Bond
192.168.10.14 Bart
192.168.10.30 Ivan
192.168.10.74 Petrov
Теперь в group.cfg нужно заменить все IP-адреса на сопоставленные им имена компьютеров, а в файле realname.cfg сопоставить имена компьютеров с именами рользователей:
Myself sysadmin
Bart Bart Simpson
Ivan Ivan Ivanov
Petrov Petrov Semen Semenovich
Bond James Bond
Конечно, если у вас где-то ведётся свой список пользователей, то лучше использовать его, написав для LightSquid небольшой скрипт по разбору этого файла.
Запуская программу, мы получаем следующие отчёты:
- Количество соединений и скачанных байт на день, на месяц и на год по каждому пользователю, для группы и для прокси-сервера в целом.
- Популярные сайты (рис. 7). В этом есть возможность сортировки списка по количеству запросов либо по объёму данных.
- Таблица времени доступа пользователя к сайтам, то есть время его активности в Интернете.
- Отчёт о «больших» скачанных файлах.
Рисунок 7. Группировка пользователей в LightSquid
Хочется особо отметить удобный интерфейс.
Последние штрихи
Осталось автоматизировать генерацию отчётов путём добавления в /etc/crontab соответствующих заданий:
# Генерируем отчёты прокси сервера Squid
0/20 * * * * root /var/www/html/reports/lightsquid/lightparser.pl today
5 0 * * * root /usr/sbin/sarg
30 0 * * * root /etc/calamaris/calam_rep.sh yesterday >> /var/log/calam_rep.log
35 0 * * 6 root /etc/calamaris/calam_rep.sh week >> /var/log/calam_rep.log
45 0 1 * * root /etc/calamaris/calam_rep.sh month >> /var/log/calam_rep.log
Конечно, частота обновления отчётов остаётся на ваше усмотрение. В приведённом примере LightSquid будет поддерживать свои отчёты в актуальном состоянии, обновляя их через каждые 20 минут. Sarg будет создавать их один раз в день после ротации журналов, которую logrotate делает в полночь. А Calamaris будет запускаться с аналогичной задачей ежедневно в 00:30, раз в неделю по понедельникам в 00:35 и первого числа каждого месяца в 00:45. В первых же числах он обновит свой журнал.
Ограничим доступ к отчётам только с определённых IP-адресов. Для этого создаём файл /var/www/html/reports/.htaccess:
Options +Indexes
Order deny,allow
Deny from all
Allow from 192.168.100.11
Allow from 192.168.100.17
Можно сделать доступ по паролю. Подробности по настройке доступа можно прочитать в [2].
Подведем итоги
У всех трёх программ есть настройки внешнего вида отчёта, графики. Все поддерживают русский язык. У каждой есть свои отличительные характеристики, заслуживающие внимания, и можно установить все три, но если такой возможности (или желания) нет, то при выборе стоит учесть:
- нужны ли вам те или иные отчёты;
- достаточно ли у вас дискового пространства, чтобы хранить все желаемые отчёты;
- позволяет ли нагрузка на процессор добавить генерацию всех желаемых отчётов. Для обработки 140 тысяч строк журнала на компьютере с процессором Pentium 4 с тактовой частотой 3 ГГц и с 1 Гб оперативной памяти потребовалось для всех трёх программ вместе при их последовательном запуске около 2,5 минуты.
Напоследок хочу сказать, что, поискав в Интернете отклики по этим программам, вы обнаружите различные жалобы администраторов на их неудобство или даже частичную неработоспособность. Так, например, Sarg до сих пор останавливается на некоторых записях журнала, отказываясь создавать отчёт (благо что такие записи у меня попадаются редко). Однако все три проекта довольно активно развиваются и недочёты исправляются, поэтому ставьте свежие версии программ и пользуйтесь!
- http://pm4u.narod.ru/linux_server.htm#Calamaris3.
- Малахов П. Многоликий Apache. Размещаем несколько сайтов на одном веб-сервере. //Системный администратор, №12, 2005 г. – с. 63-65 – http://www.samag.ru/cgi-bin/go.pl?q=articles;n=12.2005;a=12.