Эта статья расскажет как сконфигурировать пару проксирующих серверов Squid установленных на CentOS 6.3 и подключенных к вашему шлюзу с использованием WCCP. В этой статье мы не будем затрагивать вопросы оптимизации работы кэша прокси сервера Squid. Читать далее →

2010-09-20 04:03:08 UTC

Courtesy of safsquid.com
@echo off
set SARGDIR=C:\sarg

if "%1"=="7days" goto :7days
if "%1"=="15days" goto :15days
if "%1"=="30days" goto :30days

::Generate Yesterdays Log Report
::=================================
for /f %%a in ('%SARGDIR%\bin\date.exe —date="today -1 days" +%%d/%%m/%%Y') do set YESTERDAY=%%a
%SARGDIR%\sbin\sarg.exe -d %YESTERDAY%
goto:EOF
goto:EOF

:7days
for /f %%a in ('%SARGDIR%\bin\date.exe —date="today -1 days" +%%d/%%m/%%Y') do set YESTERDAY=%%a
for /f %%b in ('%SARGDIR%\bin\date.exe —date="today -8 days" +%%d/%%m/%%Y') do set LASTWEEK=%%b
%SARGDIR%\sbin\sarg.exe -d %LASTWEEK%-%YESTERDAY%
goto:EOF
goto:EOF

:15days
for /f %%a in ('%SARGDIR%\bin\date.exe —date="today -1 days" +%%d/%%m/%%Y') do set YESTERDAY=%%a
for /f %%b in ('%SARGDIR%\bin\date.exe —date="today -16 days" +%%d/%%m/%%Y') do set FORTNIGHT=%%b
%SARGDIR%\sbin\sarg.exe -d %FORTNIGHT%-%YESTERDAY%
goto:EOF
goto:EOF

:30days
for /f %%a in ('%SARGDIR%\bin\date.exe —date="today -1 days" +%%d/%%m/%%Y') do set YESTERDAY=%%a
for /f %%b in ('%SARGDIR%\bin\date.exe —date="today -31 days" +%%d/%%m/%%Y') do set LASTMONTH=%%b
%SARGDIR%\sbin\sarg.exe -d %LASTMONTH%-%YESTERDAY%
goto:EOF
goto:EOF

Здесь опубликованы три скрипта для создания ежедневной/еженедельной/ежемесячной статистики. После создания месячного отчета access.log будет усечен.
Базируется на наработках Jeremy Lahners, за что большое спасибо ему.

Daily (Jeremy´s script):
————————————-

#!/bin/bash

#Get current date
TODAY=$(date +%d/%m/%Y)

#Get one week ago today
YESTERDAY=$(date —date "1 day ago" +%d/%m/%Y)

/usr/local/bin/sqmgrlog -l /usr/local/squid/logs/access.log -o /usr/local/apache/htdocs/reports/daily -z -d $YESTERDAY-$TODAY

exit 0

Weekly
————————————-

#!/bin/bash

#Get current date
TODAY=$(date +%d/%m/%Y)

#Get one week ago today
YESTERDAY=$(date —date "1 week ago" +%d/%m/%Y)

/usr/local/bin/sqmgrlog -l /usr/local/squid/logs/access.log -o /usr/local/apache/htdocs/reports/weekly -z -d $YESTERDAY-$TODAY

exit 0

Monthly

#!/bin/bash

#Get current date
TODAY=$(date +%d/%m/%Y)

#Get one week ago today
YESTERDAY=$(date —date "1 month ago" +%d/%m/%Y)

/usr/local/bin/sqmgrlog -l /usr/local/squid/logs/access.log -o /usr/local/apache/htdocs/reports/monthly -z -d $YESTERDAY-$TODAY

/usr/local/squid/bin/squid -k rotate

exit 0

And the same for the admin who want the report as an email (example for daily)

#!/bin/bash

#Get current date
TODAY=$(date +%d/%m/%Y)

#Get one week ago today
YESTERDAY=$(date —date "1 day ago" +%d/%m/%Y)

/usr/local/bin/sqmgrlog -l /usr/local/squid/logs/access.log -e user@site.com -z -d $YESTERDAY-$TODAY

exit 0
~

Оригинал http://sarg.sourceforge.net/enhancements.php

Вот возникла у меня задача такая, а именно есть в организации Firewall (железяка цисковая) даже 2, и мартрутизатор который рулит инетом когда основной канал пропадает он переключает на другой, и всё бы хорошо, но надо сделать статистику, то есть кто куда ходит. Тут само собой 2 варианта, либо пустая машина, тогда проблем нет вообще, туда Linux любой по вкусу, Apache ну или кто что любит, Squid для проксирования и редиректов запросов, ну и Sarg для создания отчётов, но вот в винде то не всё так просто.

В общем есть у меня сервак для антивирусной защиты, ну и ночью он бекапит, там ещё много чего есть, но факт в том что он на Windows само собой сервер, зачем не спрашивайте, работаю в немецкой фирме, стандарт такой, так вот забубенил я туда Squid, и Sarg сделал для отчётов, а в качесвте планировщика поставил Xstarter.

Теперь по подробнее о настройке!

  • Установка Squid само собой качаем порт для винды отсюда, далее ставим следующим образом:
  • Распаковываем дистрибутив в выбранный вами каталог. Автор рекомендует отказаться от использования в пути пробелов и использования длинных путей. Например: H:\Squid25
  • Установка Squid как системной службы. Соответственно: squid -i -f h:/squid25/etc/squid.conf -n Squid25_1 где h:/squid25/etc/squid.conf — путь к файлу конфигурации Squid, Squid25_1 — имя службы, можно использовать любое допустимое в NT. После этой команды служба будет сконфигурирована как автозагружаемая, рекомендую пока перевести ее в режим запуска вручную.
  • Редактируем файл squid.conf — особое внимание обращаем на то, что пути нужно писать как в Unix, "\" и "/" — не одно и то же.
  • Формируем кеш Squid. squid -z -f h:/squid25/etc/squid.confЗамечание: используйте awin32 или ufs
  • Проверяем что конфигурация кеша верна. start squid -f h:/squid25/etc/squid.conf Такой вариант запуска позволяет запустить Squid в виде консольного приложения. В случае каких либо ошибок они будут выведены и их следует исправить.
  • Переводим сервис Squid-а в автозапуск. Запускаем службу — можно работать.
  • Для своего удобства пишем три (можно и больше) bat-файлика: Старт squid-а: net start Squid25_1 Останов: net stop squid25_1 Переконфигурация: squid -n Squid25_1 -f h:/squid25/etc/squid.conf -k reconfigure

Несколько замечаний Squid.conf по умолчанию не создан копируме Squid.conf.sample и убираем Sample далее заходим в этот конфиг и правим его, нам нужно выствить порт по которому Squid будет слущать запросы, ищем строку http_port и раскоментируем её выставляя нужный нам порт. Далее ищем вот такой фрагмент:

#Recommended minimum configuration:

acl all src 0.0.0.0/0.0.0.0

acl manager proto cache_object

acl localhost src 127.0.0.1/255.255.255.255

acl to_localhost dst 127.0.0.0/8

acl SSL_ports port 443

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 # https

acl Safe_ports port 70 # gopher

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

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

acl CONNECT method CONNECT и добавляем к нему

acl our_networks src 192.168.1.0-192.168.1.1

Правило acl our_networks src  указывает диапазон ИП для нашей сети от которых Squid будет принимать запросы, далее разрещаем принимать от этой сети запросы http_access allow our_networks далее http_access deny all в принципе для первоначальной настйроки это всё что нужно изменить для запуска прокси сервера.

Если хотим ограничить доступ Находим следующий параметр acl aclname srcdomain Пищем своё правило вот к примеру такое acl DOMD dstdomain "c:/squid/deny/domain.txt" это говорит о том что список доменов и соответсвенно поддоменов доступ к которым запрещён харниться в по следующему пути c:/squid/deny/domain.txt в этом файле, само правило называется DOMD, вы можете назвать его как захотите само собой. вот мой список доменов не разрещённых к показу в рабочее время:

.test.com

.sex.ru

.sex.com

.rufoto.com

.fuck.com

.fuck.ru

.xxxtriplexxx.com

.sparklingvids.com

.infocusteens.com

.ztod-movies.com

.getoffquick.com

.sexxxline.com

.officemilfsvids.com

.pantyhosedreamvids.com

.fetishglobe.com

.theonanistscorner.com

.teencumteen.com

.bluepistons.com

.loveplanet.ru

.analconfine.com

.lunka.com

.porevo.info

.naporno.ru

.kubikov.net

.bikinipageone.com

.greh.ru

.palevo.info

.dezinfo.net

.xtube.com

.erodrom.ru

.ben.ru

.2-3.ru

.sex-photo.ru

.mazda.ru

.e-xpedition.ru

.fion.ru

.mazda-major.ru

.gw-hover.ru

.huntwear.ru

.odnoklassniki.ru

.odnoklasniki.ru

.chinamobil.ru

.engine.t.rorer.ru

.mitsubishi-motors.ru

.ford.ru

.mymaika.ru

.chevrolet.ru

.hyundai.ru

.zod.ru

.primehouse.ru

.domproject.ru

.paddler.ru

.ozon.ru

.zagony.ru

.hunter-fish.ru

.energyfm.ru

.redtram.com

.hotlog.ru

.cars.auto.ru

.gmsn.ru

.proektservis.ru

.inosmi.ru

.mosdoma.ru

.irr.ru

.km.ru

.miel.ru

.phoenixcontact.com

.pik-estate.ru

.smart60.ru

.kiavostok.ru

.dnepropetrovskaya18.ru

.narod.ru

.forum.logan.ru

.playground.ru

.mobilchips.com

.drugasmuga.com

.renault.ru

.millertime.com

.akella.com

.vkontakte.ru

.yadro.ru

.list.ru

.novostroy.su

.nhl.com

.xuk.ru

.hitlist.ru

.begun.ru

.poselkispb.ru

.atwola.com

.icq.com

.rian.ru

.bannerhouse.ru

.su155.ru

.kmapjs.ru

.content.medialand.ru

.engine.adland.ru

.foto.ru

.shopfoto.ru

.lenspecsmu.ru

.m-industry.ru

.djv.ru

.esprit.fr

.esprit.de

.esprit.com

.esprit.ru

.allcafe.info

.elki-palki.ru

Далее если ва это нужно возможно определить время работы, то есть время в которое будет действовать то или иное правило находим следующую строку # acl aclname time [day-abbrevs] [h1:m1-h2:m2] и создаём к примеру такое правило acl worktime time MTWHF 09:30-18:30 это значит что с понедельнику по пятницу во время с 9.30 до 18.30 мы может ограничить или разрешить доступ вот к примеру я запретил доступ к своим запрещённым сайтам из списка domain.txt в рабочее время следующим образом:

http_access deny DOMD worktime http_access allow DOMD

Будьте внимательны эти строки должны быть вставлены до

http_access allow our_networks

Далее возможно запретить ещё и загрузку различного рода контента, для этого находим

#acl urld urlpath_regex [-i] \.sex$ … # regex matching on URL path и пишем своё правило, вот к примеру acl media urlpath_regex .\mp3$ .\avi$ .\mpeg$ .\iso$ .\mpg$ .\avi$ .\wmv$ думаю тут всё понятно, записаны те типы файлов которые запрещены к загрузке

Далее запрещаем их Будьте внимательны эти строки должны быть вставлены до

http_access allow our_networks

http_access deny media

также можно запретить доступ одному хосту из вашей сети, сделать это можно так:

acl bad_host src 192.168.1.50

Будьте внимательны эти строки должны быть вставлены до

http_access allow our_networks

http_access deny bad_host

Вот собственно самый простой конфиг.

  1. Далее создаём статистику с Sarg
  2. Тут есть 2 способа или поднять IIS, а тогда встаёт вопрос лицензий или использовать Apache в связке с Mysql, нам ведь нужно только чтобы логи были доступны из браузера, тут выбор за вами, или можно просто иметь отчёты локально это проще всего.
  3. Я захотел иметь веб сервер, удобнее и офисы видят что статистика ведётся и могут её смотреть, так что по лишним местам перестали лазить быстро.
  4. Для этого качаем Sarg порт для Windows
  5. Далее распаковываем его и правим sarg.conf в sarg\etc\sarg.conf
  6. Первое выставляем язык я поставил language Russian_koi8
  7. Далее пишем где лежат файл с логами access_log c:/squid/var/logs/access.log
  8. Далее идут настройки с цветами и логотипами, это каждому своё
  9. После прописываем путь к бинарникам bin_dir c:/sarg/bin
  10. Далее путь куда будут класться отчёты output_dir C:\AppServ\www\report, это каталог откуда Ваш веб сервер берет данные
  11. Можно их сразу отправлять на E-MAil это как кому угодно
  12. Далее я прописал user_ip yes это говорит о том что заместо имени юзера будет выставляться его ИП, далее мы сможем используя файл user_names.txt задать для ип какие угодно имена, можно не выставлять этот параметр и он будет искать их в ДНС

Далее я ничего не менял, там в принципе и так всё прозрачно, из интересного только использование файла exclude-hosts.txt который говорит какие хосты надо исключить из отчёта, и типы отчётов какие создавать report_type

  • topusers
  • topsites
  • sites_users
  • users_sites
  • date_time denied
  • auth_failures
  • site_user_time_date
  • downloads

более ничего интересного я там не увидел для себя.

Создание ежедневных отчётов

Если вы попробовали создать отчёт то вы увидите что по умолчанию Sarg создаёт только общий отчёт с начала ведения логов до его конца, но вот мне надо было чтобы он создавал отчёты за день и вывешивал их на общее обозрение, для этого и я использовал Xstarter

Он абсолютно бесплатен для русскоязычных пользователей, так что можете юзать как хотите. То есть после установки я ввёл регулярное задание выполняющееся в 22,30 каждый день на выполнение поставил сам SARG а в параметрах запуска указал -d [DAY]/[MONTH]/[YEAR]-[DAY]/[MONTH]/[YEAR] таким образом получил аргументы текущего дня , которые указываются при запуске SARG с ключём -d Вот вроде и всё пишите если у кого возникнут трудности, с радостью отвечу При создании статьи частично использованы материалы с http://squid.opennet.ru

Для начала всопним что SARG это генератор отчётов для кеширующего прокси сервера SQUID!
О возможностях и загруке данного продукта можно почитать на САЙТЕ этого проекта, впрочем там довольно всё прозрачно поэтому останавливатся на этом мы не будем!

Для начала хотелось бы привести два примера конфигурации для генерирования отчёта с помощью CRON и SARG

Ежедневный отчёт

#!/bin/bash
exec /usr/bin/sarg \
-o /var/www/sarg/daily \
-d "$(date —date "1 day ago" +%d/%m/%Y)" > /dev/null 2>&1

exit 0

Еженеденльный

#!/bin/bash
LOG_FILES=
if [[ -s /var/log/squid/access.log.1.gz ]]; then
LOG_FILES="$LOG_FILES -l /var/log/squid/access.log.1.gz"
fi
if [[ -s /var/log/squid/access.log ]]; then
LOG_FILES="$LOG_FILES -l /var/log/squid/access.log"
fi

# Get yesterday's date
YESTERDAY=$(date —date "1 days ago" +%d/%m/%Y)

# Get one week ago date
WEEKAGO=$(date —date "7 days ago" +%d/%m/%Y)

exec /usr/bin/sarg \
$LOG_FILES \
-o /var/www/sarg/weekly \
-d $WEEKAGO-$YESTERDAY > /dev/null 2>&1

exit 0

Разработка пакета свободного отечественного программного обеспечения – одна из центральных задач, которую необходимо решить для информационной безопасности России. Об этом неоднократно заявлял первый вице-премьер Правительства РФ Дмитрий Медведев. По его словам, до 2010 г. в России должна быть создана собственная операционная система с открытым кодом и полный комплект приложений для обеспечения эффективной работы государственных органов и бюджетных организаций.

Первый открытый конкурс на разработку и поставку пакета свободного программного обеспечения был проведен в России осенью 2007 года. Его победителем стала группа «Армада». Согласно подписанному контракту, стоимость которого составила 59,5 млн. руб., «Армада» обязалась разработать и протестировать пакет свободного ПО. В течение 2008 года данный комплект будет установлен более чем в 1200 школах республики Татарстан, Пермского края и Томской области. После внесения необходимых доработок, подобными программными продуктами планируется оснастить еще более 60 тысяч российских школ.

В реализации проекта «Армаде» помогают ведущие российские разработчики свободного ПО — «Альт Линукс», Linux-online, Linux-Ink и ВНИИНС, а также системные интеграторы РАМЭК и НЦИТ.

Группа компаний «Армада» 20 января разместила в интернете 3 комплекта программного обеспечения и объявила о завершении первого этапа проекта по обеспечению общеобразовательных учреждений Российской Федерации пакетом свободного программного обеспечения (СПО) на базе Linux.

После победы в тендере, консорциум разработчиков во главе с Армадой передал в Министерство образования 3 комплекта программного обеспечения от российских компаний ALT Linux, Linux Ink и Linux-Online.

Первые официальные дистрибутивы школьного СПО доступны в сети с 20 января по адресу linux.armd.ru. Все последующие обновления будут публиковаться там же. Для поддержки на сайте проекта предусмотрен форум и раздел с ответами на часто задаваемые вопросы.

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

Параллельно будет развернута система технической поддержки проекта, открыта «горячая линия», подготовлены методические рекомендации, разработаны дополнительные прикладные программы и учебные пособия.

В течение 2008 года Армаде предстоит обеспечить СПО не менее 50% городских и 20% сельских школ в вышеперечисленных трех российских регионах: республике Татарстан, Пермском крае и Томской области.

На сайте проекта представлены 4 дистрибутива:

1. Легкий Линукс
— оптимизирован для установки и работы на компьютерах от 128 до 256 МБ памяти и процессор от PI 233 МГц.

Конфигурация 1. На 2CD. Представленные дистрибутивы

Вариант с самыми низкими аппаратными требованиями, обеспечивает приемлемую производительность даже на системах с объёмом памяти 128 МБ.
Включает в себя графическую среду XFCE; в состав этого дистрибутива входят лёгкий и быстрый текстовый редактор Abiword и программа редактирования электронных таблиц Gnumeric.

Кроме того, на первом диске содержатся:
•Офисный пакет: OpenOffice.org 2.3;
•Веб браузер: Firefox 2.0;
•Электронная почта: Claws Mail;
•Работа с изображениями: Gimp 2.4;
•И ещё более 1000 программ, позволяющих решать самый широкий круг задач.

Дополнительный диск «Образование». Содержит программы, которые могут понадобится в школе и других образовательных учреждениях:
•Редактор веб страниц Bluefish;
•Языки программирования pascal (Free Pascal и Lazarus), basic (gambas), logo (KTurtle);
•Системы математических вычислений (Maxima и Scilab);
•Антивирус ClamAV и кэширующий сервер Squid, СУБД PostgreSQL.

2. Линукс Юниор

— для компьютеров с объемом памяти от 256 МБ до 1 ГБ.

Конфигурация 2. На 2CD.

Производительный дистрибутив, в то же время не требующий для своей работы процессоров последнего поколения и большой оперативной памяти. Основан на графической среде KDE, помимо офисных приложений и обучающих программ включает в себя средства разработки программ, такие как Lazarus и KDevelop.

3. Линукс Мастер

— дистрибутив на DVD, требует память от 1ГБ.

Конфигурация 3

