Введение:В статье хочу поделиться своим вариантом установки и конфигурирования
прокси сервера 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: &n...
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
будут приняты изменения конфигурации, в том числе и нашего редиректа.
++ Используемая литература:
/usr/local/etc/squid/squid.conf.default
Отдельное спасибо:
Моему коллеге Dok`у, за скрипт убирающий комментарии.
Сайту lissyra.su, некоторые материалы взяты оттуда.
Сайту opennet.ru, и отсюда :)
URL:
Обсуждается: http://www.opennet.dev/tips/info/2403.shtml