Настройка Squid в связке с  Rejik
Введение:

В статье хочу поделиться своим вариантом установки и конфигурирования
прокси сервера SQUID в связке с Rejik для фильтрации баннеров.

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

Рабочий пример, тест на FreeBSD 8.0-RELEASE i386:

Установка и настройка прокси-сервера SQUID

Ставим из пакетов:

   # pkg_add -r -K squid

ключ -r загружает пакет с удаленного сервера.
ключ -K сохраняет копию пакета в текущей директории.
Конфигурируем:

vi /usr/local/etc/squid/squid.conf


   #WELCOME TO SQUID 2.7.STABLE7
   #----------------------------------------------------------------
   #Имя листа доступа all, обозначающий все внутренние адреса:
   acl all src all

   #Имя листа доступа manager, отмечает протокол cache_object:
   acl manager proto cache_object

   #Имя листа доступа localhost, отмечает IP-клиента (127.0.0.1)
   acl localhost src 127.0.0.1/32

   #Имя листа доступа to_localhost, отмечает подсеть ресурсов:
   acl to_localhost dst 127.0.0.0/8 0.0.0.0/32

   #----------------------------------------------------------------
   #Отмечаем подсети клиентов, которые могут обращаться к SQUID:
   acl localnet src 172.16.0.0/24
   acl localnet src 172.16.1.0/24

   #----------------------------------------------------------------
   #Имена листов доступа, с указанием ресурсов:
   acl  ip-block           dst             "/usr/local/etc/squid/block/ip-block"
   acl  sites-block1       dstdomain       "/usr/local/etc/squid/block/sites-block1"
   acl  sites-block2       dstdomain       .odnoklassniki.ru .vkontakte.ru

   #----------------------------------------------------------------
   #Имена листов доступа, отмечающие порты и медот соединения:
   acl  SSL_ports          port                    443
   acl  ports-std          port                    21 80 443 5190 9080 9443
   acl  CONNECT            method  CONNECT

   #----------------------------------------------------------------
   #Правило разрешает обращаться к КЭШу локальному ХОСТу.
   http_access allow manager localhost

   #Правило запрещает обращаться к КЭШу всему остальному.
   http_access deny manager

   #----------------------------------------------------------------
   #Правило запрещает все порты, кроме указ. в листе доступа "ports-std"
   http_access deny !ports-std

   #Правило запрещает соединения по методу "CONNECT" кроме порта 443:
   http_access deny CONNECT !SSL_ports

   #---------------------------------------------------------------
   #INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
   #---------------------------------------------------------------
   #Здесь указываем листы доступа отдельных клиентов, которым  требуется
   #гибко настроить уровень доступа:
   #---------------------------------------------------------------
   acl                     user1 src 172.16.0.100
   http_access allow       user1
   #---------------------------------------------------------------
   acl                     user2 src 172.16.0.101
   http_access deny        user2 ip-block
   http_access deny        user2 sites-block1
   http_access allow       user2
   #---------------------------------------------------------------
   
   #Здесь указываем запреты для остальных клиентов нашего прокси:

   http_access deny        localnet ip-block
   http_access deny        localnet sites-block1
   http_access deny        localnet sites-block2
   http_access allow       localnet
   http_access deny all

   #================================================================
   #Блокируем доступ к КЭШу нашего сервера:
   icp_access deny all

   #----------------------------------------------------------------
   #Откл. ICP-порт, если др. сервера не обращаются к КЭШу нашего сервера:
   icp_port 0

   #Указываем порт нашего прокси:
   #Если фаерволом используется редирект на прокси,
   #необходимо добавить опцию "transparent":

   #http_port 3128
   http_port 3128 transparent

   #---------------------------------------------------------------
   #Параметр указывает, какая программа использыется для редиректа. Если
   #утилита не установлена в системе, то требуется закомментировать опцию.
   #url_rewrite_program /usr/local/rejik/redirector /usr/local/rejik/redirector.conf

   #---------------------------------------------------------------
   #Default:
   #Язык страницы-блокировки, отображается при блокировании ресурсов.
   #error_directory /usr/local/etc/squid/errors/English
   error_directory /usr/local/etc/squid/errors/Russian-koi8-r

   #---------------------------------------------------------------
   #TAG: cache_peer
   #Default:
   #none
   #Если  у  вас есть  родительский  кеш, укажите его здесь. Администраторы
   #родительского кеша обычно дают вам необходимые инструкции. Но вы всегда
   #должы спрашивать  разрешения  перед тем, как добавить родительский кеш.

   #---------------------------------------------------------------
   #Default:
   #Кол-во памяти (ОЗУ) выделенной под кеширование.
   #Предупреждение: реально SQUID  использует  больше, чем  указанное здесь
   #значение. Золотое правило: если вы имеете N  мегабайт свободной  памяти,
   #которую можете отдать под squid, укажите здесь значение N/3.
   #cache_mem 8 MB
   cache_mem 256 MB

   #---------------------------------------------------------------
   #Первое число 100 -это количество дискового пространства, отведенного
   #под кеш (в мегабайтах). Второе и третье число  -каталоги первого
   #и второго уровня соответственно.
   #Default:
   #cache_dir ufs /usr/local/squid/cache 100 16 256
   cache_dir ufs /usr/local/squid/cache 2048 16 256

   #--------------------------------------------------------------
   #TAG: cache_mgr
   #Адрес эл. почты администратора прокси-сервера, который отображается
   #только на английской версии страницы, при блокировке ресурсов.
   #Default:
   #cache_mgr webmaster
   cache_mgr you@hostname.local

   #--------------------------------------------------------------
   #Default:
   #Имя пользователя, от имени которого работает SQUID в системе:
   #cache_effective_user squid

   #--------------------------------------------------------------
   #TAG: visible_hostname
   #В некоторых случаях, для работы демона SQUID, требуется указать  имя
   #хоста, на котором он работает.
   #Default:
   #none
   visible_hostname you.hostname.local

   #--------------------------------------------------------------
   #Default:
   #Имя файла, для записи идентификатора процесса:
   #pid_filename /usr/local/squid/logs/squid.pid

   #--------------------------------------------------------------
   #Default:
   #Показывает, какие объекты выбрасываются из кэша, и какие объекты
   #сохраняются и на какой срок. Если нет утилиты для анализа этих данных,
   #можно смело отключать.
   #cache_log /usr/local/squid/logs/cache.log
   cache_log none

   #--------------------------------------------------------------
   #Default:
   #Показывает, какие объекты выбрасываются из кэша, и какие объекты
   #сохраняются и на какой срок. Если нет утилиты для анализа этих данных,
   #можно смело отключать.
   #cache_store_log /usr/local/squid/logs/store.log
   cache_store_log none

   #--------------------------------------------------------------
   #TAG: hierarchy_stoplist
   #Список строк - через пробел, - при встрече в URL которых, запрос  будет
   #направлен сразу напрямую, а не "по соседям"; по-умолчанию -"cgi-bin ?":
   hierarchy_stoplist cgi-bin ?

   #--------------------------------------------------------------
   #TAG: access_log
   #Файл журнала деятельности запросу клиента. С каждой линии HTTP или
   #ICP запросу. Если статистика не нужна, указать: access_log none
   access_log /usr/local/squid/logs/access.log squid

   #--------------------------------------------------------------
   #TAG: refresh_pattern
   #Используется, чтоб определить не устарел ли объект в КЭШе:
   #usage: refresh_pattern [-i] regex min percent max [options]
   refresh_pattern ^ftp:                1440        20%        10080
   refresh_pattern ^gopher:        1440        0%        1440
   refresh_pattern -i (/cgi-bin/|\?) 0        0%        0
   refresh_pattern .                0        20%        4320

   #--------------------------------------------------------------
   #TAG: upgrade_http0.9
   #Лист доступа shoutcast, обозн. имя заголовка по заданному выражению:
   acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]

   #Опция upgrade_http0.9, позволяющая отключить обновл. откликов HTTP/0.9:
   upgrade_http0.9 deny shoutcast

   #--------------------------------------------------------------
   #TAG: broken_vary_encoding
   #Лист доступа "apache", обозн. имя заголовка по заданному выражению:
   acl apache rep_header Server ^Apache

   #Правило разрешает принимать битые заголовки от ACL apache:
   broken_vary_encoding allow apache

   #--------------------------------------------------------------
   #TAG: coredump_dir
   #Директория, где хранится КЭШ SQUID:
   coredump_dir /usr/local/squid/cache


