Web Proxy сервер SQUID + SquidGuard / rejik на Debian Wheezy

Squid— программный пакет с открытым исходным кодом (распространяемый в соответствии с GNU/GPL), реализующий функцию кэширующего прокси-сервера для протоколов HTTP/HTTPS, FTP и Gopher. Позволяет аутентифицировать подключения и управлять доступом в соответствии со списками контроля доступом (ACL). Squid поддерживает три типа аутентификации: по IP-адресу (или доменному имени узла), по переданному логину и паролю (поддерживает взаимодействие с Active Directory путем аутентификации через LDAP), а так же по идентификатору пользовательского агента (браузера).

Помимо управления доступом в конфигурации Squid возможно указать программу-редиректор для обработки различных URL (например, SquidGuard, или rejik), тем самым обеспечивя обработку контента различных страниц (блокировка банеров, фильтрация рекламы и тд). Кроме того, Squid может являться как “родительским” прокси, так и подключаться к нему (в режиме “прозрачной аутентификации”), предоставляя возможность другим программным пакетам использовать свой функционал по фильтрации трафика совместно с функционалом Squid. Так например, в качестве родительского прокси-сервера можно использовать связку HAVP + ClamAV, которая позволяет сканировать файлы на предмет вредоносного кода.

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

Дано:

  • Установленный дистрибутив Debian 7.9 c сетевыми интерфейсами 192.168.0.2 и 192.168.1.2.
  • подсеть inet_filtered с диапазоном IP-адресов 192.168.0.3–192.168.0.199 и 192.168.0.220–192.168.0.254.
  • подсеть inet_limited c диапазоном IP-адресов 192.168.1.3–192.168.1.199 и 192.168.1.220–192.168.1.254.

Необходимо:

  • Осуществить доступ к интернет-ресурсам c фильтрацией сайтов по спискам для подсети inet_filtered.
  • Осуществить “ограниченный” доступ к интернет для inet_limited — к определенным URL по списку: например, ресурсы Microsoft необходимые для обновления и активации операционных систем Windows).
  • Осуществить доступ из обеих подсетей без аутентификации.
  • Настроить фильтры рекламы, запрещенных ресурсов и осуществить подмену изображений в случае с рекламными банерами.

Установка и настройка Squid.

Устанавливаем squid, создаем бэкап конфигурации и создаем новую:

# apt-get -y install squid3
# cp /etc/squid3/squid.conf /etc/squid3/squid.conf_backup
# nano /etc/squid3/squid.conf

Можно просто скопировать (все неуказанные ниже параметры используется по умолчанию):