Этот мощный дистрибутив можно использовать как для обучения компьютерной грамотности, так и для разработки полноценных программ на Java, C/C++ и PHP, благодаря среде разработки Eclipse, входящей в его состав. Кроме Eclipse, в Линукс Мастер входят все те программы, которые есть в варианте Линукс Юниор. Будучи рассчитан на современные компьютеры, дистрибутив размещён на носителе формата DVD, что позволило обойтись одним диском.

4. Линукс Терминал

— Terminal Server. Специальное решение разработанное в дополнение к основным конфигурациям.

Этот дистрибутив предназначен для использования в компьютерных классах с сервером. Программы, с которыми работают ученики, фактически выполняются на сервере, а машины учеников используются только для отображения и ввода информации (так называемые «тонкие клиенты»). Благодаря такой организации работы класса аппаратные требования к машинам учеников становятся очень низкими (память от 32 МБ), а основная вычислительная нагрузка ложится на сервер. Вариант с Линукс Терминал рассматривается как удобный способ миграции.

Состав ПО, входящего в Линукс Терминал, соответствует составу ПО в Линукс Юниор; таким образом, при достаточно мощном сервере можно запускать даже весьма требовательные к аппаратным ресурсам программы (например, KDevelop) на машинах учеников.

Официальный сайт проекта

Предположим, имеется компьютерная сеть на базе домена Windows NT или

2000,
выходящая в Интернет исключительно через прокси-сервер,расположенный на
компьютере под управлением операционной системы FreeBSD. Рано или
поздно возникает необходимость контролировать доступ пользователей
прокси-сервера к различным объектам. Первое, что приходит в голову в
таких случаях — разделение доступа по IP-адресам компьютеров.Этот
способ достаточно просто реализуется с помощью несложного набора ACL в
конфигурационном файле squid.conf,но он обладает одним весьма
существенным недостатком — невозможно без привлечения дополнительных
ресурсов однозначно сказать, какой пользователь в данный момент имел
доступ к данному ресурсу.

Более удобным для администратора является способ, когда каждый
пользователь идентифицируется и получает доступ к прокси только при
наличии действующей регистрационной записи в домене Windows (и
возможно, только при вхождении в определенную группу домена). Варианты
настроек прокси-сервера, обеспечивающие получение регистрационного
имени пользователя, запросившего данный ресурс, и будут рассмотрены в
данной статье. (Оставим пока в стороне вопрос о том, что делать с этой
информацией — расчет статистики загрузки канала и отображения ее — это
тема для отдельной статьи).

Для моделирования ситуации использовалась следующая конфигурация:

    — Домен на базе Windows 2000 Server.
 

    — Прокси-сервер Squid 2.5-STABLE6 на
базе FreeBSD 4.10-STABLE.
    — Samba 2.2.11 и Samba 3.0.6.

Все программы собирались с помощью портов, в Makefile которых при
необходимости вносились изменения. Данные изменения не затрагивали
каталоги для размещения файлов порта.
Все команды в данной статье запускаются от имени пользователя root.
Если для выполнения команды достаточно привилегий рядового
пользователя, это оговаривается заранее.

Squid 2.5 и Samba 2.2.x

Первый рассматриваемый вариант — предоставление доступа к
прокси-серверу при условии наличия действующей учетной записи в домене
Windows с использованием пакета Samba 2.2.x. Версия Samba здесь имеет
принципиальное значение, поскольку с различными версиями пакета samba
необходимо использовать различные варианты внешних аутентификаторов для
squid.
Для проверки имени и пароля пользователя, переданных Squid, мы будем
использовать аутентификаторы wb_ntlmauth и wb_auth, которые собираются
вместе со Squid, если задать их сборку. Для задания сборки данных
аутентификаторов следует добавить «winbind» в строки
    —enable-basic-auth-helpers=»список»

    —enable-ntlm-auth-helpers=»список»

в строке CONFIGURE_ARGS порта squid.

В последней на данный момент версии порта (1.138 от 21.08.2004) эти
параметры заданы по умолчанию. Если имеются исходные тексты Samba, то
можно указать их расположение параметром

    —with-samba-sources=<полный путь
>,

например:

—with-samba-sources=/usr/ports/net/samba/work/samba-2.2.11

иначе Squid будет использовать часть исходных текстов Samba,
распространяемых вместе с ним. Если сборка выполняется не с помощью
портов, а самостоятельно (что крайне не рекомендуется делать), то
следует добавить к строке запуска configure эти параметры:
    ./configure —enable-auth=»basic ntlm»
    —enable-basic-auth-helpers=»winbind»
   
—enable-ntlm-auth-helpers=»winbind»  … <другие
параметры порта, если необходимы>

После сборки и установки порта в каталоге /usr/local/libexec должны
появиться файлы wb_ntlmauth и wb_auth.
Аутентификатор для проверки имени и пароля, переданного от Squid,
обращается к демону winbindd, который должен быть запущен на данном
компьютере. Для обеспечения работоспособности данной схемы Samba, в
состав которой входит winbindd, должна быть собрана со следующими
параметрами:

    make WITH_WINBIND=yes
WITH_WINBIND_AUTH_CHALLENGE=yes

Если сборка самбы выполняется не через порты, а самостоятельно (что не
рекомендуется делать), то к строке запуска configure следует добавить
следующие параметры:

    ./configure  —
with-winbind  — with-winbind-auth-challenge … <другие
параметры порта, если надо>

Данная строка задает только сборку Samba безотносительно наличия
накомпьютере Squid. Если Samba уже была установлена и собиралась без
указанных параметров, ее необходимо пересобрать.

По окончании сборки и установки порта в каталоге /usr/ local/sbin
должна появиться программа winbindd, а в каталоге /usr/local/bin —
wbinfo,которая служит для «общения» с winbindd и получения от него
информации.После запуска самбы следует проверить работоспособность
winbindd следующим образом:

    granch:[Shelton] 101>wbinfo-p
    Ding to winbindd succeeded on fd 3

    granch:[Shelton] 104>wbinfo-t
    checking the trust secret via RPC calls
succeeded

Первая команда проверяет, работает ли winbindd. Вторая — что учетная
запись компьютера, на котором запущен winbindd, добавлена в домен
иимеет доступ к базе данных домена. Для выполнения данной команды
достаточно прав пользователя, имеющего доступ к каталогу /var/db/samba/
winbindd_privileged. Если вывод программ отличается от приведенного,
следует обратиться к документации по samba для выяснения причины, почему

winbindd неработоспособен, устранить эти причины и повторять
тестирование до тех пор, пока не будет получен успешный результат.

Наиболее общими причинами являются:

— winbindd не запущен (несмотря на всю тривиальность данной причины);

— компьютер не включен в домен Windows, который указан в параметре
  workgroup конфигурационного файла Samba (не выполнялась
команда   smbpasswd -j MYDOMAIN для samba 2.x или net
rpc join <type> -w MYDOMAIN   для samba
3.x).

Наконец вся предварительная работа выполнена, можно переходить к
настройке Squid.

В файле squid.conf после тега auth_param (для версии 2.5.STABLE6 это
строка 1000) идет длинный-длинный комментарий к данному параметру. Там
расписаны все параметры для всех схем авторизации, а ниже всего этого
описания (а оно достаточно объемное — почти полторы сотни строк) идут
строки с параметрами программ аутентификации, отмеченные символом «#» в
первой позиции, распознаваемым как признак комментария. В данных строках
не вписана только собственно программа. Сделано это намеренно, для того
чтобы человек, который возьмется настраивать эти параметры, понимал,
что он делает.

Для того, чтобы наша схема работала, убираем символ «#» из первой
позиции и изменяем следующие строки файла squid.conf:

    auth_param ntlm program
/usr/local/libexec/wb_ntlmauth
    auth_param ntlm children 5
    auth_param ntlm max_challenge_reuses 0

    auth_param ntlm max_challenge_lifetime 2
minutes
    auth_param basic program
/usr/local/libexec/wb_auth auth_param basic children 5
    auth_param basic realm Squid
proxy-caching web server auth_param basic credentialsttl 2 hours

после чего необходимо будет перезапустить прокси-сервер.

Что мы сделали:

первые четыре строки описывают хелпер аутентификации wb_ntlmauth,
который предназначен для работы с браузером Microsoft Internet Explorer,
а также с другими браузерами, распознающими конструкции вида
MYDOMAINmyusername (еще к браузерам такого типа
относятсяMozilla/Firefox);

остальные строки описывают хелпер аутентификации wb_auth, который
предназначен для проверки имени и пароля, передаваемого со стандартного
ввода с помощью winbindd. Это позволяет использовать любые браузеры
-как графические, так и нет (lynx, например).

Обращаю внимание на следующие моменты: Строки в конфигурационном файле
должны стоять в том же порядке, что и в примере, приведенном выше. По
умолчанию дело обстоит именно так. Обьясняется это одним странным
свойством браузера Microsoft Internet Explorer — он способен
использовать только первый описанный хелпер. Если первым описать хелпер
wb_auth, Explorer доступ к прокси-серверу получить не сможет.

Необходим будет полный перезапуск через останов сервера и его
последующий старт. Команды squid -k reconfigure недостаточно, поскольку
при изменении параметров аутентификации squid выгружает и загружает
хелперы аутентификации самостоятельно.

Кроме того, необходимо изменить правила получения доступа к
прокси-серверу таким образом, чтобы доступ предоставлялся только в
случае, если пользователь ввел имя и пароль действительной записи в
домене Windows.

Для этого в файл squid.conf следует добавить следующие строки:

    acl NTLMauth http_access
    proxy_auth allow
    REQUIRED NTLMauth

Первая строка создает правило, согласно которому:

Доступом к прокси-серверу управляет внешняя программа
(программы),описанная в секции auth_param (см. выше описание данного
параметра).
Если какая-либо из программ завершается с ошибкой, отсутствует или дает
отрицательный ответ, то вызывается следующая по списку, пока не будут
просмотрены все присутствующие в файле squid.conf строки auth_param.

Для доступа к прокси-серверу необходим положительный ответ от
программы-аутентификатора (хелпера), иначе доступ предоставлен не будет.
Завершение с ошибкой, отсутствие или отрицательный ответ всех хелперов
считаются отрицательным результатом и являются основанием для отказа в
доступе.

Вторая строка разрешает доступ к прокси только в том случае, если
проверка правила NTLMauth, описанного в первой строке, завершилась
успешно.

Проверяем.

Запустив любой браузер, кроме Internet Explorer, пытаемся посетить
какой-нибудь сайт. Получаем запрос на ввод имени и пароля. Вводим (для
того чтобы не вводить его постоянно в Mozilla/Konqueror, например, есть
режим хранения паролей, при котором во все последующие разы достаточно
нажать «ОК»). Получаем доступ к сайту. Смотрим файл регистрационного
журнала access.log прокси-сервера и видим в конце строки, там где всегда
было пусто, введенное нами имя пользователя.

Запускаем Internet Explorer. Пароль вводить не надо -Internet Explorer
обладает «неестественным» интеллектом и передаст его сам. Получаем
доступ к сайту. Смотрим файл регистрационного журнала access.log
прокси-сервера и видим…

Здесь мы сталкиваемся с двумя вполне безобидными, но способными
поначалу озадачить особенностями Internet Explorer — во-первых,
автоматическая
передача регистрационного имени и пароля пользователя происходит только
на третий запрос бразуера, после того как он дважды получает в ответ:
TCP_DENIED/407, а во-вторых, регистрационное имя передается в форме
MYDOMAINmyusemame, что потребует потом его дальнейшей обработки, потому
что регистрационное имя, передаваемое прочими браузерами, не содержит
Windows-домена.

Squid 2.5 и Samba 3.x

Несколько усовершенствуем нашу систему. Все бы в ней ничего, но есть
как минимум один момент, который может потребовать доработок. Он связан
с
тем, что Samba Team официально прекращает поддержку ветки 2.2.x с 1
октября 2004 г. для того, чтобы сосредоточить все усилия на ветке 3.x и
перспективной 4.x. Это означает то, что обнаруженные ошибки
исправляться не будут, вне зависимости от их степени опасности. Поэтому
мы
заблаговременно отказываемся в нашей системе от Samba 2.2.11 и
переходим на Samba 3.x.

Samba 3.x — это новый продукт Samba team, который содержит огромное
количество изменений (и примерно та кое же количество ошибок) по
сравнению с Samba 2.2.x. Squid еще не умеет работать с winbindd-демоном
от Samba 3.x, поэтому Samba Team поставляет собственную версию хелпера
аутентификации для использования его в Squid -ntlm_auth. Поэтому при
сборке Squid безразлично, что будет задано в качестве параметров
—enable-basic-auth-helpers и —enable-ntlm-auth-helpers. Для сборки
Samba как обычно следует указать:

    make   WITH_WINBIND=yes

при сборке через порты либо:

    ./configure —with-winbind …
<прочие параметры, если надо>

После сборки порта в каталоге /usr/local/bin должен появиться файл
ntlm_auth. Для него существует руководство (мануал) в отличие от тех
хелперов, что поставляются вместе со Squid, можете посмотреть, набрав
man ntlm_auth.

Как обычно, сначала убеждаемся, что winbindd запущен и Samba
сконфигурирована нормально, запустив wbinfo -p и wbinfo -t (пример
вывода программ и рекомендации, что делать, если вывод не
совпадает,приведен выше).

Можно переходить к изменению конфигурационного файла squid.conf.
Находим строку, которую редактировали в прошлый раз, и изменяем вот так:

    auth_param ntlm program
/usr/local/bin/ntlm_auth
       
—helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 5

    auth_param ntlm max_challenge_reuses 0
auth_param ntlm
    max_challenge_lifetime 2 minutes

    auth_param basic program
/usr/local/bin/ntlm_auth
       
—helper-protocol=squid-2.5-basic auth_param basic children 5

    auth_param basic realm Squid
proxy-caching web server auth_param basic redentialsttl 2 hours

Более подробную информацию о параметрах хелпера htlm_auth можно
получить из команды man ntlm_auth.

Как обычно, следите за тем, чтобы ntlm_auth в /usr/local/ bin был из
сборки Samba, потому что Squid тоже собирает свой собственный хелпер
ntlm_auth (-enable-ntlm-auth-helpers=»SMB»). Но хелпер Squid не умеет
работать с winbindd, входящим в комплект Samba 3.x. И конечно, хелпер,
обслуживающий запросы Internet Explorer, должен располагаться перед
хелпером, принимающем пароль со стандартного ввода.

Отличительной (и приятной) особенностью работы данного хелпера является
то, что при общении с Internet Explorer имя пользователя передается в
лог без доменной части (myusername вместо MYDOMAINmyusername при
взаимодействии с хелперами, входящими в комплект Squid).

Стоит отметить еще одну особенность данного хелпера — для нормальной
работы ему необходим доступ к pipe winbindd, который по умолчанию
располагается в /var/db/ samba/winbindd_privileged. Собственно pipe
имеет права 0777, но каталог, в котором он находится, имеет права 0750.

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

    chown root:squid
/var/db/samba/winbindd_privileged

Squid 2.5, Samba и наличие пользователей в определенной группе

Модифицируем нашу систему дальше. Сделаем так, чтобы пользователь мог
получить доступ к прокси-серверу, только если его учетная запись
находится в группе My Proxy. Для решения этой проблемы можно
использовать как стандартные аутентификаторы прокси-сервера (ntlm_auth и
wbinfo_group), так и аутентификатор ntlm_auth из комплекта сборки
Samba. Рассмотрим каждый вариант.

Использование аутентификаторов из комплекта прокси-сервера

Для того чтобы использовать аутентификаторы прокси-сервера вместе с
Samba (версия не имеет значения), необходимо использовать другие
программы-хелперы.

Для использования хелперов  из комплекта прокси-сервера задача
аутентификации разбивается на две части -используется хелпер ntlm_auth
и внешняя
программа wbinfo_group.pl, представляющая из себя скрипт на языке Perl.
Перестраиваем конфигурацию аутентификаторов следующим образом:

    auth_param ntlm program
/usr/local/libexec/ntlm_auth
       
MY_DOMAIN\dconeMY_DOMAIN\dctwo auth_param ntlm children 5
    auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes
    auth_param basic  
program /usr/local/libexec/wb_auth
    auth_param basic  
children 5
    auth_param basic  
realm Squid proxy-caching web server
    auth_param basic  
credentialsttl 2 hours

Здесь dcone и dctwo — соответственно первый и второй контроллеры домена
(имеются в виду NetBIOS-имена). Следует заметить, что здесь мы меняем
только конфигурацию для браузеров, которые умеют работать с
конструкциями MY_DOMAINmyname и не меняем конфигурацию для прочих
браузеров. Кроме того, в секцию external_acl_type мы добавляем
дополнительную внешнюю программу wbinfo_ group.pl (для установки данной
программы следует указать:

    —with-external-acl-helpers=»wbinfo
group»

в строке запуска configure при сборке прокси-сервера, последняя версия
Makefile в портах установит его по умолчанию) таким образом:

    external acl type ntgroup
concurrency=5%LOGIN
       
/usr/local/libexec/wbinfo_group.pi

Что мы сделали: задали использование внешней программы-аутентификатора,
с именем ntgroup (будет использоваться при задании ACL), пять
одновременно работающих копий в памяти, передаваться ей будет
регистрационное имя, в ответ программа должна вернуть ОК или ERR, в
зависимости от проверяемого условия.

Кроме того, изменяем условие предоставления доступа к прокси-серверу на
следующее:

    acl
NTDCgroup      
external       
ntgroup  Internet
    acl
NTLMauth       
proxy_auth      REQUIRED
   
http_access      
 
allow        
 
NTLMauth NTDCgroup

С условием NTLMauth мы уже знакомы — оно задает представление доступа
только в случае успешного возврата от хелперов аутентификации. Условие
NTDCgroup задает вызов внешней программы, описанной в условии ntgroup,
при этом в качестве параметра внешней программе передается имя группы,
вхождение в которую должно быть проверено. В данном примере это группа
Internet. Доступ к прокси будет предоставлен только в случае
одновременного выполнения обоих условий.

Достоинством данного метода является независимость его от версии Samba
— wb_ntlmauth и wbinfo_group работают путем передачи команд демону
winbindd — можно спокойно перейти с версии Samba 2.x на версию 3.x и не
заметить момент перехода.

Использование аутентификаторов из комплекта Samba (только Samba 3.x)

Поскольку хелперы прокси-сервера не умеют работать с winbindd демоном
из сборки Samba 3.x, рекомендуется отказаться от их применения и
использовать хелпер ntlm_auth из сборки прокси-сервера (не путать с
одноименным хелпером из сборки Samba! Хелпер прокси-сервера обычно лежит
в /usr/local/libexec, а хелпер Samba — в /usr/local/bin). Кроме того,
использование wbinfo_group.pl имеет один отрицательный момент — это
скрипт, он написан на языке Perl, следовательно, в оперативной памяти
постоянно находится некоторое количество копий процесса perl,
интерпретирующего скрипт.

Отказ от wbinfo_group.pl позволит сократить объем требуемой памяти.
Использование аутентификаторов из комплекта Samba значительно проще: не
нужно никаких внешних программ, не нужно никаких дополнительных правил
-сам хелпер ntlm_auth имеет параметр -require-membership-of=»Group».
Поэтому возвращаем наше правило, регулирующее доступ к прокси-серверу,
к виду, описанному в разделе «Samba 2.5 и Samba 2.2.x».

    http_access
allow    NTLMauth

и заменяем хелперы из поставки squid на хелпер ntlm_auth из
поставкиsamba следующим образом:

    auth_param ntlm program
/usr/local/bin/ntlm_auth
       
—helper-protocol=squid-2.5-ntlmssp      
 
—require-membership-of=»MYDOMAIN+My
Proxy»     auth_param ntlm children
5
    auth_param ntlm max_challenge_reuses 0
    auth_param ntlm max_challenge_lifetime 2
