SquidGuard на страже вашего ребёнка

SquidGuard - это программный модуль (плагин) для прокси-сервера Squid, предназначенный для построения системы фильтрации нежелательного веб-контента. SquidGuard работает на принципе "чёрного списка" (так называемого blacklist-а), в котором перечислены нежелательные сайты, домены, их ip-адреса. Если браузер пытается перейти на такой адрес, то автоматически срабатывает перенаправление (редирект) на страничку с предупреждением или на другой заданный вами сайт. Недостаток метода - требуется поддержание "черного списка" нежелательных сайтов в актуальном состоянии, т.к. постоянно появляются новые и новые сайты. Но в Интернете можно найти бесплатные и свободно доступные коллекции чёрных списков blacklists, которые поддерживаются сообществом и постоянно обновляются (ссылки приведём ниже).

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

Мы же в этой статье рассмотрим использование Squid только на локальной машине - ведь в большинстве семей имеется лишь один компьютер с выходом в Интернет, и нет возможности строить сети.

Установку и настройку Squid и SquidGuard мы покажем на примере дистрибутивов Debian GNU/Linux версии 5.0.6 ("Lenny") и Ubuntu 10.04 LTS. Обратите внимание, что там, где требуется выполнение команд в терминале с правами администратора, между дистрибутивами Ubuntu и Debian есть небольшие отличия.

Чтобы получить права администратора в Debian, необходимо в терминале набрать команду:

su

После чего будет спрошен пароль пользователя root, и если ввести верный пароль, то терминал перейдет в режим пользователя root, о чем засвидетельствует знак "решётки" ("диез", "шарп") в начале строки в терминале:

~#

В Ubuntu же временные права администратора можно получить, набрав перед необходимой командой директиву sudo. Например, установить консольный файловый менеджер Midnight Commander в Ubuntu можно командой:

sudo apt-get install mc

Если в текущем сеансе терминала директива sudo выполняется первый раз, то будет запрошен пароль текущего пользователя (необходимо, чтобы он обладал правами администратора).

Поэтому обращайте внимание на команды, выполнение которых требует права администратора - В Debian выполняйте их от пользователя root, в Ubuntu - через дерективу sudo.

Мы будем настраивать прокси-сервер Squid в качестве так называемого "прозрачного" сервера, поскольку в этом случае не требуется дополнительная настройка браузеров на прокси-сервер, и любое веб-приложение будет автоматически перенаправляться через Squid и защиту SquidGuard.

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

Для начала установим прокси-сервер Squid командой в терминале (не забудьте сначала получить права пользователя root командой su в Debian, а в Ubuntu в начале команды, требующей права администратора, набрать sudo):

apt-get install squid

В результате выполнения этой команды загрузятся из репозиториев и установятся пакеты squid и squid-common версии 2.7.STABLE.

Далее проверим идентификационный номер пользователя "proxy", так называемый UID (user id). Для этого выполним команду в терминале:

cat /etc/passwd | grep proxy

Эта команда должна выдать подобную строку:

proxy:x:13:13:proxy:/bin:/bin/sh

В нашем случае пользователь "proxy" имеет идентификатор 13 (а также и номер группы 13). Если у вас первая цифра другая - запомните её для подстановки в нижеследующий скрипт. Но обычно в дистрибутивах Debian и Ubuntu это цифра 13.

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

nano iptables_proxy.script

В результате откроется текстовый редактор nano для создания и редактирования файла iptables_proxy.script (мы его так произвольно назвали, можно назвать как угодно). Скопируйте в редактор следующие строки (за решёточками # - комментарии):

#! /bin/sh
#
case "$1" in
  start)
  iptables --flush
# доступ пользователя "proxy" через Squid - uid "proxy" - 13
# если в вашем случае другой, то поменяйте его

iptables -t nat -A OUTPUT -m owner --uid-owner 13 -j ACCEPT
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128
# Отбрасываем HTTPS-трафик
iptables -t filter -A OUTPUT -m owner --uid-owner 13 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j REJECT
    echo "старт прозрачного проксирования"
    ;;
  stop)
    iptables --flush
    iptables --table nat --flush
    echo "отмена прозрачного проксирования"
    ;;
  *)
    echo "скрипт используйте так: iptables_proxy.script {start|stop}"
    exit 1
    ;;
esac
exit 0

Сохраните файл, нажав клавишу "F2" и после запроса на сохранение изменений нажмите "Y" и "Enter".

Создадим каталог /opt/scripts (не забудьте про права администратора - в Debian выполняйте команду от пользователя root, в Ubuntu - набирайте перед командой sudo):

mkdir /opt/scripts

Скопируем наш файл скрипта в созданный каталог:

cp iptables_proxy.script /opt/scripts/iptables_proxy.script

Сделаем файл скрипта исполняемым:

chmod 755 /opt/scripts/iptables_proxy.script

Скрипт готов к запуску, но пока мы его не будем трогать - сначала настроим наш веб-прокси-сервер Squid. Сделаем резервную копию файла конфигурации сервера Squid, который создан установкой сервера по-умолчанию:

mv /etc/squid/squid.conf /etc/squid/squid.conf_original

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

ifconfig

Она выведет примерно такие данные:

eth0      Link encap:Ethernet  HWaddr 00:22:15:97:70:1c 
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:218

eth1      Link encap:Ethernet  HWaddr 00:21:91:8a:e0:6c 
          inet addr:192.168.1.34  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::221:91ff:fe8a:e06c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13996 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15806 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:6469112 (6.1 MiB)  TX bytes:2780764 (2.6 MiB)
          Interrupt:17 Base address:0xe800

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1349 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1349 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:256136 (250.1 KiB)  TX bytes:256136 (250.1 KiB)

У вас вывод может немного отличаться от нашего. В нашем случае мы видим два сетевых интерфейса eth0 и eth1 (в компьютере стоит две сетевых карты, если у вас одна, то будет один интерфейс, если у вас карта Wi-Fi, то интерфейс будет назваться по-другому, напрммер vlan0), и интерфейс внутренней петли lo. Нас интересует адрес активного интерфейса, у нас это eth1, и его адрес 192.168.1.34. У вас, скорее всего, адрес будет другой - скопируйте его для того, чтобы потом вставить в файл конфигурации прокси-сервера.

Чтобы сократить количество выводимой информации, отфильтруем вывод команды ifconfig по вхождению Bcast (broadcast - широковещательный адрес):

ifconfig | grep Bcast

Если у вас всего одна активная сетевая карта, то команда выдаст только одну строку, в начале которой и будет искомый ip-адрес. В нашем случае команда вывела:

inet addr:192.168.1.34  Bcast:192.168.1.255  Mask:255.255.255.0

У вас адрес будет другой - запомните его, пожалуйста, для дальнейшего использования в файле конфигурации Squid. Также, возможна ситуация, что вам выдаётся от вашего провайдера динамический ip-адрес, и он может меняться. Тогда необходимо указать диапазон ip-адресов вашего провайдера.

Далее запустим консольный текстовый редактор nano для создания нового файла /etc/squid/squid.conf (с правами администратора):

nano /etc/squid/squid.conf

Скопируем в редактор минимальную конфигурацию прокси-сервера Squid. Обратите внимание, что в строке под комментарием "#Ваш ip-адрес" вместо адреса 192.168.1.34 должен стоять ip-адрес вашего сетевого интерфейса.

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

hosts_file /etc/hosts

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
# ip-адрес вашей сетевой карты:
acl localhost src 192.168.1.34/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny to_localhost
http_access allow localhost
http_access deny all

http_reply_access allow all

# Опции прозрачного перенаправления:
always_direct allow all
http_port 0.0.0.0:3128 transparent

# Эффективные пользователь/группа
cache_effective_user proxy
cache_effective_group proxy

access_log /var/log/squid/access.log squid

icp_access allow all
cache_mgr mail@linuxforchildren.com

forwarded_for off
coredump_dir /var/spool/squid

 

После того, как вы скопировали приведённую конфигурацию в редактор nano и исправили ip-адрес примера на свой, сохраните файл, нажав клавишу "F2", и согласитесь на запись файла в /etc/squid/squid.conf, нажав "Y" и "Enter".

Теперь перезагрузите новую конфигурацию сервера Squid, выполнив команду от администратора:

squid -k reconfigure

Если squid не запущен, запустите его командой с правами администратора:

/etc/init.d/squid start

Проверить статус сервера в Debian можно командой:

/etc/init.d/squid status

В Ubuntu:

status squid

Если всё нормально, и squid работает, в терминале будет выдан ответ:

squid is running.

Теперь пришла пора запустить скрипт наших цепочек iptables, но перед запуском сохраним на всякий случай текущую конфигурацию iptables в файл с названием, например default.iptables - для этого есть специальная команда:

iptables-save > default.iptables

Но не спешите запустить скрипт iptables_proxy.script, сначала обратите внимание на параметры запуска этого скрипта, а именно параметр отмены его действия:

/opt/scripts/iptables_proxy.script stop

Если скрипт запустить с параметром stop, то выполнится та его часть, которая сбросит изменение состояния цепочек iptables. Это важно запомнить, если у вас что-то пойдёт неправильно, и Интернет совсем "поломается". Запуск скрипта с параметром stop должен спасти вас в этом случае.

Теперь попробуем его запустить с параметром start с правами администратора (не забываем про параметр stop, если что-то пойдёт не так):

/opt/scripts/iptables_proxy.script start

И проверяем в любом браузере, работает ли Интернет и открываются ли сайты (но не обновляйте нашу страничку с инструкциями в текущей вкладке браузера). Если всё сделали правильно, то должен работать. Если что-то пошло не так, то возвращаем iptables в исходное состояние следующими командами:

/opt/scripts/iptables_proxy.script stop

iptables --flush

iptables --table nat --flush

iptables-restore < default.iptables

И внимательно повторяем все шаги, обращая внимание на такие параметры, как ip-адрес вашей сетевой карты и идентификатор пользователя "proxy".