# WELCOME TO SQUID 3.1.20
# ----------------------------
# ACCESS CONTROLS
# листы доступа (ACL) ----------------------------------------------------
# Имя листа доступа all — означнает все внутренние адреса
acl all src all
# Имя листа доступа localhost (127.0.0.1)
acl localhost src 127.0.0.1/32 ::1
# подсеть ресурсов localhost
acl to_localhost dst 127.0.0.0/32 192.168.0.2/32 ::1 192.168.1.2/32
# ACL для порта SSL
acl SSL_ports port 443
# Имя листа доступа Safe_ports для безопасных поротв
acl Safe_ports port 80
acl Safe_ports port 21 # http
acl Safe_ports port 443 # ftp
acl Safe_ports port 70 # https
acl Safe_ports port 210 # gopher
acl Safe_ports port 1025–65535 # wais
acl Safe_ports port 280 # unregistered ports
acl Safe_ports port 488 # http-mgmt
acl Safe_ports port 591 # gss-http
acl Safe_ports port 777 # filemaker
# Имя листа доступа Webmin_SSL для доступа к Webmin по SSL
acl Webmin_SSL_port port 10000
acl CONNECT method CONNECT # multiling http
# Имя листа доступа, означающего подсеть (inet_filtered), которой разрешен доступ к Squid
acl inet_filtered src 192.168.0.3–192.168.0.199/32 192.168.0.220–192.168.0.254/32
# Имя листа доступа, обозначающего дрес сервера apache
acl apache dst 192.168.0.2/32 192.168.1.2/32
# Список IP адресов web-ресурсов для блокировки
acl ip-block dst "/etc/squid3/block/ip-block"
# Список доменов web-ресурсов для блокировки
acl sites-block1 dstdomain "/etc/squid3/block/sites-block1"
# Список “технических” доменов web-ресрусов для доступа
acl tech-sites dstdomain "/etc/squid3/block/tech-sites"
# Имя листа доступа, означающего подсеть (inet_limited), которой разрешен доступ к Squid
# (“ограниченный” интернет и исключительно “технический” интернет)
acl inet_limited src 192.168.1.3–192.168.1.199/32 192.168.1.220–192.168.1.254/32
# Список IP-адресов “технических” веб-ресурсов
acl tech-ips dst "/etc/squid3/block/tech-ips"
# Имя листа доступа manager определяет протокол при доступе к кэшу Squid
acl manager proto cache_object
# --- Правила ------------------------------------------------------------
# Доступ к “cachemgr” только с localhost
http_access allow manager localhost
# остальным доступ к “cachemgr” запрещен
http_access deny manager
# Правило разрешающее доступ для inet_filtered
http_access allow CONNECT inet_filtered apache Webmin_SSL_port
# Правило запрещает все порты, кроме указанных в листе доступа Safe_ports
http_access deny !Safe_ports
# Правило запрещает все порты для SSL соединения, кроме указанных в листе
# доступа SSL_ports
http_access deny CONNECT !SSL_ports
# Правило запрещает для подсети inet_filtered все IP,
# перечисленные в файле ip-block
http_access deny inet_filtered ip-block
# Правило запрещает для подсети inet_filtered все URL,
# перечисленные в файле sites-block1
http_access deny inet_filtered sites-block1
# Правило разраешает все остальные соединения для inet_filtered,
# кроме указанных выше
http_access allow inet_filtered
# Правило разраешает доступ к URL “технических сайтов” (tech sites)
# для подсети с ограниченным интернетом (inet_limited)
http_access allow tech-sites inet_limited
# Правило разраешает доступ к IP “технических сайтов” (tech sites)
# для подсети с ограниченным интернетом (inet_limited)
http_access allow inet_limited tech-ips
# Правило запрещает все остальные соединения для inet_limited,
# кроме указанных выше
http_access deny inet_limited
# Правило запрещает все остальные соединения для всех
# внутренних адресов, кроме перечисленных выше
http_access deny all
# ------------------------------------------------------------------------
# Адрес прокси без авторизации
http_port 3128 transparent
# Обьем оперативной памяти, выделенной под кэширование
cache_mem 256 MB
# Путь к кэшу, обьем дискового пространства (в мегабайтах) и
# каталогов первого и второго уровней соответственно
cache_dir ufs /var/spool/squid3 4096 16 256
# Обьекты выше указанного размера не будут сохраняться на диске
maximum_object_size 20480 KB
# Указаевает, какая программа используется в качестве редиректа
url_rewrite_program /usr/local/rejik3/redirector /usr/local/rejik3/redirector.conf
# Используется для определения срока годности обьектов в кэше
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
# Адрес электронной почты администратора прокси-сервера,
# который отображается при блокировке ресурсов
cache_mgr your_email@domain.com
# Отключаем кэширование apache
cache deny apache
# Язык страницы-блокировки, отображающейся при ошибках и блокировании
# ресрусов
error_directory /usr/share/squid3/errors/Russian-koi8-r
# Если Squid уже скачал 60% файла, а пользователь отказался его забирать,
# то все равно продолжать скачивать файл.
quick_abort_pct 60
# Имя пользователя под которым запущен Squid в системе
#Default:
# cache_effective_user proxy