minutes
    auth_param basic program
/usr/local/bin/ntlm_auth
       
—helper-protocol=squid-2.5-basic
—require-membership-of=»MYDOMAIN+MyProxy»
    auth_param basic children 5
    auth_param basic realm Squid
proxy-caching web server
    auth_param basic credentialsttl 2 hours

Здесь «My Proxy» — группа, присутствие в которой дает право
пользоваться прокси-сервером. На что следует обратить внимание — в
значении параметра
-require-membership-of задана запись «MYDOMAIN+My Proxy». В этой записи
«My Proxy» — название группы, а знак «+» — это значение параметра
«winbind separator» из конфигурационного файла Samba smb.conf. В
сервере, на котором проводилось тестирование, параметр задан следующим
образом:

    winbind separator = +

Если у вас используется другой символ, его следует указывать вместо
знака «+» (в противном случае хелпер не сможет определить принадлежность
к группе и пользователь не получит доступа к прокси в конечном итоге).
Следует иметь в виду, что данное значение параметра winbind separator
не является значением по умолчанию для самбы. По умолчанию значением
является «» (обратная косая черта). Но использование этого символа в
командах, передаваемых в shell, как правило, чревато необходимостью
«защищать» его от того, чтобы shell не воспринял его как служебный,
поэтому был выбран другой символ. Хотя, например, man smb.conf не
рекомендует использовать именно «+» чтобы избежать возможных проблем с
NIS.

Если какой-либо из приведенных способов не работает

Отнюдь не факт, что любой описанный здесь метод заработает с первого
раза. Мне приходилось немало проверять, перепроверять и тестировать
конфигурационные файлы, прежде чем начинал работать какой-либо из
методов, хотя в конечном итоге работали все методы. Если какой-либо
браузер (Mozilla, например, но не Internet Explorer) запрашивает пароль
и не реагирует как положено на правильный, следует:

— Убедиться, что пароль введен правильно.

— Посмотреть лог cache.log в каталоге логов прокси-сервера —
хелперы   выводят сообщения об ошибках туда.

— Проверить правильность написания путей в правилах задания хелперов.

— Проверить наличие самих хелперов по указанным путям и достаточность
прав
  на запуск хелперов из-под пользователя, от имени которого
работает   прокси-сервер (обычно это squid из группы
squid).

— Если хелперы запускаются, следует обратить внимание на моменты
их   запуска — если ntlm_auth, например, не может
установить
связь с   контроллером домена, он сообщит об этом.

— Если используются хелперы на базе winbindd, следует
проверить   работоспособность winbindd-демона
(команды приводились выше).

— Если задействован хелпер ntlm_auth из поставки Samba -его
можно   запустить в режиме отладки с консоли,
приказав выводить
максимально   подробную отладочную информацию. В
случае успешного запуска следует   ввести через
пробел имя и пароль пользователя, как показано
ниже. Для   выполнения данной команды достаточно прав
пользователя, имеющего доступ   к каталогу
/var/db/samba/winbindd_privileged

    > ntlm_auth
—helper-protocol=squid-2.5-basic
       
—require-membership-of=»MYDOMAINZMy Proxy» -d10 -I /tmp [2004/08/29
       
23:15:22, 5] lib/debug.c:debug_dump_status(367)

    INFO: Current debug levels:
    all: True/10
    tdb: False/0
    printdrivers: False/0
    lanman: False/0
    smb: False/0
    rpc_parse: False/0
    rpc srv: False/0
    rpc_cli: False/0 passdb: False/0 sam:
False/0 auth: False/0 winbind:
    False/0 vfs: False/0 idmap: False/0
quota: False/0 acls: False/0

В ответ на запрос программы вводим имя пользователя testuser, пароль
123456.

    [2004/08/29 23:16:21, 10]
utils/ntlm_auth.c:manage_squid_request(1621)
       
Got ‘testuser 123456’ from squid (length: 15).
    [2004/08/29 23:16:21, 3]
utils/ntlm_auth.c:check_plaintext_auth(292)
       
NT_STATUS_OK: Success (0x0) OK

Всегда используйте для тестирования только подобных
«пользователей»,потому что пароль виден на консоли, а также может
остаться в файлах .history, .bash_history или .mc/history!

Проверить права доступа на каталог
/var/db/samba/winbindd_privileged,если используется хелпер ntlm_auth из
поставки Samba. При недостаточных
правах хелпер может выдавать в файл регистрационного журнала cache.log
сообщения, из которых совершенно невозможно понять, чего ему не хватает
для нормальной работы. При большом количестве запросов следует
пропорционально увеличить количество загружаемых хелперов (параметр
auth_param <method> children). При недостаточном
количестве хелперов запросы на аутентификацию ставятся в очередь и при
переполнении очереди прокси может аварийно завершить работу. Также
следует обеспечить
постоянную доступность контроллера домена, потому что при плохой связи
с контроллером домена запросы на аутентификацию опять же ставятся в
очередь, и прокси может аварийно завершить работу при большом
количестве хелперов, ожидающих ответа от контроллера домена.

Дополнительные замечания

О безопасности передаваемых данных

Эксперименты показали, что при использовании всех хелперов, кроме
ntlm_auth из комплекта Samba 3.x и wb_ ntlmauth из комплекта squid,
пароль, передаваемый на проверку контроллеру домена, передается в
открытом виде, и лицо, имеющее возможность перехвата сетевого трафика с
данного компьютера, сможет узнать пароли. Программы ntlm_auth из
комплекта Samba 3.x и wb_ntlmauth из комплекта squid используют для
работы с контроллером домена протокол NTLM SSP, и пароль не передается
по сети в открытом виде даже при указании

—helper-protocol=squid-2.5-basic (этот параметр определяет не протокол
работы хелпера с контроллером домена, а протокол работы хелпера со
сквидом).

О преобразовании логинов из формата MYDOMAIMmyusername

Хелпер wb_ntlmauth записывает в лог полученный от пользователя логин в
виде MYDOMAINmyusername, в то время как хелпер wb_auth записывает его в
формате myusername.

Для того чтобы использовать полученные данные в какой-либо программе
расчета статистики, необходимо унифицировать данные. Я делаю это
удалением домена и приведением всех логинов к формату myusername. Для
этого мной была разработана пара скриптов на языках shell и awk,
которые делают следующее:

Удаляют из лога строки TCP_DENIED/407, которые генерируются браузером
Internet Explorer.

Удаляют доменную часть имени пользователя, если оно представлено в
формате MYDOMAINmyusername.

Если DNS-имя компьютера или его IP-адрес совпадает с DNS-именем или
IP-адресом, указанным в файле доверенных адресов, то в поле имени
пользователя вписывается имя, указанное в данном файле. (Если
используется как авторизация по регистрационному имени, так и
авторизация по IP-адресу, то для обработки статистики некоторым
IP-адресам жестко сопоставляется определенное имя.) Формат файла
доверенных адресов очень прост: по одной записи на строке DNS-имя или
IP-адрес компьютера и через пробел — имя пользователя, которое будет
подставляться. Например:

    192.168.1.1 alice
    192.168.1.2 bob

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

    #!/bin/sh
    # This is a part of SquidCount package
version 1.11.4
    # Daily squid proxy statistic maintenance
    # Written by CityCat 25.10.2001.
Copyright Granch Ltd. (C)
    # This is a public software, distributed
with a BSD license.
    # $Id: squidcount,v 1.11.4.6 2004/07/21
12:53:02 shelton Exp $
   
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
   
trustlist=»/usr/local/etc/sarg2/sargtrusted»
    inlog=»/var/log/squid/access.log»

    # Check on presence trusted hosts list
    if [ -e $trustlist ]; then
       
hosts=`awk ‘{if ($1 == «#») nextline; else print $1}’ <
$trustlist`
       
tusers=`awk ‘{if ($1 == «#») nextline/ else print $2}'<
$trustlist`
    else
       
logger -i -p daemon.err -t sqcount Trust list empty, will skip
prepare1st stage… hosts=»»
       
tusers=»»
    fi
    
    # When trusted host list is presented,