Если же всё получилось, и Интернет у вас работает, то после обновления этой странички в следующей строке вы увидете тестовую информацию с сообщением о вашем прокси вида "<имя вашего хоста>:3128 (squid/<версия>)":

Ваш прозрачный прокси не настроен или не включён

Итак, половина работы уже сделана, теперь осталось установить пакет SquidGuard и настроить его. Для установки пишем в терминале из под пользователя root (права root в Debian GNU/Linux можно получить командой su, в Ubuntu перед командами пишем sudo):

apt-get install squidguard

После установки скачаем черные списки blacklists комадной wget из терминала (внимание, размер файла 24 Мб!):

wget -c http://linuxforchildren.com/media/files/squidguard/my_blacklists.tar.gz

И распакуем его в каталог, где должны распологаться базы SquidGuard (необходимы права администратора):

tar zxvf my_blacklists.tar.gz -C /var/lib/squidguard/db

В результате распаковки появится каталог /var/lib/squidguard/db/my, содержащий множество подкаталогов разных категорий со списками доменов и адресов нежелательных сайтов. Этот список был составлен нами на основе трёх чёрных списков, загруженных с сайтов www.squidguard.org, www.shallalist.de и www.urlblacklist.com. В результате наш список содержит более 3-х миллионов сайтов.

Теперь необходимо настроить связку Squid и SquidGuard и подключить к ним чёрные списки. Для этого в файл squid.conf дописываем следующие строки, открыв файл в редакторе nano с правами администратора:

nano /etc/squid/squid.conf

Добавляем строки в конец файла:

redirector_bypass on
redirect_program /usr/bin/squidGuard
redirect_children 1

И сохраняем изменения (F2, Y, Enter).

Далее переименовываем конфигурационный файл squidGuard.conf, который установился по-умолчанию, командой в терминале от администратора:

mv /etc/squid/squidGuard.conf /etc/squid/squidGuard.conf_original

Скачиваем файл конфигурации squidGuard.conf с нашего сайта командой wget в терминале:

wget -c http://linuxforchildren.com/media/files/squidguard/squidGuard.conf

Копируем его на место старого файла (с правами администратора, в Ubuntu не забываем набирать вначале sudo):

cp squidGuard.conf /etc/squid/squidGuard.conf

После копирования файла конфигурации инициируем конвертирование текстовых чёрных списков, которые вы скачали и распаковали, в формат баз данных Berkeley DB (команда будет выполняться некоторое время - нужно дождаться полного окончания), выполнив команду от администратора:

squidGuard -d -C all

Если всё сделано правильно, то после команды в терминале будет выдаваться множество сообщений о создании новых файлов баз, и в конце их череды вы увидите что-то подобное:

2010-11-07 03:16:43 [7054] squidGuard 1.2.0 started (1289088967.413)
2010-11-07 03:16:43 [7054] db update done
2010-11-07 03:16:43 [7054] squidGuard stopped (1289089003.341)

Что скажет об успешном завершении создании баз черных списков. Далее задаём права сервера Squid на файлы баз, выполнив команду с правами администратора:

chown -R proxy:proxy /var/lib/squidguard/db/

И рестартуем сервер Squid выполнив в Debian от root:

/etc/init.d/squid restart

В Ubuntu:

sudo squid -k shutdown

sudo service squid start

После рестарта в результате совместной работы Squid и SquidGuard будет работать перенаправление с нежелательных для детей сайтов на сайт linuxforchildren.com. Вместо неё вы можете поставить любую другую страничку, изменив адрес последней строки файла конфигурации /etc/squid/squidGuard.conf.

Чтобы автоматизировать запуск системы фильтрации при загрузке операционной системы, скопируем с правами администратора наш скрипт запуска правил iptables в директорию /etc/init.d/

cp /opt/scripts/iptables_proxy.script /etc/init.d/iptables_proxy.script

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

update-rc.d iptables_proxy.script start 20 2 3 4 5 . stop 20 0 1 6 .

Теперь при загрузке компьютера фильтр веб-контента будет автоматически запускаться. Если потребуется отменить его действие, достаточно дать команду:

/etc/init.d/iptables_proxy.script stop

Для повторного запуска:

/etc/init.d/iptables_proxy.script start

Вы можете создавать свои правила редиректов, добавляя или исключая категории нежелательных сайтов. К сожалению, стопроцентной защиты невозможно получить, т.к. новые сайты с нежелательным содержанием появляются постоянно. Даже если и постоянно обновлять списки blacklists. Если вам требуется сильная защита, то SquidGuard можно настроить на работу с белым списком разрешенных сайтов, запретив всё остальное - но тогда будет совсем ограниченный набор сайтов.

Ещё один вариант, более совершенный по сравнению с приведенным - использование прокси-сервера Squid в связке с более совершенным фильтром DansGuardian, который помимо черных списков анализирует содержание страниц на вхождение нежелательных слов. Установку и настройку фильтра веб-контента DansGuardian мы рассмотрим в другой статье.

Разработка сайта: студия открытых решений o-nix.com