Полный список параметров Squid и перевод коменатриев дефолтного конфигурационного файла можно посмотреть здесь.

Создаем список IP-адресов для блокировки (например, это будет 192.168.0.209):

# nano /etc/squid3/block/ip-block
192.168.0.209

Создаем список URL для блокируемых сайтов:

# nano /etc/squid3/block/sites-block1
vk.com
vkontakte.ru
ok.ru
odnoklassniki.ru
fishki.net
bash.org.ru
rutracker.org
lurkmore.ru
demotivators.ru
privet.ru
drive2.ru
yaplakal.com
mamba.ru
fotostrana.ru
dirty.ru
loveplanet.ru
spletnik.ru
worldoftanks.ru
gamespot.com
igromania.ru
armorgames.com
pikabu.ru
stopgame.ru

Создаем cписок URL для “технических сайтов” (для подсети limited_inet):

microsoft.com
.microsoft.ru
.msn.com
.windows.com
.windowsupdate.com

Назначаем владельца на директорию и выполняем первый запуск Squid:

# chown -R proxy /etc/squid3/block/
# squid -z

По умолчанию доступ к Squid осуществляется по порту 3128. Соответственно подключаемся по этому порту к прокси-серверу: в нашем случае — это 192.168.0.2 и 192.168.1.2 в зависимости от подсети. Например, для ОС Windows в свойствах Internet Explorer (Свойства браузера > Подключения > Настройка сети) ставим галочку на “Прокси-сервер” и указываем порт и IP-адрес.

Установка LAMP, или LAMP + Webmin.

Для того, чтобы перенаправлять блокируемый rejik’ом контент понадобится установленный веб-сервер. Если в вашей сети уже имеется установленный веб-сервер (например Apache), то чуть ниже в конфигурационном файле rejik вместо IP-адреса 127.0.0.1 можно указать необходимый. Если вы желаете для управления Squid’ом использовать веб-интерфейс Webmin, то можно воспользоваться установочным скриптом, который сразу же установит и LAMP. Например, установка Webmin + Virtualmin GPL выглядит следующим образом:

# wget http://software.virtualmin.com/gpl/scripts/install.sh
# chmod +x install.sh
# ./install.sh

По заверешнию набираем в браузере: https://{IP_addr_of_webserver}:10000/

Инструкция по отдельной установке Webmin находится здесь.

По желанию для просмотра статистика кэша из Webmin Cache Manager Statistics) можно установить дополнительный компонент:

# aptitude install squid-cgi

Но в нашем случае будем устанавливать LAMP на ту же машину, где установлен Squid:

# apt-get -y install mysql-server mysql-client apache2 php5 php-pear php5-mysql
# service apache2 restart

Проверяем работоспособность PHP:

# nano /var/www/phpinfo.php

и создаем файл:

<?php
phpinfo();
?>

Открываем в браузере http://ip_adress_of_webserver/phpinfo.php и если все работает, то увидим версию и текущие настройки php.

Установка и настройка rejik.

Устанавливаем нужные библиотеки, качаем и распаковываем rejik (на момент написания актуальной явлвется версия 3.2.11):

# aptitude install libpcre3 libpcre3-dev
# cd /usr/src/ && wget http://rejik.ru/download/redirector-3.2.11.tgz
# tar xvfz redirector-3.2.11.tgz && cd redirector-3.2.11

Теперь необходимо выяснить под каким пользователем работает Squid и в какую группу входит этот пользователь: для этого можно посмотреть, как прописаны в squid.conf опции cache_effective_user и cache_effective_group или выполнить команду:

# ps aux | grep squid

Открываем на редактирование Makefile и вносим эти значения (как правило, это proxy:proxy):

# nano Makefile
SQUID_USER=proxy
SQUID_GROUP=proxy

Если вы хотите, что бы режик был регистронезависимым, то раскомментируйте строчку в vars.h:

# nano vars.h
define CASE_INDEPENDENT