replace according
    # by them…
    
    if [ ${#hosts} -ne 0 ]; then
       
awk -f /usr/local/sbin/awksquid -v hosts=»$hosts» -v tusers=»$tusers»
< $inlog > tmp/tmpaccess.log
    else
       
cp $inlog /tmp/tmpaccess.log
    fi
    
Далее приведен скрипт чтения файла регистрационного журнала,
реализованный на языке awk. Это рабочий скрипт, который я использую для
расчета статистики загрузки канала.

    #!/usr/bin/awk -f
    #This is a part of SquidCount package
version 1.11.4 Squid log
    # preparation to count #statistic
Developed by Rashid N. Achilov.
    # Copyright Granch Ltd. (C) Thisi is a
public #software, distributed with
    # BSD license. Externals: hosts =
<list of hosts with #trusted users>

    tusers = <list of trusted user
logins, correspoding hosts)

    # When $8 is «-» and $2 == one of
trusted hosts, instead of «-» set strusted login,
    # correspond this host
    # When $4 is «TCP_DENIED/407» skip this
line (and f*ck MS IE!)
    # $Id: awksquid,v 1.11.4.2 2003/08/06
03:28:54 shelton Exp $

    BEGIN {
       
split(hosts,harray)
       
split(tusers,tuarray)
if  
($4  ==  «TCP_DENIED/407»)
next
subind = index($8,»\»)
if (subind != 0) {
subname = substr($8,subind + 1) printf(«%s %6s %s %s %s %s %s %s %s %s
«, J
$1,$2,$3,$4,$5,$6,$7,subname,$9,$10) next }
for (i = l;harray[i] != «»;i++) {
if ($3 == harray[i]) {
if ($8 == «-«) { printf(«%s %6s %s %s %s %s %s %s %s %s
«, J $1,$2,$3,$4,$5,$6,$7,tuarray[i],$9,$10) break

if (harray[i] == «») print $0

Заключение

В данной статье были рассмотрены несколько способов авторизации
пользователя домена Windows на прокси-сервере squid с использованием
контроллера домена Windows. Выбор конкретного способа зависит только от
используемой версии Samba и не зависит от типа контроллера домена
Windows (схема с авторизацией через Samba 2.x и хел-перы Squid работала
достаточно долгое время в домене Windows NT, потом совершенно незаметно
была перенесена в домен Windows 2000). Samba 3.x мне кажется наиболее
перспективным решением с наиболее простым вариантом конфигурации.

Автор Рашид Ачилов
Взято с http://www.Opennet.ru

Назначение
Примеры установки
Полезные ключи configure
Ключи запуска squid
Формат squid.conf
Управление squid (Cache Manager)
Сколько надо памяти
Алгоритмы замещения кеша (LRU, GDSF, LFUDA)
Какие объекты кешируются
Приемы конфигурации, в т. ч.
Справедливый дележ канала (delay pool)
redirector, как средство оптимизации
Squid как transparent proxy
Борьба с баннерами
squidGuard — блокировка доступа к "нехорошим" сайтам
Борьба с вирусами
Использование дополнительного канала для доступа в Интернет
Обработка статистики
Статистика использования
SNMP статистика
мониторинг с помощью rrdtool
Извлечение и удаление объектов из кеша (purge)
Ссылки

Назначение

Представляет собой HTTP, FTP, gopher, SSL и WAIS (убрано в 2.6) proxy, кеширующий запросы. Также кеширует DNS. Один процесс на всех, неблокированный ввод/вывод, держит часто используемые объекты в виртуальной памяти. Бесплатен (GPL). Основан на проекте Harvest. Поддерживает иерархию или сеть серверов (ICP/UDP — Internet Cache Protocol, HTCP/TCP, multicast). Откуда брать объект определяется так (в упрощенном виде): послать ICP/HTCP/multicast запросы ко всем подходящим соседям; подождать определенное время; загрузить с первого соседа, пославшего HIT; иначе загрузить с первого отца, ответившего MISS; иначе загрузить с первоисточника. Предусмотрены различные методы оптимизации для выбора наиболее быстрого источника.

Делается различие между частными и общими объектами. Кешируются только общие объекты. Только метод GET дает общие объекты. Объекты, попавшие в стоп-лист есть частные объекты. Если запрос содержит аутентификационную информацию или ответ типа "401 Unauthorized" — это частный объект.

cache digest — очень компактная форма представления какие объекты имеются в кеше. Кеши могут обмениваться этой информацией с соседями, чтобы избежать необходимости делать ICP-запросы. В качестве ключей объектов используется MD5.

Текущая стабильная версия: Squid 2.6-STABLE12; готовится к выходу 3.0 (отличия 2.6.STABLE12 от 2.5.STABLE14, 2.5.STABLE14 от 2.5.STABLE6, 2.5.STABLE6 от 2.4, 2.4 от 2.3, 2.3 от 2.2).
Установка

Полезные ключи ./configure (—help, squid -v)
 

  • —prefix=/usr/local/squid (куда инсталлировать файлы, также имеется множество дополнительных ключей для тонкой настройки расположения файлов)
  • —enable-async-io=число-нитей (подразумевает —with-aufs-threads=число-нитей, —with-pthreads, —enable-storeio=ufs,aufs)
  • —enable-storeio="список-методов-хранения" (ufs — unix file system; aufs — async unix file system; diskd — отдельные процессы для асинхронного доступа к файлам; null — не хранить данные на диске; coss — файловая система COSS)
  • —enable-icmp (измерять путь до каждого HTTP-сервера при запросах с помощью ICMP, используется для оптимизации выбора сервера или соседа)
  • —enable-htcp (HTCP — вариант ICP по TCP, синхронизация кеша с соседями)
  • —enable-forw-via-db (включить поддержку БД Forw/Via для оптимизации выбора сервера или соседа)
  • —enable-cache-digests (использовать Cache Digests для оптимизации выбора сервера или соседа)
  • —enable-carp (включить балансировку с помощью CARP — Cache Array Routing Protocol; в новых версиях его надо наоборот отключать: —disable-carp)
  • —disable-wccp (не включать поддержку протокола WCCP — Web Cache Coordination Protocol — позволяет Cisco IOS автоматически распознавать падение сервера)
  • —disable-wccpv2
  • —enable-delay-pools (управление ограничением трафика)
  • —enable-useragent-log (журнализовать заголовок Useragent)
  • —enable-referer-log (журнализовать заголовок Referer)
  • —enable-forward-log (поддержка директивы forward_log, в 2.6)
  • —enable-kill-parent-hack (помогает сделать shutdown чисто)
  • —enable-snmp (включить SNMP сервер для мониторинга)
  • —enable-arp-acl (поддержка ACL, основанных на ethernet MAC адресах)
  • —enable-cachemgr-hostname=имя-хоста (cachemgr.cgi будет по умолчанию натравлен на этот хост)
  • —enable-err-language=языки-для-сообщений-об-ошибках (по умолчанию — все)
  • —enable-default-err-language=язык-сообщений-об-ошибках (Russian-1251?)
  • —enable-gnuregex (вместо regex, плохо работающего в старых Linux)
  • —enable-poll (можно использовать poll, epoll или select; poll быстрее, но не на всех платформах работает; обычно выбор делается автоматически, но если вы умнее configure, то можете это проверить)
  • —disable-poll
  • —enable-select
  • —disable-select
  • —enable-select-simple (использовать только простое подмножество select)
  • —enable-epoll
  • —disable-epoll
  • —disable-http-violations (игнорировать все строки в конфигурации, которые нарушают стандарты HTTP)
  • —enable-ipf-transparent (разрешить поддержку transparent proxy для систем, использующих IP-Filter — в ядре Linux 2.2 и без этого хорошо)
  • —enable-pf-transparent (разрешить поддержку transparent proxy для систем, использующих PF network address redirection)
  • —enable-linux-netfilter (transparent proxy для ядра Linux 2.4)
  • —enable-large-cache-files (позволяет хранить в кеше файлы размером более 2GB; при этом меняется формат хранения; 2.6)
  • —enable-linux-tproxy (поддержка Netfilter TPROXY)
  • —disable-ident-lookups (ident в современном мире — вещь бесполезная)
  • —disable-internal-dns (вместо внутренних запросов использовать внешние процессы dnsserver; рекомендуется для версий до 2.4)
  • —enable-truncate (обнулять файлы вместо их удаления: быстрее, но требует много inode; были проблемы, когда переполнялась таблица inode; наверное, параметр minimum_object_size из-за этого появился; не рекомендуется для асинхронного ввода/вывода)
  • —disable-unlinkd (запретить использование внешних процессов для удаления файлов)
  • —enable-underscores (позволять подчеркивания в именах хостов, надеясь что резолвер их не обрежет; в 2.6 заменён директивой squid.conf)
  • —enable-heap-replacement (использовать улучшенные алгоритмы замещения кеша вместо стандартного LRU, в версиях Squid до 2.4; в новых версиях рекомендуется использовать —enable-removal-policies)
  • —enable-removal-policies="lru,heap" (улучшенные алгоритмы замещения кеша вместо стандартного LRU, в версиях Squid 2.4 и выше)
  • —enable-dlmalloc (своя библиотека malloc, не быстрая но без memore leak)
  • —enable-ssl (включить поддержку работы в качестве шлюза SSL с помощью OpenSSL)
  • —enable-auth="список методов аутентификации" (по умолчанию только basic; вместе со squid поставляются: basic, digest, ntlm, negotiate; имеется множество дополнительных ключей, позволяющих настраивать отдельные методы аутентификации:
  • —enable-basic-auth-helpers="список программ для аутентификации basic" (в комплекте имеются: getpwnam, LDAP, MSNT (обращается к NT серверу), mswin_sspi (только под MS Windows NT?), multi-domain-NTLM, NCSA, PAM, SASL, SMB, YP)
  • —enable-ntlm-auth-helpers="список программ для аутентификации ntlm" (в комплекте имеются: fakeauth (проверяет только синтаксис запроса), mswin_sspi (только под MS Windows NT?), no_check (проверяет только синтаксис запроса), SMB (обращается к контроллеру домена)
  • —enable-ntlm-fail-open (делать клиентам "поблажки")
  • —enable-digest-auth-helpers="список программ для аутентификации digest" (в комплекте имеются: password, ldap)
  • —enable-negotiate-auth-helpers="список программ для аутентификации negotiate" (в комплекте имеются: mswin_sspi (только под MS Windows NT?))
  • —enable-external-acl-helpers="список программ для проверки ACL" (в комплекте имеются: ip_user, ldap_group, mswin_lm_group, session, unix_group, wbinfo_group)
  • —enable-follow-x-forwarded-for (отслеживать цепочку X-Forwarded-For, 2.6)
  • —with-large-files (журналы и пр.)
  • —with-maxfd=число-дескрипторов
  • —with-openssl= (в CentOS надо указать /usr/kerberos)

Ключи запуска squid
 

  • -a порт (TCP порт для входных HTTP запросов, 3128)
  • -d (отладка на stderr)
  • -f имя-файла-конфигурации
  • -h (help)
  • -k (послать команду работающему серверу, номер процесса из squid.pid?)

    • reconfigure (посылка сигнала HUP — разобрать заново файл конфигурации)
    • rotate (rotate журналы; сигнал USR1)
    • shutdown (сигнал TERM)
    • interrupt (shutdown без паузы; сигнал INT)
    • kill (даже не закрыв журналы; сигнал KILL)
    • debug (начать/закончить полную трассировку; сигнал USR2)
    • check (сигнал ZERO)
    • parse (проверить синтаксис squid.conf)
  • -l facility (источник для записей в syslog)
  • -s (level 0 debugging to syslog в дополнение к выводу в файл)
  • -u порт (UDP порт для входных ICP запросов, 3130)
  • -v (напечатать версию параметры сборки)
  • -z (создать дисковый кеш при первом запуске)
  • -C (не отлавливать сигналы к завершению)
  • -D (не делать DNS-тест при запуске)
  • -F (восстановление после сбоя не в фоновом режиме)
  • -N (не становиться фоновым процессом)
  • -R (не устанавливать REUSEADDR на порту)
  • -V (поддержка виртуальных хостов для режима акселерации — аналогично "httpd_accel_host virtual" в конфигурационном файле)
  • -X (включить отладку при разборе конфигурационного файла)
  • -Y (более быстрое восстановление после сбоев)

Формат squid.conf
 

  • сетевые параметры сервера

    • http_port 3128 (порт для запросов клиентов); в версии 2.3 можно указывать перед портом имя хоста или IP-адрес
    • https_port порт (обработка SSL/TLS запросов в режиме акселерации; в качестве опций указывается файл с сертификатом, приватный ключ, версия SSL/TLS, тип шифрования)
    • ssl_unclean_shutdown off
    • icp_port 3130 (если соседей не ожидается, то поставить "icp_port 0")
    • htcp_port 4827 (порт для общения с соседями — ICP — через TCP, нужен "—enable-htcp" в configure, иначе его нельзя устанавливать даже в 0)
    • mcast_groups 239.128.16.128 224.0.1.20 (к каким multicast группам подсоединяться для получения ICP, если используется multicast; для раздачи используется cache_peer; не трогать)
    • tcp_incoming_address 0.0.0.0 (по какому адресу принимать входные пакеты, если хост имеет несколько интерфейсов; в 2.3 убран)
    • tcp_outgoing_address 0.0.0.0 [[!]acl] (при посылке ставить указанный адрес в качестве исходного; в 2.5 появилась возможность задавать ACL)
    • udp_incoming_address 0.0.0.0 (по какому адресу принимать пакеты ICP)
    • udp_outgoing_address 255.255.255.255 (с какого адреса должны выходить пакеты ICP; по умолчанию — с того же, что и приходят)
    • tcp_outgoing_tos TOS-биты [!]acl (установка битов приоритета траффика в зависимости от ACL)
    • tcp_recv_bufsize 0 bytes (0 означает, что надо использовать размер буфера по умолчанию)
    • incoming_icp_average 6
    • incoming_http_average 4
    • incoming_dns_average 4
    • min_icp_poll_cnt 8
    • min_http_poll_cnt 8
    • min_dns_poll_cnt 8
  • соседи (neighbour, peer)

    • cache_peer hostname type proxy-port icp-port options (каждый сосед описывается отдельной строкой)
    •  

      • type
    •  

      •  

        • parent — старший в иерархии (если запрос отсутствует в локальном кеше, то он направляется к parent, тот — при отсутствии в своем кеше — пересылает запрос дальше и возвращает готовый ответ подчиненному в иерархии; если squid получает от parent TCP_DENIED, то он лезет напрямую)
        • sibling — одного уровня (если запрос отсутствует в локальном кеше, то он направляется к sibling, тот — при отсутствии в своем кеше — сразу возвращает сообщение об этом, ничего не предпринимая)
        • multicast
    •  

      • options
    •  

      •  

        • proxy-only (объекты, взятые с этого узла не хранить у себя)
    •  

      •  

        • weight=число (число от 1, по умолчанию — 1, чем больше, тем больше приоритет при прочих равных)
        • ttl=число (TTL в посылаемых ICP пакетах при использовании multicast)
        • no-query (не посылать ICP запросы — только принимать)
        • default (самый старший в иерархии, используемый как last-resort)
        • round-robin (определяет множество старших кешей, используемых по очереди)
        • multicast-responder (данный сосед является членом multicast группы, запрос к нему посылается через multicast, но запросы от него будут обрабатываться и так)
        • closest-only (при ответах ICP_OP_MISS не передавать FIRST_PARENT_MISS)
        • no-digest (не запрашивать от этого соседа cash-digest)
        • no-netdb-exchange (не запрашивать у этого соседа ICMP RTT — round trip time — NetDB)
        • no-delay (при перегрузке delay pool не лезть к этому соседу)
        • login=user:password (если старший в иерархии proxy требует аутентификации)
        • login=PASS (передавать имя/пароль пользователя вышестоящему прокси)
        • connect-timeout=
        • digest-url=URL
        • allow-miss (передавать соседям запросы не только в режиме only-if-cached; может порождать циклы)
        • max-conn=число (максимальное число соединений с данным соседом)
    • cache_peer_domain host domain [domain…]
    • ограничить запросы к данному соседу данным списком доменов (можно использовать отрицание с помощью восклицательного знака)
    • neighbor_type_domain parent | sibling domain…
    • модифицировать тип соседа при запросах к данному домену
    • icp_query_timeout milisec (по умолчанию определяется автоматически для каждого соседа)
    • maximum_icp_query_timeout milisec
    • mcast_icp_query_timeout milisec (по умолчанию 2000 ms, ожидание ответа на регулярные multicast опросы)
    • dead_peer_timeout 10 seconds (как долго ждать прежде, чем объявить соседа "мертвым")
    • hierarchy_stoplist (список строк — через пробел, — при встрече которых в URL, запрос будет направлен сразу напрямую, а не "по соседям"; по-умолчанию — "cgi-bin ?")
    • minimum_direct_hops 4 (If using the ICMP pinging stuff, do direct fetches for sites which are no more than this many hops away)
    • minimum_direct_rtt400 (при использовании ICMP ping для вычисления близости серверов, использовать только тех соседей, которые отзываются быстрее указанного числа милисекунд)
    • icp_hit_stale on|off (возвращать ли ответ ICP_HIT для зачерствевших объектов; по умолчанию — off)
    • netdb_low 900
    • netdb_high 1000 (нижняя верхняя границы для базы данных измерения ICMP)
    • netdb_ping_period 5 minutes (минимальное время между ping-ами в одну и ту же сеть)
    • query_icmp on|off (должны ли соседи включать в ICP ответы ICMP данные; соответствующие данные собираются если сосед сконфигурирован с —enable-icmp, в это случае он измеряет путь до http-сервера помощью ICMP, выключен по умолчанию)
    • test_reachability on|off (если включить, то ответ ICP_MISS будет заменяться на ICP_MISS_NOFETCH если сервер отсутствует в ICMP базе данных или RTT равен нулю)
    • retry_on_error off (повторять запрос к соседу после получения сообщения об ошибке)
    • mcast_miss_addr адрес (по этому multicast адресу посылается сообщение при каждом cache miss)
    • mcast_miss_port порт
    • mcast_miss_encode_key ключ
    • nonhierarchical_direct on (запросы из hierarchy_stoplist и некешируемых типов будут направляться к первоисточнику, off — к родительскому кешу)
    • prefer_direct on (если никакая методика — ICP, HTCP, digest — не указали родительский кеш, то напрвлять запрос к первоисточнику; off — к родительскому кешу)
  • размер кеша и параметры кеширования, параметры запросов

    • cache_mem 8 MB (объем оперативной памяти, используемой для хранения обрабатываемых объектов; если требуется, то этот лимит может быть слегка превышен; если осталось свободное место, то оно используется для хранения наиболее часто используемых объектов отрицательных ответов; память используется и под другие нужды — индекс объектов — на каждый объект требуется около 100 байт ОП; если средний размер объекта 9КБ (в очень старом руководстве говорится — 20КБ, в более новом — 13КБ, у меня — 9КБ, как измельчал интернет!),  то на 8ГБ диска понадобится 100МБ ОП только под индекс объектов; еще понадобится память под кеш IP-адресов, fqdn-кеш и др.)
    • cache_dir тип имя-директории Mbytes Level-1 Level2[read-only] [max-size=число] (определяет имя, размер и количество поддиректорий на первом и втором уровне кеша на диске — каждый кешируемый объект кладется в отдельный файл, файлы не сваливаются в одно место, а разносятся в двухуровневой иерархии директорий; можно иметь несколько директорий под кеш — особенно полезно иметь их на разных дисках; эксперимент показал, что при кэше в 700 МБ используется только 2 директории первого уровня; при стандартной структуре директорий кеша в него "с комфортом" влезает миллион объектов (9 GB), если их больше, то надо увеличить число директорий верхнего уровня; тип кеша указывается начиная с версии 2.3: ufs (unix file system), aufs (async ufs), diskd (внешние процессы для избежания блокировки squid на дисковом вводе/выводе); директорию верхнего уровня надо создавать самому; поддиректории создаются командой squid -z)
    • cache_swap_log полное-имя-файла (это не журнал, а оглавление кеша на диске)
    • cache_swap_high 95 (при достижении данного уровня заполнения кеша — в процентах — начинается ускоренный процесс удаления старых объектов; для большого кеша эти границы надо поднять, 5% от 8 GB — это 400 MB!)
    • cache_swap_low 90 (процесс удаления старых объектов заканчивается, если достигнут данный уровень)
    • maximum_object_size 4096 KB (максимальный размер кешируемого объекта; если его увеличишь, то съэкономишь трафик, если уменьшишь, то странички быстрее грузиться будут — хотя можно просто увеличить размер кеша; максимальный размер объекта, который удалось за раз скачать по модему — 8 MB)
    • minimum_object_size 0 KB (файлы меньшего размера не сохраняются; введено в 2.3-STABLE3
    • maximum_object_size_in_memory 8 KB
    • ipcache_size 1024 (размер кеша для IP адресов)
    • ipcache_high 95 и ipcache_low 90 (верхний и нижний уровень заполнения IP кеша для алгоритма удаления старых объектов по LRU)
    • fqdncache_size 1024 (размер кеша fqdn — полных доменных имен)
    • cache_replacement_policy policy (алгоритмы замещения объектов в кеше: lru, heap GDSF, heap LFUDA или heap LRU; действует на последующие cache_dir)
    • memory_replacement_policy policy
    • memory_pools on|off (по умолчанию, однажды захваченная, но ныне не используемая память не отдается обратно в систему, off позволяет освобождать ее)
    • memory_pools_limit байт (максимальное количество неиспользуемой памяти, которое squid будет придерживать; если 0, то придерживать все, что было захвачено; см. memory_pools)
    • request_size 100 KB (максимально возможный размер запроса; если клиент загружает файлы с помощью метода POST, то необходимо увеличить допустимый размер) — убран в версии 2.3
    • request_header_max_size 10KB (появился в 2.3)
    • request_body_max_size 1 MB (появился в 2.3; в новых версиях по умолчанию — без ограничений)
    • reply_header_max_size 20 KB (появился в 2.5)
    • reply_body_max_size 0 allow | deny all (появился в 2.3; в версии 2.4 появилась возможность задать ACL)
    • refresh_pattern [-i] regex MIN_AGE percent MAX_AGE[options]
используется, чтоб определить не устарел ли объект в кеше. Имя объекта сравнивается по очереди с регулярными выражениями в строках refresh_pattern до первого совпадения, параметры из соответствующей строк используются в алгоритме проверки "на свежесть". По умолчанию, регулярные выражения различают прописные/строчные буквы, чтобы игнорировать это различие, используется ключ "-i". MIN_AGE и MAX_AGE- время в минутах (MAX_AGE также используется, если приходится делать запрос к соседям (Cache-Control: Max-age=nnn) ). procent — целое число. OBJ_DATE — время извлечения объекта с исходного сервера (заголовок HTTP Date). OBJ_LASTMOD — время последнего изменения объекта (заголовок HTTP Last-Modified). OBJ_AGE = NOW — OBJ_DATE (как давно мы его извлекли). LM_AGE = OBJ_DATE — OBJ_LASTMOD (насколько стар был объект в момент извлечения). LM_FACTOR = OBJ_AGE / LM_AGE. CLIENT_MAX_AGE — максимальный возраст объекта, который удовлетворит клиента (HTTP/1.1 Cache-Control: ). EXPIRES — срок хранения объекта (из ответа сервера, если есть). В общих чертах алгоритм описан так:
если (определен CLIENT_MAX_AGE)
    если (OBJ_AGE > CLIENT_MAX_AGE)
        то (объект старый)
если (определен EXPIRES) {
    если ( EXPIRES <= NOW)
    то (объект старый)
    иначе (объект свежий)
}
если (AGE > MAX_AGE) то (объект старый)
если (OBJ_DATE > OBJ_LASTMOD ) {
    если (LM_FACTOR меньше PERCENT) то (объект свежий)
    иначе (объект старый)
}
если (AGE <= MIN_AGE) то (объект свежий)
(объект старый)

 

По умолчанию (я эти числа изрядно увеличиваю):
  1. refresh_pattern ^ftp: 1440 20% 10080
  2. refresh_pattern ^gopher: 1440 0% 1440
  3. refresh_pattern . 0 20% 4320
options
  • override-expire — нарушение стандарта HTTP! — использовать min даже если явно задан expire
  • override-lastmod — использовать min даже для недавно модифицированных объектов
  • reload-into-ims — нарушение стандарта HTTP! — преобразует клиентские запросы типа no-cache в If-Modified-Since
  • ignore-reload — нарушение стандарта HTTP! — игнорировать заголовки no-cache или reload в запросах клиентов
  • replacement_policy GDSF | LFUDA (частотные алгоритмы замещения объектов в кеше вместо LRU; требуется —enable-heap-replacement при сборке; в версии 2.4 расслоился на cache_replacement_policy и memory_replacement_policy)
  • reference_age 1 year (максимальное время хранения неиспользуемого объекта до его удаления по LRU алгоритму; если места на диске не хватает, то автоматически уменьшается)
  • quick_abort_min 16 KB (если клиент оборвал запрос, а осталось докачать всего min KB, то squid докачает)
  • quick_abort_max 16 KB (если клиент оборвал запрос, и осталось качать больше max KB, то прекратить)
  • quick_abort_pct 95 (если клиент оборвал запрос, а уже получено больше чем pct процентов объекта, то докачать)
  • read_ahead_gap 16 KB (размер буфера упреждающего чтения)
  • negative_ttl 5 minutes (некоторые негативные ответы тоже кешируются — "connection refused "и "404 not found" — ttl задает их время жизни в кеше; по-моему, хватит и 1 минуты)
  • range_offset_limit 0 KB (если клиент делает запрос с середины объекта, то offset_limit равный -1 вынуждает squid загрузить весь объект в кеш до того как начать передачу клиенту — скажем 17го мегабайта 😉 -; offset_limit равный 0 означает. что squid никогда не будет грузить больше, чем клиент запросил; offset_limit равен определенному числу означает, что squid будет грузить весь объект, если начало запроса меньше этого числа)
  • no_cache deny имя-ACL (определяет список объектов, которые не будут кешироваться; по-умолчанию, кешируется все, хотя рекомендуется определить "acl QUERY urlpath_regex cgi-bin \?" запретить его кеширование "no_cache deny QUERY"; на самом деле cgi-bin и query все-таки кешируются, хотя и слабо)
  • store_avg_object_size 13 KB (предполагаемый средний размер объекта, используемый для расчетов; у меня — 9КБ (12 КБ, если не кешировать маленькие объекты); не д.б. вдвое больше реального или возникнут проблемы)
  • store_objects_per_bucket 20 (число объектов на хеш-корзину, чем меньше, тем больше будет создано корзин)
  • always_direct allow|deny [!]aclname … (запросы, удовлеворяющие данным acl не кешировать, а всегда направлять к первоисточнику)
  • never_direct allow|deny [!]aclname …
  • store_dir_select_algorithm least-load | round-robin (алгоритм выбора директории хранения для кешируемого объекта)
  • сообщения об ошибках, журналы и мониторинг
  • logformat имя спецификация-формата (позволяет описать формат журнала запросов; предопределены форматы squid, squidmime, common и combined)
  • cache_access_log /usr/local/squid/logs/access.log (журнал запросов к кешу; до версии 2.6)
  • access_log /usr/local/squid/logs/access.log [имя-формата [ACL …]] (журнал запросов к кешу; в версии 2.6)
  • cache_log /usr/local/squid/logs/cache.log (журнал запусков процессов)
  • cache_store_log /usr/local/squid/logs/store.log (журнал записи объектов в дисковый кеш; авторы рекомендуют поставить none, т.к. программ анализа все равно нет
  • emulate_httpd_log off | on (эмулировать или нет Common Log Format; лучше использовать родной формат)
  • log_ip_on_direct on | off (записывать в журнале IP-адрес сервера или соседа вместо имени)
  • log_mime_hdrs off (в журнал access записываются переданные полученные HTTP-заголовки — очень интересная информация, но больно длинная)
  • useragent_log имя-файла (по-умолчанию none; в этот файл будут записываться строки User-agent из HTTP-заголовков; необходима компиляция с "—enable-useragent_log")
  • referer_log имя-файла (по-умолчанию none; в этот файл будут записываться строки Refererиз HTTP-заголовков; необходима компиляция с "—enable-referer_log")
  • debug_options раздел,уровень (уровень отладки; волшебное слово ALL для всех разделов; по умолчанию ALL,1; уровень от 1 до 9 — наивысший; перечень разделов приведен в doc/debug-sections.txt)
  • log_fqdn off (определять и записывать в журнал полные доменные имена источника запроса, вносит дополнительную задержку в обработку запроса)
  • client_netmask 255.255.255.255 (при записи в журнал можно обнулять некоторые биты IP-адреса, чтоб защитить частную жизнь клиента)
  • log_icp_queries on|off (записывать ли в журнал ICP-запросы)
  • logfile_rotate 10 (squid -k rotate переименовывает журнальные файлы, данный параметр задает количество старых копий для ротации)
  • err_html_text строка (подставляется в шаблоны текстов сообщений об ошибках — лежат в директории error — вместо %L)
  • deny_info err_page_name acl (запросы, не прошедшие проверку в http_access, проверяются на соответствие acl выдается соответствующее сообщение об ошибке из файла page_name)
  • client_db on|off (сбор статистики о клиентах, по умолчанию — включен)
  • buffered_logs on|off (при включении запись в журнал буферизуется и слегка ускоряется)
  • error_directory /usr/local/squid/share/errors/English
  • high_response_time_warning msec (выдается предупреждение, если среднее время ответа в течении минуты превышает указанную величину)
  • high_page_fault_warning штук-в-секунду (выдается предупреждение, если среднее за минуту число подкачек страниц в секунду превышает указанную величину)
  • high_memory_warning число (выдается предупреждение, если используется слишком много памяти — mallinfo)
  • strip_query_terms on (удалять параметры query перед записью в журнал)
  • параметры обработки запросов FTP, WAIS, gopher

    • passive_ftp on | off (по умолчанию включен, но если squid за firewall, то надо выключить (будет использоваться PORT); введен в 2.3-STABLE3)
    • ftp_user email-адрес (будет подставляться вместо пароля при анонимном доступе к ftp-серверам; по умолчанию — Squid@, что вызывает проблемы с серверами, которые проверяют синтаксис адреса)
    • ftp_list_width 32 (ширина листинга ftp) — маловато
    • ftp_sanitycheck on (проверять, чтобы сервер не перепослал нас куда-то ещё в ответе на команду PORT)
    • ftp_telnet_protocol on (отключить для доступа на FTP-сервер, нарушающий стандарты)
    • icon_directory /usr/local/squid/etc/icons (каталог с иконками для FTP-оглавления)
    • short_icon_urls off (использовать относительные URL для адресов иконок)
    • wais_relay_host localhost
    • wais_relay_port 8000 (куда перенаправлять wais-запросы; в новых версиях по умолчанию — 0, что правильно 🙂
  • параметры обработки DNS запросов
  • check_hostnames on (проверять DNS имена на соответствие стандартам)
  • allow_underscore on (разрешать подчёркивания в DNS именах)
  • cache_dns_program /usr/local/squid/bin/dnsserver
  • dns_children 5 (число внешних процессов, которые делают DNS lookup вместо squid — чтобы он не зависал, ожидая результата поиска; 0 — если не нужен (реально использвать только в версиях от 2.5); от 5 до 32; сколько их надо легко понять, просматривая cache.log; при 300 тыс. запросах в день уже третий dnsserver имеет нулевую загрузку)
  • dns_retransmit_interval 5 seconds (каждый следующий интервал удваивается)
  • dns_timeout 5 minutes
  • dns_defnames off (дополнять однокомпонентные DNS-имена доменом по умолчанию перед запросом DNS-сервера)
  • dns_nameservers список-IP-адресов (будет использоваться вместо того списка DNS-серверов, который опреден в /etc/resolv.conf; по умолчанию — none)
  • hosts_file /etc/hosts
  • dns_testnames netscape.com internic.net nlanr.net microsoft.com (список имен хостов на примере которых проверяется работоспособность DNS, чтобы запретить проверку надо использовать ключ -D)
  • append_domain .deol.ru (добавляется к имени хоста, если в нем нет ни одной точки)
  • positive_dns_ttl 6 hours
  • negative_dns_ttl 5 minutes
  • ignore_unknown_nameservers on (игнорировать сообщения от DNS-серверов, которые мы не запрашивали)
  • параметры внешних программ
  • diskd_program /usr/local/squid/libexec/
  • unlinkd_program /usr/local/squid/bin/unlinkd (программа, используемая в параллельном процессе для удаления файлов; не нужна, если используется async-io)
  • pinger_program /usr/local/squid/bin/pinger (имя программы, используемой в параллельном процессе pinger; только если при компиляции использовался ключ "—enable-icmp")
  • redirect_program none (позволяет подключить программу преобразования URL при каждом запросе; запускается при запуске самого squid и висит в ожидании очередной строки; см.)
  • redirect_children 5 (сколько процессов преобразования запускать параллельно)
  • redirect_rewrites_host_header on (по умолчанию, Squid переписывает поле "Host:" в заголовках преобразованных запросов, это не всегда хорошо)
  • redirector_access acl (какие запросы направлять через редиректор; по умолчанию — все; в версии 2.4 появились ключевые слова allow и deny перед acl)
  • url_rewrite_program имя-программы (в отличие от redirect_program дополнительно передаётся urlgroup)
  • url_rewrite_children 5 (сколько процессов преобразования запускать параллельно)
  • url_rewrite_concurrency 0 (сколько запросов каждый процесс может обрабатывать параллельно)
  • url_rewrite_host_header no (переписывать заголовок Host:)
  • url_rewrite_access acl (какие запросы направлять через преобразователь; по умолчанию — все)
  • location_rewrite_program имя-программы (преобразование URL в ответах)
  • location_rewrite_children 5 (сколько процессов преобразования запускать параллельно)
  • location_rewrite_concurrency 0 (сколько запросов каждый процесс может обрабатывать параллельно)
  • location_rewrite_access acl (какие запросы направлять через преобразователь; по умолчанию — все)
  • mail_program mail (имя программы для посылки письма при падении squid)
  • параметры аутентификации (для включения аутентификации необходимо задать в http_access ACL (типа proxy_auth, proxy_auth_regex, external %LOGIN) с использованием имён пользователей; аутентификация прокси несовместима с прозрачным режимом до 2.6.15; после изменения схемы требуется restart, а не reload):
  •  

    • auth_param схема имя-параметра значение (задание параметров для программ аутентификации в 2.5 и выше; squid может предлагать клиенту несколько схем аутентификации (заголовок Proxy-Authenticate:), а браузер должен выбрать из них самую безопасную из понимаемых им; на практике, браузеры обычно выбирают самую первую; порядок предъявления схемы определяется порядком первого появления имени схемы в squid.conf; выключить действие схемы командой reconfigure нельзя):
    •  

      • basic: если squid получает запрос, который попадает под ACL proxy_auth (proxy_auth_regex, external с %LOGIN) в http_access, то squid ищет заголовок Authorization и извлекает из него имя и пароль (base64, открытым текстом); если заголовок не обнаружен, то браузеру возвращается сообщение об ошибке 407 (Proxy Authentication Required) со списком допустимых схем аутентификации, браузер запрашивает у пользователя имя и пароль для определённой области действия (realm); полученные от пользователя имя и пароль браузер передаёт в последующих запросах к squid в заголовке Authorization; для аутентификации используется внешняя программа, которая получает на стандартный ввод имя и пароль и должна ответить "OK" или "ERR"; параметры: program (имя программы и параметры), children (5), concurrency (предварительно необходимо убедиться, что поддерживается), realm (область действия, показывается пользователю при запросе пароля), credentialsttl (2 часа), casesensitive (off), blankpassword (off); в комплекте поставки имеются программы:
    •  

      •  

        • NCSA (ncsa_auth, вместе с именем программы /usr/local/squid26/libexec/ncsa_auth указывается имя файла с именами и хешированными crypt/md5/sha1 паролями; файл можно заполнять, например, с помощью htpasswd из комплекта apache; необходимо закрыть на чтение, чтобы не подбирали)
        • getpwnam (getpwname_auth)
        • LDAP (squid_ldap_auth)
        • MSNT (обращается к NT серверу)
        • mswin_sspi (только под MS Windows NT?)
        • multi-domain-NTLM
        • PAM (pam_auth)
        • SASL (sasl_auth)
        • SMB (smb_auth, smb_auth.sh)
        • YP
    • digest — squid возвращает браузеру требование аутентифицироваться вместе с именем области действия и случайной строкой (nonce), браузер запрашивает имя и пароль и выдаёт squid запрос с именем пользователя; для аутентификации используется внешняя программа, которая получает на стандартный ввод имя пользователя и область действия и возвращает сделанный из них хеш или "ERR"; этот хеш возвращается браузеру, который делает из него и пароля пользователя второй хеш, который посылается в следующем запросе к squid; параметры: program (имя программы и параметры), children (5), concurrency, realm, nonce_garbage_interval (5 minutes), nonce_max_duration (30 minutes), nonce_max_count (50), nonce_strictness (off), check_nonce_count (on), post_workaround (off); в комплекте поставки имеются программы:
    •  

      •  

        • password (digest_pw_auth, вместе с именем программы /usr/local/squid26/libexec/digest_pw_auth указывается имя файла с именами пользователей и паролями в формате "имя:пароль"; можно указать ключ "-c" и имя файла с готовыми хешами — MD5 (имя:область-действия:пароль) — в формате "имя:область-действия:хеш"; файл необходимо закрыть от чтения)
    •  

      •  

        • ldap (digest_ldap_auth)
    • ntlm (NTLMv1 до 2.5.STABLE5) — используется протокол NTLMSSP между squid и браузером; с клиентской стороны поддерживается MS IE (не работает в MS Windows Server 2003; "keep_alive off" на сервере не помогает, включение HTTP 1.1 для прокси на клиенте не помогает, помогает перевод клиента с NTLMv2 на LM: установить HKLM\System\CurrentControlSet\Control\LSA\LMCompatibilityLevel из 2 в 0) и Firefox (на всех платформах); Opera 9.02 под MS Windows выдаёт окошко для ручного ввода имени и пароля только, если ntlm-аутентификация является единственной; первый запрос браузер делает без указания аутентификационной информации; squid возвращает сообщение об ошибке 407 с указанием "Proxy-Authenticate: NTLM"; затем squid разрывает соединение, не глядя на keep-alive; клиент создаёт новое соединение и выдаёт запрос с "Proxy-Authorization: NTLM что-то", на что squid опять отвечает 407 с указанием "Proxy-Authenticate: NTLM другое-что-то"; теперь браузер может послать достаточно информации для аутентификации пользователя определённого домена; со следующим запросом клиента цикл повторяется в отличие от basic аутентификации (2 лишних пакета, 20% трафика), если разорвать TCP соединение; для аутентификации используется внешняя программа, которая участвует в этом протоколе; параметры: program (имя программы и параметры), children (5), keep_alive (on, могут быть проблемы с IE); в комплекте поставки имеются:
    •  

      •  

        • fakeauth (проверяет только синтаксис запроса),
        • mswin_sspi (только под MS Windows NT?),
        • no_check (no_check.pl, проверяет только синтаксис запроса),
        • SMB (ntlm_auth, обращается к контроллеру домена; параметры: имя-домена/имя-DC … (необходимо определить в DNS соответствующее имя); требуется пропускать пакеты к DC на порт TCP/139; простейший тест: запустить "ntlm_auth -d имя-домена/имя-DC" и ввести "YR"; ключ "-d" вызывает выдачу большого объёма отладочной печати в cache.log
        • предлагается также использовать ntlm_auth из пакета samba-common с параметром —helper-protocol=squid-2.5-ntlmssp)
    • negotiate — используется протокол SPNEGO (Simple and Protected GSS-API Negotiation) между squid и браузером; для аутентификации используется внешняя программа, которая участвует в этом протоколе; параметры: program (имя программы и параметры), children (5), keep_alive (on, могут быть проблемы с IE); в комплекте поставки имеются: mswin_sspi (только под MS Windows NT?), ожидается поддержка SPNEGO в ntlm_auth из Samba-4.X (—helper-protocol=gss-spnego)
  • authenticate_program none (убрана в 2.5; позволяет производить аутентификацию клиентов, делающих запросы; программа должна в цикле читать строку "имя пароль" выдавать OK или ERR; должен быть определен ACL proxy_auth; традиционная для 2.4 программа аутентификация определена в ../auth_modules/NCSA (надо сказать make; make install), после чего добавить
  • authenticate_program /usr/local/squid/bin/ncsa_auth /usr/local/squid/etc/passwd
  • authenticate_children 5 (сколько параллельных процессов будут заниматься аутентификацией; убрана в 2.5)
  • authenticate_ttl 3600 (сколько секунд кешировать результаты работ программы аутентификации)
  • authenticate_cache_garbage_interval 1 hour (интервал сборки мусора)
  • authenticate_ip_ttl 0 (чтобы с нескольких мест не пользовались одним именем, требуется повторная аутентификация клиента, см. также max_user_ip)
  • authenticate_ip_ttl_is_strict on (убрана в 2.5)
  • proxy_auth_realm Squid proxy-caching web server (строка текста, которая будет выдана на экран клиента при запросе имени/пароля доступа к кешу; в 2.4 заменен обобщенной директивой auth_param; убрана в 2.5)
  • пример:
auth_param ntlm program /usr/local/squid/libexec/ntlm_auth имя-домена/простое-имя-DC
auth_param ntlm children 10
# файл digest_passwd_ha1 содержит имена и хеши для схемы digest
auth_param digest program /usr/local/squid/libexec/digest_pw_auth -c /usr/local/squid/etc/digest_passwd_ha1
auth_param digest realm proxy (digest, ha1)
# файл ncsa_passwd содержит имена и хеши для схемы basic
auth_param basic program /usr/local/squid/libexec/ncsa_auth /usr/local/squid/etc/ncsa_passwd
auth_param basic realm proxy (basic)

# файл noauth.acl содержит список IP, запросы с которых принимаются без аутентификации
acl noauth src "/usr/local/squid/etc/noauth.acl"
http_access allow noauth
# файл auth.acl содержит список IP, запросы с которых принимаются с аутентификацией
acl auth src "/usr/local/squid/etc/auth.acl"
acl password proxy_auth REQUIRED
# файл authname.acl содержит список IP, запросы с которых принимаются с аутентификацией
# по ограниченному списку имён;
acl authname src "/usr/local/squid/etc/authname.acl"
# список допустимых имён пользователей (как WS2003, так и pre-2000; в кодировке cp1251 😉
# задаётся в файле names.acl с добавлением имени домена или имени компьютера
acl password-name proxy_auth "/usr/local/squid/etc/names.acl"
http_access allow authname password-name
  • timeout's

    • forward_timeout 4 minutes (максимальное время поиска пути)
    • connect_timeout 120 seconds (сколько времени ждать соединения от squid к серверу)
    • minimum_retry_timeout 5 seconds (если сервер имеет несколько IP адресов, то connection timeout делится на их количество, данный параметр ограничивает получившийся результат снизу, маловато; убран в 2.5)
    • peer_connect_timeout 30 seconds
    • siteselect_timeout 4 seconds (сколько времен разрешается потратить на выбор URL из URN; убрана в 2.5)
    • read_timeout 15 minutes (сколько времени разрешается ждать следующего байта от сервера, достаточно и 5 минут)
    • request_timeout 30 seconds (сколько разрешается ждать запроса после установления соединения, маловато)
    • persistent_request_timeout 1 minute (в 2.4)
    • client_lifetime 1 day (сколько времени разрешать клиенту быть присоединенным к squid; в т.ч. в случае если он ушел не попрощавшись; это перебор, хватит и 8 часов; соединение обрывается даже если происходит передача данных!)
    • half_closed_clients on (разрешать наполовину закрытые соединения — например чтение есть, а запись уже закрыта; не стоит их баловать)
    • pconn_timeout 120 seconds (постоянные соединения с серверами и другими кешами)
    • ident_timeout 10 seconds
    • shutdown_lifetime 30 seconds (сколько времени продолжать обслуживание после получения SIGTERM or SIGHUP)
    • maximum_single_addr_tries 3 (сколько раз пытаться достучаться до сервера, имеющего 1 IP адрес; если сервер имеет несколько IP адресов, то каждый из них будет опробован ровно один раз)
  • ACL — определение списка доступа (тип: тип объекта, строка: регулярное выражение — шаблон для сравнения; по умолчанию чувствительное к регистру букв (строчные/прописные); чтобы игнорировать регистр букв, надо использовать ключ "-i")

acl имя тип строка … … (логическое ИЛИ)
acl имя тип "имя файла" (по одному параметру в строке)
external_acl_type имя опции формат имя-программы параметры (описание внешней программы обработки ACL)
типы:

  •  

    • src ip-address/netmask … (clients IP address)
    • src addr1-addr2 … (range of addresses)
    • dst ip-address/netmask … (URL host's IP address)
    • myip ip-address/netmask … (local socket IP address)
    • srcdomain foo.com … (reverse lookup, client IP)
    • dstdomain foo.com … (Destination server from URL; если в URL использовался IP, то делается попытка определить имя домена, если не удалась, то подставляется слово "none")
    • srcdom_regex [-i] строка … (regex matching client name)
    • dstdom_regex [-i] строка … (regex matching server; если в URL использовался IP, то делается попытка определить имя домена, если не удалась, то подставляется слово "none")
    • time [day-abbrevs] [h1:m1-h2:m2] (где день это одна буква из SMTWHFA)
    • url_regex [-i] строка (регулярное выражение для всего URL)
    • urlpath_regex [-i] строка (регулярное выражение для path-части URL)
    • urllogin [-i] строка (регулярное выражение для login-части URL)
    • port порт … (перечень портов)
    • в стандартной конфигурации определяется ACL Safe_port для интервала 1024-65535; это слишком слабое ограничение; лучше к безопасным портам отнести 32768-65535 (у меня все клиентские порты начинаются с 32768 и firewall эа этим следит), и отдельно всякие извращения перевода с русского на русский — 81, 82, 83, 88, 8000-8002, 8080-8083, 8091, 8100-8103, 8888
    • port порт1-порт2(интервал портов)
    • myport порт … (перечень портов)
    • proto [HTTP | FTP | …]
    • method [GET | POST | … ] (в т.ч. собственный метод purge: acl PURGE method purge)
    • browser [-i] regexp (сопоставляется заголовок User-Agent)
    • referer_regex [-i] regexp (сопоставляется заголовок Referer)
    • ident username … (строка REQUIRED сопоставляется любому непустому слову)
    • ident_regex [-i] regexp
    • src_as number …  (номера автономных систем — AS, делается запрос к whois.ra.net на поиск !gASномер)
    • dst_as number … (не более 253 или поставить IP-адрес в as_whois; такой поток запросов RADB не выдерживает, так что надо сделать несколько раз squid restart, чтобы таблица адресов заполнилась)
    • proxy_auth username … (можно использовать строку REQUIREDдля любого имени пользователя)
    • proxy_auth_regex [-i] regexp
    • snmp community string …
    • maxconn число(больше чем указанное число соединений с одного и того же IP)
    • max_user_ip число(больше чем указанное число соединений одного пользователя с различных IP-адресов)
    • req_mime_type regexp (тип upload)
    • req_header имя-заголовка [-i] регулярное-выражение (сопоставляется указанный заголовок запроса)
    • rep_mime_type regexp (нельзя использовать в http_access)
    • rep_header имя-заголовка [-i] регулярное-выражение (сопоставляется указанный заголовок ответа)
    • external имя-типа параметры (использовать внешнюю программу, описанную в external_acl_type)
  • as_whois_server имя (whois сервер, используемый для получения номера AS; только при запуске или reconfigure; whois.ra.net aka whois.radb.net; лучше поставить IP адрес, иначе нельзя будет использовать более 250 AS)
  • права доступа

    • http_access allow|deny [!]aclname … (кому разрешать доступ к прокси по HTTP; здесь и далее — логическое И)
    • http_reply_access allow|deny [!]aclname … (какие ответы на запросы разрешить; http_reply_access allow all)
    • icp_access allow|deny [!]aclname … (кому разрешать доступ к прокси по ICP)
    • miss_access allow|deny [!]aclname … (кому разрешить получать ответ MISS от нас)
    • cache_peer_access cache-host allow|deny [!]aclname … (ограничить запросы к данному соседу — расширение для cache_peer_domain)
  • использование протокола ident

    • ident_lookup_access allow|deny [!]aclname
    • ident_lookup_access список-ACL (если запрос допускается ACL, то источник проверяется с помощью ident; по умолчанию "ident_lookup_access deny all" — по умолчанию ACL с именем all определяется так, что ему удовлетворяет любой запрос; чтоб запретить использовать ident совсем, можно компилировать с "—disable-ident")
  • параметры администрирования

    • cache_mgr email (почтовый адрес, на который будет послано письмо, если squid грохнется)
    • cache_effective_user nobody (если запустить squid от имени root, то поменять UID на указанный)
    • cache_effective_group nogroup
    • visible_hostname имя-хоста (это имя будет упоминаться в сообщениях об ошибках)
    • httpd_suppress_version_string off (подавлять выдачу номера версии Squid; появилась в 2.6)
    • unique_hostname уникальное-имя (если нескольким кешам дали одно и то же visible_hostname, то чтобы предотвратить циклы, надо определить каждому из них уникальное имя)
    • hostname_aliases имя … (список синонимов для нашего имени хоста)
    • cachemgr_passwd password action action … (задание пароля для действий по администрированию squid; чтоб запретить действие — поставьте пароль disable; чтоб разрешить действие без проверки пароля — поставьте пароль none, кроме действий config и shutdown; неполный список действий: 5min, 60min, asndb, authenticator, cbdata, client_list, comm_incoming, config, counters, delay, digest_stats, dns, events, filedescriptors, fqdncache, histograms, http_headers, info, io, ipcache, mem, menu, netdb, non_peers, objects, pconn, peer_select, redirector, refresh, server_list, shutdown, store_digest, storedir, utilization, via_headers, vm_objects; имя действия all — для всех действий)
  • параметры саморекламы, посылаемой в http://ircache.nlanr.net/Cache/Tracker

    • announce_period 0 day (0 означает — не посылать никогда)
    • announce_host tracker.ircache.net
    • announce_port 3131
    • announce_file имя-файла (дополнительно к стандартно информации — хост, порт — посылается этот файл)
    • параметры для работы в режиме ускорителя http-сервера
    • httpd_accel_host hostname (если нужна поддержка виртуальных хостов, в частности для transparent proxy, то вместо имени указать virtual)
    • httpd_accel_port port
    • httpd_accel_single_host off
    • httpd_accel_with_proxy on|off (по умолчанию кеширование для ускоряемого сервера выключено)
    • httpd_accel_uses_host_header on|off (для работы в прозрачном режиме требуется включить, иначе виртуальные сервера не будут правильно кешироваться, но т.к. squid не проверяет соответствие заголовка Head: и имени в URL, то это опасно. Я так понимаю, что можно подсовывать в кеш страницы с одного сервера под именем другого, затем когда нормальный пользователь запросит страницу с этого другого сервера, то он получит ее из кеша, куда она попала с первого сервера. Исправлено в 2.3)
  • преобразование заголовков и URL в запросах и ответах

    • forwarded_for on|off (если включено — по умолчанию — то squid будет вставлять IP-адрес или имя в заголовок перенаправляемых HTTP-запросов: "X-Forwarded-For: 192.1.2.3"; если выключено, то "X-Forwarded-For: unknown")
    • anonymize_headers allow|deny header_name … (перечень заголовков, которые нуждаются в анонимизации; по умолчанию — ни один; можно использовать несколько строк, но все они должны иметь либо allow, либо deny; удален в 2.4)
    • header_access имя-заголовка allow | deny [!]acl (фильтрация заголовков запроса; введен в 2.4 вместо aninymize_headers; вместо имени заголовка запроса можно использовать ключевые слова All и Other (неизвестные заголовки); это нарушение протокола HTTP)
    • fake_user_agent none (если заголовок User-Agent фильтруется с помощь анонимизатора, то подставляется эта строка; удален в 2.4)
    • header_replace имя-заголовка строка (заменить заголовок на указанную строку; введен в 2.4 вместо fake_user_agent)
    • reload_into_ims on|off (при включении запросы типа no-cache или reload будут преобразовываться в If-Modified-Since; является нарушением стандартов; более гибкая настройка через refresh_pattern)
  • uri_whitespace strip (что делать с запросами, имеющими пробелы в URI)

    •  

      • strip — удалять пробелы
      • deny — сообщать Invalid Request
      • allow — передавать как есть
      • encode — кодировать в соответствии с RFC1738 и передавать дальше
      • chop — остаток после первого же пробела отбрасывать
  • broken_posts allow|deny acl … (если запрос удовлетворяет acl и имеет тип PUT/POST, то squid посылает дополнительный CRLF после тела запроса, чтоб успокоить неправильно написанный сервер)

    • SNMP
    • snmp_port 3401 (порт, который слушает squid для SNMP запросов)
    • forward_snmpd_port 0 (если задан порт, то на него перенаправляются все SNMP-запросы; убрано в 2.3)
    • snmp_access allow|deny [!]aclname … (кто будет допущен к SNMP порту, по умолчанию — никто)
    • snmp_incoming_address 0.0.0.0
    • snmp_outgoing_address 0.0.0.0
  • разное

    • mime_table /usr/local/squid/etc/mime.conf (явно не хватает .class, .pl, .map, .ico, .bmp, .js, .css, .mid)
    • pid_filename /usr/local/squid/logs/squid.pid (none, если не нужен)
    • max_open_disk_fds
    • offline_mode on|off (если включить, то squid будет брать объекты только из кеша и не будет пытaться обращаться к первоисточникам)
    • coredump_dir (по умолчанию в cache_dir)
    • redirector_bypass on | off (если включен и все редиректоры заняты, то не обрабатывать URI редиректором; если выключен и нет свободных редиректоров, то аварийное завершение — применяется, если редиректор используется для аутентификации)
    • chroot (делать chroot после разбора конфигурации; reconfigure работать не будет, если прислушиваемся к портам < 1024)
    • client_persistent_connections on (использовать постоянные соединения при общении с клиентами)
    • server_persistent_connections on (использовать постоянные соединения при общении с серверами)
    • persistent_connection_after_error off (не использовать постоянные соединения после получения ошибки)
    • balance_on_multiple_ip on (борьба с серверами, балансирующими траффик по нескольким IP и не умеющим сохранять сессию)
    • pipeline_prefetch on (если клиент работает в режиме pipeline, то запрашивать с сервера 2 объекта параллельно)
    • extension_methods (позволяет задать дополнительные нестандартизованные методы доступа HTTP — можно подсмотреть в cache.log)
    • ie_refresh off (борьба с неспособностью MS IE до 5.5 SP1 сделать полноценный refresh, снижает эффективность кеширования)<;;;/li>
    • vary_ignore_expire off (позволяет squid игнорировать в некоторых случаях нулевое время хранения объекта — Expire: на текущее время)
  • параметры DELAY POOL, ограничивают интенсивность использования кеша для отдельных хостов и подсетей

    • delay_pools 0
    • delay_class номер-пула класс (д.б. ровно один пул каждого класса; классы: 1 — 3)
    • delay_access номер-пула allow|deny acl …
    • delay_parameters pool aggregate network individual
    • delay_initial_bucket_level 50
  • интерфейс WCCP с маршрутизаторами Cisco (используется для прозрачного прокси и автоматического отключения при падении прокси; WCCPv1 в squid 2.3; WCCPv2 в squid 2.6)

    • wccp_router ip-адрес
    • wccp2_router ip-адрес
    • wccp_version 4 (для IOS 11.2 нужна версия 3)
    • wccp2_rebuild_wait
    • wccp2_forwarding_method
    • wccp2_return_method
    • wccp2_assignment_method
    • wccp2_service
    • wccp2_service_info
    • wccp2_weight
    • wccp_incoming_address IP-адрес
    • wccp_outgoing_address IP-адрес
    • wccp_address
    • wccp2_address
    • работа с БД digest
    • digest_generation on
    • digest_bits_per_entry
    • digest_rebuild_period
    • digest_rewrite_period
    • digest_swapout_chunk_size
    • digest_rebuild_chunk_procentage



Управление squid (Cache Manager)

 

  • Настройка прав доступа в squid.conf:
  • acl all src 0.0.0.0/0.0.0.0
  • acl localhost src 127.0.0.1/255.255.255.255
  • acl manager proto cache_object
  • acl managerhost src 1.2.3.4/255.255.255.255
  • http_access allow manager localhost
  • http_access allow manager managerhost
  • http_access deny manager
  • http_access allow all
  • cachemgr_passwd пароль команда


Управление squid с помощью программы client: /usr/local/squid/bin/client cache_object://localhost/команда

Управление squid с помощью cachemgr.cgi (лично я не пробовал и другим не советую):

  • cachemgr.cgi в /usr/local/squid/cgi-bin
  • конфигурация Apache
ScriptAlias /Squid/cgi-bin/ /usr/local/squid/cgi-bin/
ограничение доступа по адресу хоста
        <Location /Squid/cgi-bin/cachemgr.cgi>
        order deny,allow
        deny from all
        allow 1.2.3.4
        </Location>
ограничение доступа по паролю
        <Location /Squid/cgi-bin/cachemgr.cgi>
        AuthUserFile /path/to/password/file
        AuthGroupFile /dev/null
        AuthName User/Password Required
        AuthType Basic
        require user cachemanager
        </Location>
 

Сколько надо оперативной памяти

Требования к памяти:

  • 72 байта на каждый объект
  • Disk buffers for reading and writing
  • Network I/O buffers
  • IP Cache contents
  • FQDN Cache contents
  • Netdb ICMP measurement database
  • Per-request state information, including full request and reply headers
  • Miscellaneous statistics collection
  • "Hot objects" which are kept entirely in memory


Причем большая часть используемой памяти не должна свопироваться (иначе работает безумно медленно). Например, при кеше в 7 ГБ (800 тысяч объектов) требуется 128 МБ оперативной памяти. При восстановлении оглавления кеша (после аварийной перезагрузки) требуется удвоенный объем.

Как уменьшить потребности:

  • попробовать GNU malloc или dlmalloc (./configure —enable-dlmalloc)
  • уменьшить cache_mem (пока не появятся сообщения в cache.log)
  • memory_pools off
  • уменьшить размер кеша (cache_swap) — единственный существенный способ

Алгоритмы замещения кеша (LRU, GDSF, LFUDA)

Squid поддерживает размер кеша между low и high, регулярно запуская процедуру удаления объектов (чем ближе мы к high, тем агрессивнее очистка). Вместо удаления можно использовать очистку файлов (truncate) пока хватает inode. Удаление производится асинхронно внешней программой unlinkd. Если объект тянется в данный момент, то он не удаляется. Если объект "отрицательно кеширован", то он удаляется. Если объект частный, то он удаляется. Алгоритмы замешения:

  • LRU. Если время с последнего использования объекта больше некой границы (threshold), то объект удаляется. Граница динамически вычисляется на основе заполненности кеша и low/high маркеров (начальное/максимальное значение задается в squid.conf). При стабилизации размера кеша граница представляет время полного заполнения (замещения) кеша в текущих условиях (типичное значение от 1 до 10 дней; если меньше 3 дней, то рекомендуется увеличить кеш).
  • GDSF. Стремится удержать маленькие полулярные объекты (растет hitrate, падает byterate).
  • LFUDA. hitrate падает, byterate — растет.


Сравнение алгоритмов проводится в

  • Enhancement and Validation of Squid's Cache Replacement Policy
  • Evaluating Content Management Techniques for Web Proxy Caches

Какие объекты кешируются

Кешируемость объектов в зависимости от кода возврата HTTP:
Caching  Code
        Successful 2xx
c        200 OK
         201 Created
         202 Accepted
c        203 Non-Authoriative Information *
E        204 No Content
         205 Reset Content *
?        206 Partial Content *
        Redirection 3xx
C        300 Multiple Choices
C        301 Moved Permanently
t        302 Moved Temporarily
—        303 See Other *
—        304 Not Modified
E        305 Use Proxy (proxy redirect) *
        Client Error 4xx
E        400 Bad Request
—        401 Unauthorized
         402 Payment Required *
E        403 Forbidden
E        404 Not Found
E        405 Method Not Allowed *
         406 Not Acceptable *
—        407 Proxy Authentication Required *
         408 Request Timeout *
         409 Confict *
C        410 Gone *
         411 Length Required *
         412 Precondition Failed *
         413 Request Entity To Large *
E        414 Request-URI Too Long *
         415 Unsupported Media Type
        Server Error 5xx
E        500 Internal Server Error
E        501 Not Implemented
E        502 Bad Gateway
E        503 Service Unavailable
E        504 Gateway Timeout *
         505 HTTP Version Not Supported *

Notes:
* HTTP 1.1
c Cached unless a query response without expiry information
C Cached
E Negatively cached if no expiry headers
t Cached only if expiry information
— Not cached
Unless other said, the response code is not cached.

Кешируемость в зависимости от заголовков:

  • Responses with Cache-Control: Private are NOT cachable.
  • Responses with Cache-Control: No-Cache are NOT cachable.
  • Responses with Cache-Control: No-Store are NOT cachable.
  • Responses for requests with an Authorization header are cachable ONLY if the reponse includes Cache-Control: Public.
  • Responses with Vary headers are NOT cachable because Squid does not yet support Vary features.

Справедливый дележ канала (delay pool)

Пул — набор групп ведер определенного класса. Группа ведер — часть пула, привязанная к хосту, сети или одно на всех. Ведро — ограниченная емкость, в которую с ограниченной скоростью вливается внешний трафик, и из которой он раздается клиенту. Если ведро заполняется полностью, то запросы к серверу останавливаются, если пустеет, то увеличиваются (а клиент ждет).

Определены 3 класса пулов:

  1. одно ведро на всех из этого класса
  2. одно общее ведро и 255 отдельных для каждого хоста из C-сетки
  3. 255 ведер для каждой сетки (класс B) и отдельное для каждого хоста

 

Пример конфигурации:

delay_pools 3     # 3 delay pools
delay_class 1 1   # pool 1 is class 1
delay_class 2 1   # pool 2 is class 1
delay_class 3 3   # pool 3 is class 3
delay_access 1 allow staff
delay_access 1 deny all
delay_access 2 allow students
delay_access 2 deny all
delay_access 3 allow college
delay_access 3 deny all
delay_parameters 1 640000/640000
delay_parameters 2 64000/64000
delay_parameters 3 64000/64000 32000/64000 6400/32000
                   # total_rest/total_max net_rest/net_max ind_rest/ind_max
где
  total — на всех
  net — на подсеть
  ind — на отдельный адрес
  rest — скорость заполнения (байт/сек)
  max — объем ведра (байт)
 

Ограничение для модемных клиентов, чтобы squid не подкачивал файл пока клиент еще не считал предыдущую порцию.

acl clients src адреса
delay_pools 1
delay_class 1 2
delay_access 1 allow clients
delay_access 1 deny all
delay_parameters 1 -1/-1 8000/4000
 

Прижать любителей MP3:

acl multimedia urlpath_regex -i \.mp3$ \.mpeg$ \.avi$ \.mov$
delay_pools 1
delay_class 1 1
delay_access 1 allow multimedia
delay_access 1 deny all
delay_parameters 1 16000/64000

quick abort д.б. установлен маленьким чтобы объект не качался на полной скорости после отпадения клиента (нет клиента для запроса — нет ограничений).

Squid как transparent proxy (только http)

В процессе участвуют маршрутизатор, Linux и Squid:

  1. http-пакеты, бегущие мимо, должны отлавливаться маршрутизатором и переадресовываться на proxy-сервер. Как понять, что это http-пакет? Будем считать, что все пакеты, направленные на tcp/80, являются запросами на HTTP. Возникал вопрос: а может кешировать и другие порты? После обработки статистики (большой объем — 422MB, в ситуации с добровольным использованием proxy) выяснилось, что всего обращений было 3120260, из них HTTP — 92%. Из них на нестандартные порты — 2.3% (3128 — 0.05%, 8000 — 0.09%, 8001 — 0.13%, 8080 — 1.06%, 8081 — 0.15%, 8100 — 0.11%, 8101 — 0.46%). Я не вижу смысла бороться за 1%, разве что найду готовое решение 😉
  2. Proxy-сервер уже стоит на пути этих пакетов (например, squid установлен на маршрутизаторе или firewall).
  3. Cisco отлавливает такие пакеты и с помощью route-map перенаправляет их на proxy-сервер.
  4. ОС proxy-сервера должна принимать эти пакеты, как родные, и перенаправлять к squid

    1. linux 2.2.
    1.  

      1. конфигурация ядра:
CONFIG_EXPERIMENTAL=y # включен и так
CONFIG_NET=y # само собой
CONFIG_FIREWALL=y # чтобы иметь возможность тонко управлять маршрутизацией (несовместим с FAST_SWITCHING)
# CONFIG_IP_ALIAS is not set # у меня включено и вроде работает (при нехватке ОП зависает драйвер eth0, если ALIAS выключить, то прикладная программа)
CONFIG_INET=y # включен и так
# CONFIG_IP_MULTICAST is not set # а почему нельзя?
CONFIG_IP_FIREWALL=y # чтобы иметь возможность тонко управлять IP-маршрутизацией
CONFIG_IP_MASQUERADE=y # а необходимо ли это для transparent proxy?
CONFIG_IP_TRANSPARENT_PROXY=y
CONFIG_IP_ROUTER=y # необязательно, но может ускорить обработку пакетов
  1.  

    1. при загрузке включать ip_forward, ip_always_defrag (вставить в загрузочные скрипты: /etc/rc.d/init.d/network)
echo 1 > /proc/sys/net/ipv4/ip_forward # ядро д.б. сконфигурировано поддержкой /proc и sysctl)
echo 1 > /proc/sys/net/ipv4/ip_always_defrag # в ядре 2.2.12 указывается во время конфигурации
  1.  

    1. ipchains (ipfwadm в ядре 2.2 работать не будет)
  • ipchains -A input -p TCP -d 127.0.0.1/32 www -j ACCEPT
  • ipchains -A input -p TCP -d адрес-хоста/32 www -j ACCEPT
  • ipchains -A input -p TCP -d 0/0 www -j REDIRECT 3128
  • дополнительные правила для firewall и др.
  1. squid д.б. скомпилирован так, чтобы он принимал эти пакеты, как родные.
  • linux 2.2 и squid 2.2. Происходит само собой.
  1. squid д.б. сконфигурирован так, чтобы обрабатывать эти пакеты соответствующим образом.
  • http_port 3128 # redirect д.б. на этот порт
  • httpd_accel_host virtual # имитирует акселератор http-сервера, но не совсе нормально
  • httpd_accel_port 80 # а если перенаправляли не только 80 порт?
  • httpd_accel_with_proxy on # иначе при работе в режиме акселератора отключается кеширование
  • httpd_accel_uses_host_header on # иначе виртуальные домены будут неправильно кешироваться (см. замечание про безопасность)

Проблема. дырка в firewall: запрос приходит на прокси-сервер, который от своего имени (уже изнутри) лезет куда не надо.

Обработка статистики

В комплекте поставки идут access-extract.pl, (увеличено MaxEntries до …)  получающая на стандартный ввод журнал access.log выдающая на стандартный выво промежуточный результат,  и access-summary.pl (убрал выдачу ICP, которой у меня нет, за счет чего увеличил ширину колонки с именами хостов; в xsort изменил сортировку с COUNT на BYTES), делающая из него красивый отчет. Внутри используется squid-logs.pl. Его надо расширить новыми суффиксами имен файлов (bmp — Image; rm, mid, mp3 — Audio; pl, cgi, shtml, php, php3, phtml, asp, dll — Dynamic; rpm, cab, avc — Bundle; css — HTML; koi — Text; js — Software). За день получается 60МБ в access.log, поэтому у меня не хватает терпения дождаться результатов работы других процедур из комплекта.

Формат access.log (запись делается, когда клиент закрывает socket; для наших 300 тысяч запросов в день получается 60 MB в день!):

  1. timestamp (unix time in ms)
  2. elapsed (ms), если клиент "ушел, не попрощавшись", то здесь будет время потраченное на обнаружение данного факта, а не время реального обслуживания (иногда более получаса на маленький файл)
  3. client IP address
  4. type/HTTP reply code, где type:

    • TCP_HIT (верная копия объекта нашлась в кеше)
    • TCP_MEM_HIT
    • TCP_NEGATIVE_HIT
    • TCP_MISS (запрашиваемый объект не был в кеше)
    • TCP_EXPIRED (объект был в кеше, но старый)
    • TCP_CLIENT_REFRESH (клиент запросил reload — no-cache pragma)
    • TCP_REFRESH_HIT (объект в кеше был старым, был сделан IMS-запрос к источнику и тот вернул "304 Not Modified")
    • TCP_REFRESH_MISS (объект в кеше был старым, был сделан IMS-запрос к источнику и тот вернул обновленное содержание)
    • TCP_IMS_HIT (клиент выдал IMS-запрос, объект оказался в кеше и свежим)
    • TCP_IMS_MISS (клиент выдал IMS-запрос для просроченного объекта)
    • TCP_REF_FAIL_HIT (объект в кеше староват, но запросить новую копию не удалось)
    • TCP_SWAPFAIL (объект д.б. в кеше, но не смогли извлечь)
    • TCP_DENIED
    • UDP_…
    • ERR_CLIENT_ABORT
    • ERR_NO_CLIENTS
    • ERR_READ_ERROR
    • ERR_CONNECT_FAIL
    • ERR_…
  5. size (bytes to client)
  6. method (GET, POST, …)
  7. URL
  8. ident ("-", если недоступен)
  9. hierarhy data/Hostname

    • DEAD_NEIGHTBOR
    • DEAD_PARENT
    • LOCAL_IP_DIRECT
    • FIRST_PARENT_MISS
    • FIRST_UP_PARENT
    • PARENT_HIT (UDP-запрос к parent вернулся с подтверждением)
    • SINGLE_PARENT
    • PARENT_UDP_HIT_OBJECT (объект оказался у parent и поместился в UDP-ответе)
    • DIRECT (объект был запрошен с оригинального сервера)
  10. тип содержимого (MIME тип/подтип)
Формат store.log:
  1. time (unix format with ms)
  2. action

    • RELEASE (удален из кеша)
    • SWAPOUT (сохранен на диск)
    • SWAPIN (был на диске, загружен в память)
  3. HTTP reply code
  4. HTTP Date: reply header
  5. HTTP Last-Modified: reply header
  6. HTTP Expires: reply header
  7. HTTP Content-Type: reply header
  8. HTTP Content-Length: reply header
  9. реально полученное число байт (если не совпадает с предыдущим числом, объект не хранится)
  10. HTTP метод (GET, POST, …)
  11. ключ доступа (обычно URL, частные объекты еще и последовательный номер и метод)


Еще можно собирать useragent.log, все HTTP-заголовки и отладочную информацию. Я собираю только access.log и этого очень много.

Время в журналах записывается в Unix-формате (число милисекунд с 1 января 1970 года), что неудобно. Преобразовать в человеческий формат можно, например, с помощью gawk: awk '{print strftime("%Y%m%d%H%M%S",$1), $2, $3, $4, $5, $6, $7, $8, $9, $10, $11}' (printlog.sh) или perl: s/^\d+\.\d+/localtime $&/e;

Частота обращений к объектам извлекается из access.log с помощью (url_freq.sh)
awk '{print $7}' | sort | awk -f /usr/local/bin/count.awk | sort -nr +1
или без учета anchor и query-частей URL (url_freq_noq.sh)
awk '{print $7}' | awk -F'?' '{print $1}' | awk -F';' '{print $1}' | awk -F'#' '{print $1}' | sort | awk -f /usr/local/bin/count.awk | sort -rn +1

Squid не умеет работать с файлами, превышающими 2 ГБ, так что журналы надо регулярно чистить.

SARG (ранее sqmgrlog) — Squid Analysis Report Generator. Отчёты создаются в формате html (по умолчанию — в /var/www/html), для графиков используется библиотека gd. Установка пакета sarg-2.2-1.el4.rf.i386.rpm на CentOS 4.3 (x86-64 не работает, требуется пакет gd, отчёты складываются в /var/www/sarg, настройка доступа для apache в /etc/httpd/conf.d/sarg.conf). Конфигурационный файл /etc/sarg/sarg.conf (символ '#' — начало комментария, каждый параметр на отдельной строке):
 

  • language Russian_UTF-8 # language Russian_koi8
  • access_log имя-файла (журнал access.log)
  • graphs yes
  • graph_days_bytes_bar_color blue|green|yellow|orange|brown|red
  • прочие настройки оформления графики (шрифт, цвет, размер, текст)
  • #password none
  • temporary_dir /tmp
  • output_dir /var/www/sarg/ONE-SHOT
  • output_email email-адрес (отчёт посылается по e-mail вместо создания графиков)
  • resolve_ip yes (преобразовывать IP адреса в имена)
  • user_ip yes (использовать в отчёте IP адреса вместо идентификаторов пользователей)
  • topuser_sort_field {USER | CONNECT | BYTES | TIME} {reverse | normal} (тип сортировки отчёта TopUser)
  • user_sort_field {USER | CONNECT | BYTES | TIME} {reverse | normal} (тип сортировки отчёта User)
  • exclude_users {имя-файла | none | indexonly} (файл содержит имена пользователей, которых не надо включать в отчёт)
  • exclude_hosts {имя-файла | none | indexonly} (файл содержит адреса хостов и сетей, которые не надо включать в отчёт: например, 192.168.10.0)
  • useragent_log none (отчёт по UserAgent)
  • date_format {e | u } (e — dd/mm/yy, u — mm/dd/yy)
  • per_user_limit имя-файла число-МБ (записывать в файл идентификаторы пользователей, превысивших указанный лимит)
  • lastlog число-сохраняемых-отчётов (0 — без ограничений)
  • remove_temp_files yes
  • index { yes | no | only } (создавать index.html)
  • index_tree { date | file }
  • overwrite_report no (перезаписывать отчёт, если отчёт за указанный день уже существует)
  • records_without_userid {ignore | ip | everybody } (что делать, если в строке журнала нет идентификатора пользователя; ignore — пропускать строку, ip — записывать ip, everybody — вместо userid записывать строку "everybody" )
  • use_comma {no | yes} (использовать запятую вместо десятичной точки)
  • mail_utility mail (какую программу использовать для посылки отчёта по почте)
  • topsites_num 100 (сколько сайтов включить в отчёт о самых популярных сайтах)
  • topsites_sort_order {CONNECT | BYTES} {D | A} (тип сортировки отчёта о самых популярных сайтах)
  • index_sort_order {D | A} (тип сортировки индекса)
  • exclude_codes имя-файла (/etc/sarg/exclude_codes, исключить записи с указанными кодами)

    • report_type перечень-отчётов-через-пробел
    • topusers (для самых "прожорливых" пользователей выводится имя пользователя (IP адрес), имена сайтов, число байт и т.д.)
    • topsites (для самых популярных сайтов выводится имя сайта, число соединений и загруженных байт)
    • sites_users (для каждого сайта перечисляется список заходивших на него пользователей)
    • users_sites (кто и куда ходил)
    • date_time (потребление трафика почасовое и посуточное)
    • denied (denied.log, куда пользователей не пустили: время, userid, IP-адрес, URL)
    • auth_failures (ошибки аутентификации)
    • site_user_time_date (sites, dates, times and bytes report)
    • downloads (download.log: для каждого загруженного файла выводится время, userid, IP-адрес, URL; см. download_suffix)
    • usertab имя-файла (none; файл содержит соответствие между userid/IP и реальным именем)
  • long_url no (вставлять в отчёт полный URL (не советую) или только имя сайта)
  • date_time_by { bytes | elap } (включать в почасовой отчёт байты или потраченное время)
  • charset Koi8-r (а для Russian_UFT-8?)
  • user_invalid_char "&/" (символы, недопустимые в userid)
  • include_users "список:пользователей:через:двоеточие" (включать в отчёт только указанных пользователей)
  • exclude_string "список:строк:через:двоеточие" (не включать в отчёт строки журнала, содержащие указанные строки)
  • show_successful_message {yes | no}
  • show_read_statistics yes (помогает скоротать время в ожидании завершения отчёта)
  • topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
  • user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
  • topuser_num 0 (0 — без ограничений; сколько пользователей включить в отчёт о самых популярных сайтах)
  • site_user_time_date_type { table | list } (отчёт site_user_time_date в виде таблицы или списка)
  • datafile имя-файла (сохранить отчёт в виде файла для дальнейшей обработки)
  • datafile_delimiter ";"
  • datafile_fields user;date;time;url;connect;bytes;in_cache;out_cache;elapsed
  • datafile_url {ip | name}
  • weekdays 0-6 (какие дни недели помещать в отчёт)
  • hours 0-23 (какие часы помещать в отчёт)
  • dansguardian* и squidguard*
  • show_sarg_info yes (выводить сылку на сайт автора в каждом отчёте)
  • show_sarg_logo yes
  • parsed_output_log none (имя каталога для сохранения полуобработанных данных)
  • parsed_output_log_compress /bin/gzip
  • displayed_values { bytes | abbreviation}
  • authfail_report_limit строк (10)
  • denied_report_limit строк (10)
  • siteusers_report_limit строк (0)
  • squidguard_report_limit строк (10)
  • dansguardian_report_limit строк (10)
  • user_report_limit строк (10)
  • www_document_root, block_it — для общения со squidGuard и ACL
  • external_css_file /var/www/sarg/sarg.css
  • download_suffix "zip,arj,bzip,gz,ace,doc,iso,adt,bin,cab,com,dot,drv$,lha,lzh,mdb,mso,ppt,rtf,src,shs,sys,exe,dll,mp3,avi,mpg,mpeg"
  • ulimit максимальное-число-открытых-файлов
  • ntlm_user_format { username | domainname+username }


Ключи запуска sarg:

  • -a имя-или-IP-адрес (ограничить отчёт указанным клиентом)
  • -b имя-файла (отчёт по UserAgent)
  • -c имя-файла (список исключений)
  • -d дд/мм/гггг-дд/мм/гггг (ограничить интервалом дат)
  • -e email-адрес (кому послать отчёт)
  • -e stdout (выдать отчёт на стандартный вывод)
  • -f имя-конфигурационного-файла
  • -g формат-даты-в-отчёте (e — dd/mm/yy, u — mm/dd/yy)
  • -i (формировать отчёт по пользователям и IP адресам)
  • -l имя-журнала-squid (можно указывать несколько раз, но в порядке возрастания даты; понимает сжатые файлы, но разжимает их в файл и забывает удалить)
  • -n (преобразовывать IP адреса в имена)
  • -o имя-каталога (куда записывать отчёты)
  • -p (использовать в отчёте IP адреса вместо идентификаторов пользователей)
  • -s имя-сайта (ограничить отчёт указанным сайтом)
  • -t ЧЧ:ММ:СС (ограничить отчёт по времени суток)
  • -u имя-пользователя (ограничить отчёт указанным пользователем)
  • -w имя-католога-для-временных-файлов
  • -x (отладочная печать на stdout; на неё действует language и charset)
  • -z (?)


Практика — программа глючная и медленная, точнее очень глючная (sites_users содержит какую-то ерунду; забывает удалять и закрывать файлы — требуется ulimit 60000; не все графики создаются) и очень медленная (полный месячный отчёт — 180 GB трафика — обрабатывается в течение 2 часов). Сбор суммарной информации по использованию трафика пользователями за последний месяц:
 

time nice -19  sarg -d $(date —date "1 month ago" +%d/%m/%Y)-$(date —date "1 day ago" +%d/%m/%Y) \
  -x -z -l /squid/logs/access.log.5.gz …

где /etc/sarg/sarg.conf содержит

graphs no
resolve_ip no
user_ip yes
topuser_sort_field BYTES reverse
user_sort_field BYTES reverse
index yes
overwrite_report yes
records_without_userid ip
report_type topusers
usertab /etc/sarg/usertab
privacy no
exclude_string имя-своего-домена
topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
topuser_num 0
displayed_values bytes
user_report_limit 0
ulimit 60000


Сбор информацию куда ходил конкретный пользователь (10 самых "прожорливых" пользователей) за последний месяц (15 минут CPU):
 

time nice -19 sarg -f /etc/sarg/sarg.top10user.conf \
  -d $(date —date "1 month ago" +%d/%m/%Y)-$(date —date "1 day ago" +%d/%m/%Y) \
  [-a IP-адрес] -x -z -l /squid/logs/access.log.5.gz …

где /etc/sarg/sarg.top10user.conf содержит

graphs no
user_ip yes
topuser_sort_field BYTES reverse
user_sort_field BYTES reverse
records_without_userid ip
report_type topusers users_sites
usertab /etc/sarg/usertab
privacy no
exclude_string имя-своего-домена
topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
topuser_num 10
displayed_values bytes
user_report_limit 10
ulimit 60000


LightSquid — набор скриптов на perl для анализа журналов, не требует СУБД.




redirector, как средство оптимизации

redirector — внешняя программа (небуфферизованный в/в), в цикле читает с stdin URL и пишет на stdout преобразованный URL (или пустую строку, если нет преобразований). Преобразование происходит после проверки ACL, но до проверки на присутствие в кеше. В 2.6 заменён на url_rewrite_program. Формат входной строки (поля, разделенные пробелами):

  1. URL
  2. ip-address/fqdn (если fqdn нет, то "-")
  3. ident ("-", если нет)
  4. method (GET, POST, …)
  5. urlgroup (в 2.6)


В качестве примера использования редиректора для уменьшения трафика в поставке приводится редиректор, производящий нормализацию URL (приведение к стандартному виду), что увеличивает вероятность попадания в кеш. А также редиректор преобразующий запросы на загрузку всяких там IE, Netscape и пр. с различных зеркал в запросы к локальному www-серверу (автор клянется, что это дает 15%). См. также про борьбу с баннерами.

Борьба с баннерами

Только не будем спорить о морали 🙂 Но и в transparent режиме этого делать не надо. Поставьте себе локальный прокси и радуйтесь. Кстати, теми же методами можно бороться со счетчиками и порно.

Превращение банеров-картинок в рваные прямоугольники:

  1. Насобирать "вредителей" (в виде регулярных выражений)
  2. Заводим файлы в /usr/local/squid/etc:

    • banners_path_regex — по одному регулярному выражению на строку
    • banners_regex — по одному регулярному выражению на строку
    • banners_exclusion (это строки, трактуемые в предыдущих файлах как баннеры, но их лучше не трогать — JavaScript всякие)
  3. В squid.conf
acl banners_path_regex urlpath_regex "/usr/local/squid/etc/banners_path_regex"
acl banners_regex url_regex "/usr/local/squid/etc/banners_regex"
acl banners_exclusion url_regex "/usr/local/squid/etc/banners_exclusion"
http_access deny banners_path_regex !banners_exclusion
http_access deny banners_regex !banners_exclusion

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

  1. Насобирать "вредителей" (в виде регулярных выражений)
  2. На своем http-сервере завести "заменитель" рекламных картинок void.gif
Настраиваем redirector в squid.conf (если он уже используется, то добавить к старому; м.б. еще настроить redirector_access):
  1. redirect_program /usr/local/squid/bin/banners.pl
  2. banners.pl (perl выбран для простоты демонстрации):
   #!/usr/bin/perl (или где perl живет)
   $|=1;
   while (<>) {
   s@регулярное-выражение@http://www.nospam.org/nospam.gif@;
   print;}


К сожалению, использование "http_access deny" для блокировки JavaScript программ не получается (броузер не показывает страницу совсем). Поэтому приходится заменять реальный скрипт через redirect (см. выше) на что-нибудь безобидное (и каждый случай обрабатывать отдельно :(. Например, если исходный скрипт открывал окно с рекламой (<script src=…>), то вместо него подсовываем
  
<html><head>
   <script language="JavaScript"><!— window.close(); //—></script>
   </head><body></body></html>

вместо tx3 (если он встроен страницу с помощью SSI, то не поможет, да и зачем тогда его резать?):
   document.write("&nbsp;");

squidGuard




squidGuard позволяет фильтровать и переадресовывать запросы по именам доменов, URL и регулярным выражениям. Позволяет группировать пользователей по IP адресам с заданием различных правил для различных групп с указанием времени суток. Возможно задание списка "хороших" сайтов. Домены и URL могут храниться в текстовых файлах или в формате Berkeley DB. Не фильтрует содержимое запросов и встроенные скрипты. GPL. Можно использовать бесплатно в любых целях, кроме продажи. К сожалению не изменялся с 2001 года (хотя есть заплатки от последователей и последователей).

Устанавливаю из готового пакета (/usr/bin/squidGuard, /etc/squid/squidguard.conf, /etc/logrotate.d/squidguard, /var/log/squidguard/, /usr/share/doc/squidguard-1.2.0/), пакета с чёрным списком (/etc/squid/squidguard-blacklists.conf; /etc/logrotate.d/squidguard-blacklists; /etc/squid/local/bad/; /etc/squid/local/good/; /var/lib/squidguard/: ads/, adult/, aggressive/, audio-video/, drugs/, forums/, gambling/, hacking/, local, mail/, /proxy/, violence/, warez/). Из исходных текстов устанавливается обычным путём (./configure; make; make install), требуется Berkeley DB 2.x. После установки необходимо настроить /etc/squid/squidguard-blacklists.conf и просмотреть входящие в комплект чёрные списки. Настроить squid.conf:
redirector_bypass on
redirect_program /usr/bin/squidGuard -c /etc/squid/squidguard-blacklists.conf
acl squidGuard …
redirector_access allow squidGuard

Опции squidGuard:

  • -d (вывод ошибок на stderr)
  • -c имя-файла-настроек
  • -t yyyy-mm-ddTHH:MM:SS (?)
  • -C имя-файла | all (преобразовать текстовый файл в .bd, не забыть указать "-c имя-файла-настроек")
  • -u (слить изменения из файлов .diff в .bd)


Файл настройки описывает поименованные группы интервалов времени (используется при описании группы клиентов), группы пользователей (по IP адресам), группы URL (ссылки на текстовые файлы и БД), группы правил переадресации и группы ACL. Комментарии начинаются с '#'; имеется большой список зарезервированных слов (в частности: anonymous, user, userlist); нельзя ссылаться на описания групп вперёд; описания групп начинаются с

тип-группы имя-группы {

и завершаются '}'. В начале файла указываются имена используемых файлов:

  • logdir имя-каталога (в этом каталоге будут лежать файлы squidGuard.error и squidGuard.log; имя-каталога также используется как базовое имя для имён файлов, описываемых в директиве log)
  • dbhome имя-каталога (имя-каталога используется как база для имён файлов, со списками доменов, выражений и URL


Описание интервала времени (имя типа: time) состоит из перечня спецификаций (каждое на отдельной строке, при перекрытии интервалы объединяются), следующих видов (вместо года, месяца или дня можно указать '*'):

  • weekly sunday […] [HH:MM-HH:MM]
  • date YYYY-MM-DD […] [HH:MM-HH:MM …]
  • date YYYY-MM-DD-YYYY-MM-DD [HH:MM-HH:MM …]


Описание группы клиентов (имя типа: source) состоит из перечня адресов клиентов в следующих форматах (файл содержит на каждой строке IP адрес без ключевого слова "ip"; использование доменов требует log_fqdn в squid.conf; имена пользователей определяются по протоколу ident; спецификации одного типа объединяются, разных типов — пересекаются; группы могут пересекаться — приоритет имеет первая по тексту; имя журнала берётся относительно logdir):

  • ip адрес-хоста …
  • ip адрес-сети/длина-маски …
  • ip адрес-сети/маска …
  • ip адрес-адрес …
  • iplist имя-файла
  • domain имя-хоста …
  • user имя-пользователя …
  • userlist имя-файла
  • logfile имя-файла


Описание группы клиентов может иметь условие по времени:

source имя-группы-клиентов [within|outside имя-интервала-времени] {
  …
} else {
  …
}


Описание группы URL (имя типа: destination) состоит из перечня URL в следующих форматах (спецификации любых типов объединяются; группы могут пересекаться — приоритет имеет первая в директиве pass; в списках необходимо использовать только строчные буквы; включение имени домена включает все хосты во всех поддоменах этого домена; при включении URL в список из него необходимо удалить "http://www.", ":8080" и завершающее имя или "/"; в строке списка URL можно в качестве второго поля указать новый URL для перенаправления (это работает быстрее, чем rewrite); использование регулярных выражений сильно замедляет работу; имя журнала берётся относительно logdir):

  • domainlist имя-файла
  • urllist имя-файла
  • expressionlist имя-файла
  • redirect [302:]URL
  • logfile имя-файла


Описание группы URL может иметь условие по времени:

destination имя-группы [within|outside имя-интервала-времени] {
  …
} else {
  …
}


Описание группы правил переадресации (имя типа: rewrite) состоит из перечня правил замены URL в следующих форматах

  • s@исходное-регулярное-выражение@результат@[irR]

    • i — нечувствительность к регистру
    • r — переадресация будет видима клиенту (через код HTTP 302, Moved Temporarily)
    • R — переадресация будет видима клиенту (через код HTTP 301, Moved Permanently)

logfile имя-файла

Описание группы правил переадресации может иметь условие по времени:

rewrite имя-группы [within|outside имя-интервала-времени] {
  …
} else {
  …
}


Описание группы ACL (ровно одна непоименованная группа) содержит для каждой группы пользователей правила поведения фильтра в формате

имя-группы-клиентов [within|outside имя-интервала-времени] {
  pass [!]имя-группы-URL …
  [rewrite имя-группы-переадресации]
  [redirect [301:|302:]новый-адрес]
} else {
  …
}


Имеется специальная группа пользователей default, в которую входят пользователи, не вошедшие ни в одну из остальных групп или вошедшие в группу, не имеющую ACL; здесь же задаются правило переадресации для групп клиентов, не имеющих собственных правил переадресации.

Имеется следующие встроенные группы URL

  • any — соответствует любому URL (эквивалент ".*")
  • all — синоним any
  • none — эквивалент !any
  • in-addr — "^[^:/]+://[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}($|[:/])"


Директива redirect (если URL блокируется фильтром, то какой-нибудь redirect должен быть обязательно определён) позволяет производить подстановку переменных (в поставке имеется шаблон squidGuard.cgi для создания красивых страниц с объяснением):

  • %a — IP адрес клиента
  • %n — имя хоста клиента
  • %i — имя пользователя согласно ident
  • %s — имя группы клиентов
  • %t — имя группы URL
  • %u — URL
  • %p — REQUEST_URI


Первый же сайт, на который я зашёл (rambler.ru), оказался в списках ads и adult.

Приемы конфигурации

Простейшие случаи иерархии. Основной squid с консервативными настройками и вспомогательный с агрессивными настройками (антибаннер ;).
Консервативный:

  • ICP выключен
  • никаких соседей
  • maximum_object_size побольше
  • большой объем кеша на диске
  • стандартные (почти) настройки refresh_pattern
  • transparent proxy

Агрессивный:
 

  • ICP выключен
  • cache_peer основной parent 3128 3130 no-query default # если не нашел объект в своем кеше, то обращаться к parent, а не к источнику
  • prefer_direct off
  • hierarchy_stoplist — пустой
  • maximum_object_size побольше
  • очень небольшой объем кеша на диске (пробовал поставить нулевой размер и cache_peer … proxy-only, но возникают проблемы при обработке ошибок)
  • собственно агрессивная настройка:
  • redirect
  • refresh
  • acl, http_access, deny_info

Закрыть доступ к какой-то информации для клиентов

badobjects — это произвольное имя ACL; ERR_ACCESS_DENIED — имя файла в /usr/lib/squid/errors/English или в подобном месте, вместо этого файла можно поставить для каждой ситуации свой файл; воздействие http_access зависит от места, в которое его поставить; если squid получает от parent TCP_DENIED, то он лезет напрямую:

  • acl badobjects url_regex регулярное-выражение
  • http_access deny badobjects
  • deny_info ERR_ACCESS_DENIED badobjects

Шаблон для борьбы с RealPlayer

http://[^/]+/SmpDsBhgRl

Как удалить объект из кеша

В squid.conf:
 
acl PURGE method purge
acl localhost src 127.0.0.1
http_access allow purge localhost
http_access deny purge
Теперь для каждого удаляемого объекта: client -m PURGE URI

Использование дополнительного канала для доступа в Интернет

Имеем маршрутизатор (Cisco) с двумя каналами доступа в Интернет через двух различных провайдеров. Клиентские компьютеры расположены в адресном пространстве одного из них, а хочется нагрузить оба канала на прием. Создаем файл as.list, содержащий список AS ,к которым мы хотим обращаться через второй канал. Конфигурируем squid:

  • acl all src 0.0.0.0/0.0.0.0
  • acl second dst_as "as.list"
  • cache_peer второй-squid parent 3129 0 no-query default (описываем вспомогательный squid как старший для нас)
  • cache_peer_access второй-squid allow second (обращаться к нему только, если сервер находится в AS из списка)
  • hierarchy_stoplist какой-нибудь-бред deny all (чтобы cgi-bin и QUERY тоже шли по этому маршруту)
  • never_direct allow second (не обращаться напрямую к серверам из AS списка)
  • never_direct deny all

Конфигурируем вспомогательный squid-сервер (можно даже на том же хосте — специально выбран нестандартный порт; только прямого доступа к нему давать не надо):

  • никаких соседей/icp/htcp
  • tcp_outgoing_address из адресного пространства второго провайдера
  • никакого кеширования

SNMP

Для сбора статистики с помощью встроенного агента SNMP Squid должен быть собран с ключом —enable-snmp. По умолчанию, squid слушает SNMP запросы на порту 3401 (вместо стандартного 161).

Для обеспечения прав доступа надо записать в squid.conf (не забывайте про сетевой экран):

acl snmppublic snmp_community имя-сообщества
# snmp_port 3401
snmp_access allow snmppublic localhost


MIB файл называется /usr/local/squid/share/mib.txt: надо убрать фигурные скобки со всем содержимым из описания модуля, положить его в /usr/share/snmp/mibs. Извлечение полного дерева объектов:
   snmpwalk -p 3401 -m SQUID-MIB имя-хоста имя-сообщества squid

При описании использована форма записи SMIv2, хотя поддерживается только SNMPv1. Единственная переменная, определенная как read-write: cacheLoggingFacility (нечаянно?). trap отсутствуют. Все объекты лежат в поддереве iso.org.dod.internet.private.enterprises.nlanr.squid (1.3.6.1.4.1.3495.1):

  1. cacheSystem

    1. cacheSysVMsize (объем кеша в оперативной памяти, в KB)
    2. cacheSysStorage (объем кеша на диске, в KB)
    3. cacheUptime (в 1/100 секунды)
  2. cacheConfig

    1. cacheAdmin (e-mail)
    2. cacheSoftware
    3. cacheVersionId
    4. cacheLoggingFacility
    5. cacheStorageConfig
    1.  

      1. cacheMemMaxSize (значение cache_mem в MB)
      2. cacheSwapMaxSize (значение cache_dir в MB)
      3. cacheSwapHighWM
      4. cacheSwapLowWM
  3. cachePerf

    1. cacheSysPerf
    1.  

      1. cacheSysPageFaults (потребовавших физического в/в)
      2. cacheSysNumReads (число команд ввода для HTTP)
      3. cacheMemUsage (в KB, у меня -1 🙂
      4. cacheCpuTime (секунд)
      5. cacheCpuUsage (%, у меня всегда 3% 🙂
      6. cacheMaxResSize (в KB, у меня 0 🙂
      7. cacheNumObjCount (число объектов в кеше)
      8. cacheCurrentLRUExpiration
      9. cacheCurrentUnlinkRequests (число запросов к unlinkd)
      10. cacheCurrentUnusedFDescrCnt (свободных дескрипторов файлов)
      11. cacheCurrentResFileDescrCnt (зарезервированных fd)
  4. cacheProtoStats

    1. cacheProtoAggregateStats
    1.  

      1. cacheProtoClientHttpRequests
      2. cacheHttpHits
      3. cacheHttpErrors
      4. cacheHttpInKb (от клиентов)
      5. cacheHttpOutKb (клиентам)
      6. cacheIcpPktsSent
      7. cacheIcpPktsRecv
      8. cacheIcpKbSent
      9. cacheIcpKbRecv
      10. cacheServerRequests (к HTTP серверам и родителям)
      11. cacheServerErrors
      12. cacheServerInKb (от серверов)
      13. cacheServerOutKb
      14. cacheCurrentSwapSize (в KB)
      15. cacheClients (число клиентских кешей)
    1. cacheMedianSvcTable (усредненная статистика за интервал времени, указанный в cacheMedianTime)
    1.  

      1. cacheMedianSvcEntry (индекс доступа к экземпляру: cacheMedianTime)
    1.  

      1.  

        1. cacheMedianTime (интервал времени усреднения: 1, 5 и 60 минут)
        2. cacheHttpAllSvcTime (среднее время обслуживания всех запросов, милисекунд)
        3. cacheHttpMissSvcTime (среднее время обслуживание запросов, отсутствующих в кеш или устаревших)
        4. cacheHttpNmSvcTime (HTTP near miss service time)
        5. cacheHttpHitSvcTime (среднее время обслуживание запросов, найденных в кеш; по-моему, считается неправильно: TCP_HIT для локального хоста без обращения к серверу картинки в 8 кБ иногда требует больше получаса)
        6. cacheIcpQuerySvcTime
        7. cacheIcpReplySvcTime
        8. cacheDnsSvcTime (среднее время обслуживания DNS)
        9. cacheRequestHitRatio (%, можно вычислить по cacheProtoClientHttpRequests и cacheServerRequests)
        10. cacheRequestByteRatio (%, можно вычислить по cacheServerInKb и cacheHttpOutKb)
  5. cacheNetwork

    1. cacheIpCache (статистика кеша IP: получение IP адреса по имени и доступность сервера)
    1.  

      1.  

        1. cacheIpEntries (элементов в кеше IP)
        2. cacheIpRequests
        3. cacheIpHits
        4. cacheIpPendingHits
        5. cacheIpNegativeHits
        6. cacheIpMisses
        7. cacheBlockingGetHostByName
        8. cacheAttemptReleaseLckEntries
  6. cacheFqdnCache (определение полного имени по простому)

    1.  

      1.  

        1. cacheFqdnEntries (у меня их всего 2)
        2. cacheFqdnRequests
        3. cacheFqdnHits
        4. cacheFqdnPendingHits
        5. cacheFqdnNegativeHits
        6. cacheFqdnMisses
        7. cacheBlockingGetHostByAddr
  7. cacheDns

    1.  

      1. cacheDnsRequests
      2. cacheDnsReplies
      3. cacheDnsNumberServers
  8. cacheMesh (таблицы соседей и клиентов, их состояние и статистика, у меня не работает, да и в описании ошибки)

Мониторинг с помощью rrdtool

Для мониторинга работы Squid можно использовать MRTG или rrdtool. В последнее время я потихонечку перевожу весь свой мониторинг с MRTG на rrdtool. Хотя использование rrdtool более трудоемко, зато он требует меньше ресурсов при работе и не заполняет всю имеющуюся память при проблемах с сетью. К тому же он позволяет выводить больше 2 графиков на одну картинку. При этом я имитирую внешний вид и поведение mrtg. К сожалению, не вся статистика доступна по SNMP (например, доля прерванных соединений), а часть той статистики, что должна извлекаться согласно документации, извлекается с ошибками. Нам надо: спроектировать структуру БД и создать ее; обеспечить внесение изменений каждые 5 минут; обеспечить регулярное обновление суточных, недельных, месячных и годовых графиков; создать набор HTML страниц для доступа к графикам.

Все данные, связанные с работой Squid, у меня хранятся в одной БД. К сожалению, rrdtool не позволяет добавлять или удалять DS (data source) из существующей БД (разве что с помощью dump/restore), так что если в дальнейшем потребуется собирать дополнительную информацию, то ее придется хранить во второй БД. Интервал измерения как в mrtg — 300 секунд. Значения каждой DS хранятся в четырех RRA с использованием усреднения по 1, 6, 24 и 288 отсчетам соответственно. Размер RRA выбран достаточным для построения графиков за 2 дня, 2 недели, 2 месяца и 2 года соответственно. Информация извлекается с помощью протокола SNMP. Команду для создания БД можно взять в архиве. Имена DS совпадают с простыми дескрипторами объектов Squid MIB (некоторые пришлось "укоротить" из-за ограничения на длину имени DS в rrdtool):

  • cacheSysPageFaults
  • cacheSysNumReads
  • cacheCpuTime
  • cacheCpuUsage (не используется для построения графиков)
  • cacheNumObjCount
  • cacheCurrentUnlink
  • cacheCurrentUnusedF
  • cacheProtoClientHtt
  • cacheHttpHits
  • cacheHttpErrors
  • cacheHttpOutKb
  • cacheServerRequests
  • cacheServerErrors
  • cacheServerInKb
  • cacheCurrentSwap
  • cacheHttpAllSvcTime
  • cacheHttpMissSvc
  • cacheHttpHitSvcTime
  • cacheDnsSvcTime
  • cacheRequestHit (не используется для построения графиков)
  • cacheRequestByte (не используется для построения графиков)
  • cacheIpEntries
  • cacheIpRequests
  • cacheIpHits
  • cacheIpNegativeHits
  • cacheDnsRequests
  • cacheDnsReplies


Изменения запрашиваются и вносятся в БД каждые 5 минут с помощью скрипта squid_update.sh (вызывается из crontab).

Суточные, недельные, месячные и годовые графики генерируются скриптом squid_graph.sh соответственно раз в 5 минут, 30 минут, 2 часа и 1 день (вызывается из crontab). Скрипт имеет 2 параметра: начало отсчета (-2days, -14days, -50days и -20month) и суффикс имени PNG-файла (5min, 30min, 2h, 1d). Получаются следующие графики (за дизайн извиняйте — мне в детстве медведь наступил не только на ухо :):

  • squid_hr_???.png (эффективность кеширования в хитах и байтах)
  • squid_cpu_???.png (использование CPU)
  • squid_svctime_???.png (среднее время обслуживания запросов)
  • squid_traffic_???.png (траффик от серверов и к клиентам)
  • squid_request_???.png (число запросов в секунду)
  • squid_ipreqs_???.png (число запросов в секунду к DNS-кешу)
  • squid_ipentries_???.png (число объектов в DNS-кеше)
  • squid_dnsreqs_???.png (число запросов в секунду к DNS-серверу)
  • squid_pf_???.png (число обращений в секунду к файлу подкачки)
  • squid_reads_???.png (число чтений HTTP в секунду)
  • squid_unlinks_???.png (число удалений объектов из кеша в секунду)
  • squid_unusedfd_???.png (число используемых и свободных дескрипторов файлов)
  • squid_swapsize_???.png (используемое под кеш место на диске)
  • squid_objects_???.png (число объектов в дисковом кеше)
  • squid_errors_???.png (число ошибок в секунду)


Все 4 графика каждого типа объединяются в одну HTML страницу. Чтобы не писать 15 почти одинаковых страниц, используется SSI, а именно: сделан шаблон и 15 страниц типа (title — заголовок страницы, groupprefix — начало имени файла, к которому в шаблоне добавлются суффиксы вида "_5min.png"):

<!—#set var="title" value="Squid CPU Usage" —>
<!—#set var="groupprefix" value="squid_cpu" —>
<!—#include file="rrdtool_template.shtml" —>


Все страницы, посвященные мониторингу Squid, объединяются индексной страницей, содержащей 5-минутные графики всех типов и ссылки на соответствующие страницы.

В действительно, мониторится не только Squid, так что вызовы описанных выше скриптов включены в вызовы скриптов верхнего уровня, а ссылка на индексную страницу — в управляющую консоль.


Извлечение и удаление объектов из кеша

Утилита purge позволяет извлекать сохраненные объекты из кеша (с сохранением информации о структуре URL и самих файлах) или удалять их (как "правильные" объекты с помощью обращения к Squid методом PURGE, так и ошибочные файлы напрямую).

Сборка производится с помощью команды make (не надо читать про RCS в README!). Извлечение файлов MP3 из кеша (ограничитель шаблона — $ — ставить не надо, так как некоторые сервера добавляют всякий мусор в конце URI дабы избежать кеширования):
./purge -n -a -s -C /tmp/MP3s/ -e '\.mp3|\.wav'|fgrep -v 'strange file'
Взято с http://squid.opennet.ru/

Squid — кеширующий прокси сервер, кстати портирован и под Windows, если кого заинтересует можно будет выложить конфиги здесь для Win версии


Squid Быстро и Надёжно

Squid (кеширующий прокси для http): установка, настройка и использование

Авторизация Windows-пользователей в SQUID на основе их доменных аккаунтов

SARG и как его использовать

Squid создание отчётности в Windows


Samba — ну куда же без неё в реальной жизни, в малых органиациях подойдёт как контроллер домена, в больших сыграет неплохую роль как файл или принт сервер.


Контроллер домена на Samba 3

«Тонкости настройки PDC под SAMBA-3»

«Как подружить Samba 3 и контроллер домена Windows 2003 SP1»


Почта


Cyrus: POP3/IMAP сервер: установка, доработки, настройка


Мониторинг состояния серверов


Система мониторинга на основе Nagios

Мониторинг Windows серверов с помощью Nagios

Осваиваем Nagios

Мониторинг UNIX серверов c помощью Nagios и SNMP


Маршрутизатор на основе Linux



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

После того, как вы скачали, откомпилировали и установили Squid (см.
файл INSTALL в корневой директории исходников), вам необходимо
отредактировать файл squid.conf. Ниже приведен список параметров,
которые вам *необходимо* изменить, т.к. по умолчанию им не присвоены
какие-либо значения. Другие переменные пока не трогайте. Мы
предполагаем, что вы установили Squid в /usr/local/squid, как указано
по умолчанию.

Раскоментируйте и отредактируйте следующие строки в файле
/usr/local/squid/etc/squid.conf:
cache_peer
Если у вас есть родительский кеш, укажите его здесь. Администраторы
родительского кеша обычно дают вам необходимые инструкции. Но вы всегда
должы спрашивать разрешения перед тем, как добавить родительский кеш.
cache_mem
Укажите здесь кол-во памяти (имеется ввиду ОЗУ) выделенной под
кеширование. Предупреждение: реально Squid использует больше, чем
указанное здесь значение. Золотое правило: если вы имеете N мегабайт
свободной памяти, которую можете отдать под Squid, укажите здесь
значение N/3.
cache_dir

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

Укажите здесь (первое число, в данном случае — 100) кол-во дискового
пространства, отведенного под кеш (в мегабайтах).
acl, http_access, icp_access, miss_access
Списки контроля доступа. Это важно, т.к. предотвращает нелегальное
использование ваших сетевых ресурсов кем-либо. Чтобы попасть в ACL для
разрешенных хостов (allowed_hosts), используйте ваш адрес сети (к
примеру 192.168.10.0) и маску вашей сети (к примеру 255.255.255.0):

acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl all src 0.0.0.0/0.0.0.0
acl allowed_hosts src 192.168.10.0/255.255.255.0

http_access deny manager all
http_access allow allowed_hosts
http_access deny all

icp_access allow allowed_hosts
icp_access deny all

miss_access allow allowed_hosts
miss_access deny all

cache_mgr
Укажите здесь адрес e-mail человека, отвечающего за работу прокси:
cache_effective_user
Если вы должны запускать Squid из под root, найдите безопасного
пользователя и группу от которых он будет запускаться после загрузки
системы (обычно «nobody» и «nogroup»). Не используйте «root» по
соображениям безопасности.
visible_hostname
Имя хоста, представляющего кеш.

После редактирования под ваши нужды файла squid.conf, запустите Squid
из командной строки ДВАЖДЫ, вот так:

% /usr/local/squid/sbin/squid -z
% /usr/local/squid/sbin/squid

Проверьте ваш cache.log (/usr/local/squid/var/logs/cache.log), чтобы
убедиться, что все в порядке. Появление предупреждения «WARNING: Cannot
write to swap directory» абсолютно нормально для первого запуска Squid.

Как только Squid создаст все необходимые файлы (на некоторых системах
это может занять до нескольких минут), проверьте его работоспособность
при помощи echoping или обычного Web-клиента. По умолчанию ваш Squid
будет запущен на порту 3128.
Как только вам удалось заставить работать Squid из командной строки,
можете указать вашему Unix запускать Squid во время загрузки системы (в
основном это зависит от того, какой Unix вы используете, в большинстве
случаев вам потребуется внести изменения в файл типа
/etc/rc_something).

Эта инструкция по быстрому запуску написана Stephane Bortzmeyer и Duane
Wessels.

Перевод: Вадим Веремеенко

авторство не претендую потому как глупо
Взято с http://www.squid.opennet.ru/