Далее создаем директорию, в которой будут хранится файлы для блокирования
ресурсов, используемые SQUID`ом:

   # mkdir /usr/local/etc/squid/block

Создаем сами файлы:
Список блокируемых ip-адресов:

   # cat > /usr/local/etc/squid/block/ip-block
   169.254.0.1
   169.254.0.2
   169.254.0.3

   ^C

Список блокируемых доменов:

   # cat > /usr/local/etc/squid/block/sites-block1
   afisha.ru
   mail.ru

   ^C

Назначаем владельца, на директорию

   # chown -R squid /usr/local/etc/squid/block/


Далее делаем первый запуск SQUID:

   # squid -z
   2010/06/07 15:58:46| Creating Swap Directories

Параметр -z нужен для создания (обнуления) каталога, содержащего кэш.
Параметр -z нужен только при первом запуске.

После, будет создан файл squid.pid, которому необходимо задать владельца:

   # chown -R squid /usr/local/squid/logs/squid.pid

После этого заработает рестарт SQUID:

   # /usr/local/etc/rc.d/squid [start/stop/restart]

и реконфигурирование SQUID:

   # squid -k reconfigure

Добавим строку в /etc/rc.conf для автозапуска squid:

   squid_enable="YES"

Увидеть что SQUID корректно запустился, можно посмотрев:

vi /var/log/messages

   Jun  7 16:30:19 hostname squid[1014]: Squid Parent: child process 1018 started

Или внести изменения в настроки браузера :)

Возможные ошибки:

Если после запуска в логах "/usr/local/squid/logs/cache.log" видно:
Could not determine fully qualified hostname.Please set 'visible_hostname
В "/usr/local/etc/squid/squid.conf" нужно указать:

   visible_hostname you.hostname.local

Если store.log быстро растет без видимых причин, исправляем пересозданием директории с кЭшем SQUID.


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

Ставим из пакетов:
   
   # pkg_add -r rejik

Копируем банлисты в рабочий каталог Режика:
В случае установки из портов:

   # cp -R /usr/ports/www/rejik/work/banlists /usr/local/rejik

В случае установки из пакетов, с официального сайта http://www.rejik.ru/

Качаем файл "banlists-2.x.x.tgz" и "www.tgz", для Веб-страниц

Распаковываем банлисты:

   # tar vxzf ./banlists-2.x.x.tgz

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

   # cp -R ./banlists /usr/local/rejik/

Распаковываем странички:

   # tar vxzf ./www.tgz

Копируем в директорию, где лежат файлы Apache-сервера:

   # cp -R ./www /usr/local/www/data

Даем права пользователю, от которого работает Apache

   # chown -R www:www /usr/local/www/data/www/

Даем права пользователю на директорию Rejik, от которого работает SQUID:

    # chown -R squid:squid /usr/local/rejik/

Чтобы избежать ошибок в /usr/local/squid/logs/cache.log

    Can't write to file /usr/local/rejik/redirector.err: Permission denied

Конфигурируем:

vi /usr/local/rejik/redirector.conf

   error_log /usr/local/rejik/redirector.err
   change_log /usr/local/rejik/redirector.log
   make-cache /usr/local/rejik/make-cache
   #allow_urls /usr/local/rejik/banlists/allow_urls

   <BANNER>
   ban_dir /usr/local/rejik/banlists/banners
   url http://127.0.0.1/www/1x1.gif
   #log off

   <PORNO>
   ban_dir  /usr/local/rejik/banlists/porno
   url http://127.0.0.1/www/porno.html

   <MP3>
   ban_dir /usr/local/rejik/banlists/mp3
   url http://127.0.0.1/www/mp3.html

   <JS>
   ban_dir /usr/local/rejik/banlists/js
   url http://127.0.0.1/www/js.js
   #log off

Далее, в /usr/local/etc/squid/squid.conf включаем опцию редиректа,
сняв комментарий со строки:

   #url_rewrite_program /usr/local/rejik/redirector /usr/local/rejik/redirector.conf
   url_rewrite_program /usr/local/rejik/redirector /usr/local/rejik/redirector.conf

Вносим изменения в файлы режика в соответствии по желаниям блокировки:

   /usr/local/rejik/banlists/banners/urls
   /usr/local/rejik/banlists/porno/urls
   /usr/local/rejik/banlists/js/urls

Например, чтобы заблокировать баннеры на сайте
www.test.ru, достаточно добавить эти строчки:

   # cat > /usr/local/rejik/banlists/banners/urls
   ad.test.ru
   bannerhost.ru
   doubleclick.net
   pagead2.googlesyndication.com

   ^C

После выполнения команды:

   # squid -k reconfigure

будут приняты изменения конфигурации, в том числе и нашего редиректа.

Источник opennet.ru