Компилируем, устанавливаем и выставляем права (для пользователя proxy:proxy):

# make -j16 && make -j16 install
# chown -R proxy:proxy /usr/local/rejik3/

Во избежании ошибок для того чтобы разрешить запуск файлов redirector и make-cache:

# chmod +x /usr/local/rejik3/redirector
# chmod +x /usr/local/rejik3/make-cache

Скачиваем, распаковываем и переносим бан-листы в папку, где установлен rejik:

# wget http://rejik.ru/download/banlists-2.x.x.tgz
# tar vxzf ./banlists-2.x.x.tgz
# mv banlists /usr/local/rejik3/

Скачиваем, распаковываем и переносим в папку www.tgz, файлы, которыми будем заменять рекламу туда, где лежат файлы Apache сервера:

# wget http://rejik.ru/download/www.tgz
# tar vxzf ./www.tgz
# mv www /var/www/

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

# chown -R proxy:proxy /usr/local/rejik3/
# chown -R www:www /var/www/www/

Создаем файлы логов Rejik и выставляем на них права:

# touch /usr/local/rejik3/redirector.err
# touch /usr/local/rejik3/redirector.log
# chown proxy:proxy /usr/local/rejik3/redirector.err
# chown proxy:proxy /usr/local/rejik3/redirector.log

Далее на всякий случай создаем бэкап конфигурационного файла Rejik и редактируем его:

# cp /usr/local/rejik3/redirector.conf /usr/local/rejik3/redirector.conf.backup
# nano /usr/local/rejik3/redirector.conf
rror_log /usr/local/rejik3/redirector.err
change_log /usr/local/rejik3/redirector.log
make-cache /usr/local/rejik3/make-cache
#allow_urls /usr/local/rejik3/banlists/allow_urls
<BANNER>
ban_dir /usr/local/rejik3/banlists/banners
url http://127.0.0.1/www/1x1.gif
#log off
<PORNO>
ban_dir /usr/local/rejik3/banlists/porno
url http://127.0.0.1/www/porno.html
<MP3>
ban_dir /usr/local/rejik3/banlists/mp3
url http://127.0.0.1/www/mp3.html
<JS>
ban_dir /usr/local/rejik3/banlists/js
url http://127.0.0.1/www/js.js
#log off

Запускаем check-redirector из папки tools:

# /usr/local/rejik3/tools/check-redirector
http://127.0.0.1/www/porno.html 127.0.0.1/- - GET

И читаем логи. Из описания в официальной инструкции:

Если check-redirector выдает “This account is currently not available.”, то это означает, что в системе, в целях безопасности, у пользователя сквида отсутствует шел. Вы можете или пропустить шаг тестирования или прописать шел на время тестирования:
Шел обычно прописан в /etc/passwd, например:
username:x:1000:100::/home/username:/bin/bash
/bin/bash — шел
у Вас наверное что-то вроде
proxy:x:1008:100:::/bin/false
замените /bin/false на /bin/bash на время тестирования.

Далее убедитесь, что squid.conf содержит следующую строчку, для перенаправления, если вы использовали собственные настройки, а не копировали пример выше:

# nano /etc/squid3/squid.conf
url_rewrite_program /usr/local/rejik3/redirector /usr/local/rejik3/redirector.conf

Применяем все изменения настроек командой:

# squid3 -k reconfigure

Теперь для теста можно попытаться открыть URL, как на скриншоте ниже:

Установка DBL для rejik.

Если вы не вкурсе, что такое Distributed Ban List, то обязательно прочитте это. Создаем учетную запись на rejik.ru, проверяем бан-листы (или покупаем платную подписку). Рейтинг каждого правила рассчитывается как сумма рейтингов пользователей DBL, которые его добавили/проверили и, если эта сумма будет больше минимального рейтинга правила, то правило считается истинным и попадет в ваш бан лист.

Далее создаем структуру папок для бан-листов dbl и назначаем владельца каталогов:

# cd /usr/local/rejik3/banlists/
# mkdir audio-video banner chats dating extremism_rf icq online-games phishing photogallery porno socnet spyware torrents virus-detect warez web-mail web-proxy
# chown -R proxy:proxy /usr/local/rejik3/banlists/

Качаем и распаковываем dbl-скрипты:

# cd /usr/local/rejik3/
# wget http://rejik.ru/download/dbl-2.0.tgz && tar -xzvf dbl-2.0.tgz

В файле dbl/Update изменяем следющие строки:

# nano /usr/local/rejik3/dbl/Update
$login="Your login";
$pass="Your password";

Создаем файл логов, разрешаем запуск и запускаем dbl/Update, который скачает свежие банлисты:

# touch /usr/local/rejik3/dbl/update.log
# chmod +x /usr/local/rejik3/dbl/Update
# /usr/local/rejik3/dbl/Update

За каждое скачивание с вашего балланса снимается 10 банов. В результате в каталоге dbl мы получим 2 файла:

  • list.dbl — База правил для сайтов
  • update.log — Журнал обновления листов.

Теперь необходимо сделать выборку. Редактируем:

# nano /usr/local/rejik3/dbl/dbl_expand
my_nick="Your login";
$min_trust=300; # минимальный рейтинг правила.
@good_guys=("slava","user"); # список доверенных пользователей DBL
@bad_guys=(«test»); # список не доверенных пользователей DBL

Запускаем скрипт:

# chmod +x /usr/local/rejik3/dbl/dbl_expand
# /usr/local/rejik3/dbl/dbl_expand dbl/list.dbl

Создадим симлинки, чтобы с этими листами мог работать rejik:

# ln -s /usr/local/rejik3/dbl/lists/audio-video.pcre /usr/local/rejik3/banlists/audio-video/pcre
# ln -s /usr/local/rejik3/dbl/lists/audio-video.urls /usr/local/rejik3/banlists/audio-video/urls
# ln -s /usr/local/rejik3/dbl/lists/banner.pcre /usr/local/rejik3/banlists/banner/pcre
# ln -s /usr/local/rejik3/dbl/lists/banner.urls /usr/local/rejik3/banlists/banner/urls
# ln -s /usr/local/rejik3/dbl/lists/chats.urls /usr/local/rejik3/banlists/chats/urls
# ln -s /usr/local/rejik3/dbl/lists/dating.urls /usr/local/rejik3/banlists/dating/urls
# ln -s /usr/local/rejik3/dbl/lists/extremism_rf.urls /usr/local/rejik3/banlists/extremism_rf/urls
# ln -s /usr/local/rejik3/dbl/lists/icq.pcre /usr/local/rejik3/banlists/icq/pcre
# ln -s /usr/local/rejik3/dbl/lists/icq.urls /usr/local/rejik3/banlists/icq/urls
# ln -s /usr/local/rejik3/dbl/lists/online-games.urls /usr/local/rejik3/banlists/online-games/urls
# ln -s /usr/local/rejik3/dbl/lists/phishing.urls /usr/local/rejik3/banlists/phishing/urls
# ln -s /usr/local/rejik3/dbl/lists/photogallery.urls /usr/local/rejik3/banlists/photogallery/urls
# ln -s /usr/local/rejik3/dbl/lists/porno.urls /usr/local/rejik3/banlists/porno/urls
# ln -s /usr/local/rejik3/dbl/lists/socnet.urls /usr/local/rejik3/banlists/socnet/urls
# ln -s /usr/local/rejik3/dbl/lists/spyware.urls /usr/local/rejik3/banlists/spyware/urls
# ln -s /usr/local/rejik3/dbl/lists/torrents.urls /usr/local/rejik3/banlists/torrents/urls
# ln -s /usr/local/rejik3/dbl/lists/virus-detect.pcre /usr/local/rejik3/banlists/virus-detect/pcre
# ln -s /usr/local/rejik3/dbl/lists/virus-detect.urls /usr/local/rejik3/banlists/virus-detect/urls
# ln -s /usr/local/rejik3/dbl/lists/warez.urls /usr/local/rejik3/banlists/warez/urls
# ln -s /usr/local/rejik3/dbl/lists/web-mail.urls /usr/local/rejik3/banlists/web-mail/urls
# ln -s /usr/local/rejik3/dbl/lists/web-proxy.urls /usr/local/rejik3/banlists/web-proxy/urls

Устанавливаем и настраиваем SquidGuard.

Как вариант, в качестве редиректора, вместо rejik можно использовать SquidGuard. Разумеется, для перенаправлений, так же как и для rejik, потребуется веб-сервер — LAMP (будет вполне достаточно даже одного Apache без PHP). Но для работы SquidGuard сначала необходимо установить BerkeleyDB, которая в свою очередь не скомпилируется без libtool:

# apt-get -y install libtool

Скачиваем, распаковываем, компилируем и выставляем права:

# cd /usr/src/
# wget http://download.oracle.com/berkeley-db/db-6.1.26.tar.gz
# tar zxvf db-6.1.26.tar.gz
# cd db-6.1.26/build_unix/
# ../dist/configure --prefix=/usr --enable-compat185 --enable-dbm --disable-static --enable-cxx
# make -j16
# make -j16 install
# chown -v -R root:root /usr/bin/db_*
# chown -v -R root:root /usr/include/db{,_185,_cxx}.h
# chown -v -R root:root /usr/lib/libdb*.{so,la}

Устанавливаем SquidGuard:

# aptitude -y install squidguard

Теперь необходимо выбрать blacklist. Скачиваем с сайта SquidGuard список блокируемых доменов Mesd и распаковываем:

# wget http://squidguard.mesd.k12.or.us/blacklists.tgz
# tar zxvf blacklists.tgz -C /var/lib/squidguard
# cd /var/lib/squidguard/blacklists
# cp -r ./* /var/lib/squidguard/db

В директории /var/lib/squidguard/db появилось несколько поддиректорий:

# ls -l /var/lib/squidguard/db
total 56
drwxr-xr-x 2 root root 4096 Jan 28 01:30 ads
drwxr-xr-x 2 root root 4096 Jan 28 01:30 aggressive
drwxr-xr-x 2 root root 4096 Jan 28 01:30 audio-video
drwxr-xr-x 2 root root 4096 Jan 28 01:30 drugs
drwxr-xr-x 2 root root 4096 Jan 28 01:30 gambling
drwxr-xr-x 2 root root 4096 Jan 28 01:30 hacking
drwxr-xr-x 2 root root 4096 Jan 28 01:30 mail
drwxr-xr-x 2 root root 4096 Jan 28 01:30 porn
drwxr-xr-x 2 root root 4096 Jan 28 01:30 proxy
drwxr-xr-x 2 root root 4096 Jan 28 01:30 redirector
drwxr-xr-x 2 root root 4096 Jan 28 01:30 spyware
drwxr-xr-x 2 root root 4096 Jan 28 01:30 suspect
drwxr-xr-x 2 root root 4096 Jan 28 01:30 violence
drwxr-xr-x 2 root root 4096 Jan 28 01:30 warez

в каждой из которой распологаются следующие файлы:

  • domains — список доменов;
  • urls — список адресов для блокировки отдельной страницы, а не всего домена;
  • expressions — выражения, используемые при поиске в URL (например, sex, hot, porn и тд.)

Эти директории — категории списков для блокировки. Их необходимо ниже указать в конфиге SquidGuard (параметр ‘dest { }’). Беда лишь в том, что некоторые категории, такие как, например, ads в Mesd отстутвуют. Поэтому Mesd можно попробовать использовать совместно с Shallalist:

# wget http://www.shallalist.de/Downloads/shallalist.tar.gz
# tar zxvf shallalist.tar.gz -C /var/lib/squidguard
# cd /var/lib/squidguard/BL

Категорий в этом списке достаточно много (по желанию можно настроить использование каждой), но я лишь возьму рекламу:

# cp -r ./adv /var/lib/squidguard/db

Предполагается, что Apache, а так же “заглушки” контента (прозрачные .gif и .html) вы уже настроили выше, когда настраивали rejik, поэтому на них останавливаться не буду — все аналогично. Теперь конфиругируем SquidGuard:

# nano /etc/squidguard/squidGuard.conf
#
# CONFIG FILE FOR SQUIDGUARD
#
# Caution: do NOT use comments inside { }
# расположение баз
dbhome /var/lib/squidguard/db
# расположение логов
logdir /var/log/squidguard
# SOURCE ADDRESSES:
# упомянутая выше подсеть inet_filtered
# (рекламу будем резать только для нее, поскольку inet_limited имеет
# крайне ограниченный выход в интернет)
src inet_users {
ip 192.168.0.1/24
}
# зазадим inet_tech, для которой резать трафик не будем, поскольку
# например, внесем сюда пользоваталей inet_limited, поскольку доступ в
# интернет им уже ограничен штатными средствами Squid
src inet_tech {
ip 192.168.1.1/24
}
# DESTINATION CLASSES:
# описываем классы
# (если требуется запретить скачивание mp3, то раскоментировать)
# все обращения к mp3-файлам перенаправляем
# rewrite mp3 {s@.*\.mp3$@http://127.0.0.1/wwww/mp3.html@r
# записать события в /usr/local/squidGuard/log/rewr_mp3
#log rewr_mp3
# описание базы порно-сайтов
# запись событий в /usr/local/squidGuard/log/porn
dest porn {
domainlist porn/domains
urllist porn/urls
log porn
redirect http://192.168.0.205/www/porno.html
}
# описание базы рекламы
# подменяем на http://127.0.0.1/www/1x1.gif (прозрачный .gif 1x1 пиксель)
# и записываем события в /usr/local/squidGuard/log/adv
dest adv {
domainlist adv/domains
urllist adv/urls
log adv
redirect http://127.0.0.1/www/1x1.gif
}

# описываем домены, которые не должны блокироваться вне зависимости от
# списка
dest good {
domainlist good/domains
urllist good/urls
}
# ACLs
# Раздаем права
# inet_users - режем все, inet_tech - пропускаем все
# default - действие поумолчанию, если пользователь не относится ни
# к одной из перечисленных категорий
acl {
inet_users {
pass good !porn
redirect http://127.0.0.1/www/porno.html
}
inet_tech {
pass all
}
default {
pass none
        redirect http://127.0.0.1/www/porno.html
}
}

Поскольку домены, которые не должны блокироваться вне зависимо от списка, не указаны не в Mesd и Shallalist, то зададим их для примера вручную:

# mkdir /var/lib/squidguard/db/good
# touch /var/lib/squidguard/db/good/domains
# touch /var/lib/squidguard/db/good/urls
# echo thisdomaindonotexists.com > /var/lib/squidguard/db/good/domains
# cp /var/lib/squidguard/db/good/domains /var/lib/squidguard/db/good/urls

Выставляем права на созданные списки:

# chown proxy:proxy -R /var/lib/squidguard/db/*
# find /var/lib/squidguard/db -type f | xargs chmod 644
# find /var/lib/squidguard/db -type d | xargs chmod 755

и инициализируем SquidGuard:

# squidGuard -C all

При инициализации SquidGuard произведет экспорт списков в базу данных. Процесс довольно долгий и займет какое-то время.

Теперь протестируем SquidGuard, прежде, чем объединять его со Squid:

# echo "http://www.porno.com / - - GET" | squidGuard -d

Или, как вариант, копируем в папку /usr/local/bin этот скрипт:

# nano /usr/local/bin/squidguardtest.pl
#! /usr/bin/perl
# squidGuard URL test script
@urls = (
"http://www.sex.com",
"http://www.adult.com",
"http://www.aport.ru",
"http://www.porno.ru",
"http://www.chat.ru",
"http://www.test.com",
"http://www.aport.ru",
"http://adv.aport.ru:8000/banners/ban_1342.gif",
"http://www.bs.yandex.ru",
"http://www.riva.ru",
"http://linkexchange.ru:8000/banners/bnr_dfg12.gif",
"http://www.sga/read.mp3",
"http://www.service.ru",
"http://www.delit.ru",
"http://www.teenslut.com",
"http://www.abort.ru",
"http://engine.awaps.ru:8000/br/GOLDEN.gif",
"http://www.rikki.ru",
"http://www.mus.ru/read_me.mp3",
);
print "Enter your URL:\n";
$adress = <STDIN>;
chomp ($adress);
$ident = " $adress/- - GET";
$filename="test.tmp";

open (LIST,"+> $filename") || die "can't create $filename : $!";
$index = @urls;
for ($i=0; $i<$index; $i++)
{
$urls[$i].=$ident;
print LIST "$urls[$i]\n";
}
close (LIST) || die "can't close test file: $!";
@answers;
open (SQUIDGUARD , "/usr/bin/squidGuard < test.tmp |") or die "Cant run";
while (<SQUIDGUARD>)
{
push (@answers,$_);
}
close (README);
unlink($filename);
$filename="result.txt";
open (RESULT,"+> $filename") || die "can't create $filename : $!";
$index = @urls;
for ($i=0; $i<$index; $i++)
{
print RESULT "Request: $urls[$i]\n";
print RESULT "Result: $answers[$i]";
print RESULT "\n";
}

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

# chmod 777 /usr/local/bin/squidguardtest.pl
# /usr/local/bin/squidguardtest.pl

Результат его работы можно просмотреть командой:

# cat result.txt

Переходим к редактированию squid.conf и задаем в качестве программы-редиректора SquidGuard:

# /etc/squid3/squid.conf
# назначение программы-редиректора
url_rewrite_program /usr/bin/squidGuard
# если ни один из редиректоров SquidGuard не отвечает, то работать напрямую
redirector_bypass on
# сколько экземпляров SquidGuard необходимо запускать
redirect_children 1

Для того, чтобы squid обновил конфигурацию:

# squid3 -k reconfigure

Заключение.

Мы рассмотрели упревление доступом к интернету с помощью Squid и фильтрацию интернет-контента с помощью rejik, или SquidGuard. Обе “связки” имеют, как приемущества, так и недостатки.

Самый главный недостаток rejik заключается в том, что для использования DBL нужно либо участвовать в процессе создания бан-листов, либо покупать подписку, в то время, как списки пригодные для использования SquidGuard являются бесплатными. Однако и они имеют свои недостатки: в Mesd отсутствуют списки для блокировки банеров, в то время как в URLblacklist.com и Shella’s Blacklist имеют довольно много категорий, что несколько затрудняет конфигурирование SquidGuard. Плюс ко всему, бесплатное использование без регистраций и дополнительных соглашений Shella’s Blacklist возможно только при некоммерческом использовании.

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

Если так же учесть тот, факт, что Squid, как может подключаться к “родительскому” прокси-серверу, так и позволяет использование “дочернего”, то изучение возможностей DansGuardian. Смущает лишь только то, что с 2015-го года его использование стало абсолютно бесплатным — не известно, насколько долго продлится его поддержка.

И самое главное: здесь пока что не рассмотрено антивирусное сканирование траффика, которое возможно при использовании редиректора SquidClamav. А если говорить о “родительских” и “дочерних” прокси, то использование HAVP могло бы дать свои дополнительные плюсы: помимо бесплатного ClamAV, HAVP умеет рабоать в связке с некоторыми другими коммерческими антивирусами. Однако, все это — уже тема для отдельной (возможно, не одной) статьи.