SquidGuard - борьба с нарушителями

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

Конечно это можно сделать и с помощью самого squid, с помощью acl, но на мой взгляд для этих целей более подходит squidGuard. Принцып работы тот же, т.е. мы создаем acl (Access Control List) списки управления доступом и затем разрешаем/запрещаем определенным классам пользователей те или инные категории.

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

Настройка squidguard

Итак, как всегда, устанавливаем все ПО из портов, squidguard не исключение.

# cd /usr/ports/www/squidguard/
# setenv SQUID_UID squid
# setenv SQUID_GID squid
# make install clean
# rehash

Вместе с squidGuard идет так называемый blacklist, т.е. список запрещенных сайтов, разбитых по категориям. Но я не рекомендовал бы его использовать, так как он довольно таки старый и маленький. Я рекомендую скачать bigblacklist. Хоть занимает он много ~18 МБ, но он того стоит.

# cd /tmp
# tar zxvf bigblacklist.tar.gz
x blacklists/
x blacklists/CATEGORIES
x blacklists/ads/
x blacklists/ads/domains
x blacklists/ads/urls
x blacklists/ads/expressions
x blacklists/adult/
...
...
...
x blacklists/weather/urls
x blacklists/webmail/
x blacklists/webmail/domains
x blacklists/webmail/urls
x blacklists/whitelist/
x blacklists/whitelist/domains
x blacklists/whitelist/urls

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

# rm -fr /var/db/squidGuard/*
# cp -R blacklists/ /var/db/squidGuard/

Если вы все сделали правильно, то у нас должна получиться такая структура папок

# ls -l /var/db/squidGuard/
total 132
-rw-rw----  1 root   wheel  3664 May  9 17:55 CATEGORIES
drw-rw----  2 root   wheel   512 May  9 17:55 ads
drw-rw----  2 root   wheel   512 May  9 17:55 adult
drw-rw----  2 root   wheel   512 May  9 17:55 aggressive
drw-rw----  2 root   wheel   512 May  9 17:55 antispyware
drw-rw----  2 root   wheel   512 May  9 17:55 artnudes
drw-rw----  2 root   wheel   512 May  9 17:55 audio-video
drw-rw----  2 root   wheel   512 May  9 17:55 banking
drw-rw----  2 root   wheel   512 May  9 17:55 beerliquorinfo
drw-rw----  2 root   wheel   512 May  9 17:55 beerliquorsale
drw-rw----  2 root   wheel   512 May  9 17:55 cellphones
drw-rw----  2 root   wheel   512 May  9 17:55 chat
drw-rw----  2 root   wheel   512 May  9 17:55 childcare
drw-rw----  2 root   wheel   512 May  9 17:55 cleaning
drw-rw----  2 root   wheel   512 May  9 17:55 clothing
drw-rw----  2 root   wheel   512 May  9 17:55 culinary
drw-rw----  2 root   wheel   512 May  9 17:55 dating
drw-rw----  2 root   wheel   512 May  9 17:55 dialers
drw-rw----  2 root   wheel   512 May  9 17:55 drugs
drw-rw----  2 root   wheel   512 May  9 17:55 ecommerce
drw-rw----  2 root   wheel   512 May  9 17:55 entertainment
drw-rw----  2 root   wheel   512 May  9 17:55 frencheducation
drw-rw----  2 root   wheel   512 May  9 17:55 gambling
drw-rw----  2 root   wheel   512 May  9 17:55 games
drw-rw----  2 root   wheel   512 May  9 17:55 gardening
drw-rw----  2 root   wheel   512 May  9 17:55 government
drw-rw----  2 root   wheel   512 May  9 17:55 hacking
drw-rw----  2 root   wheel   512 May  9 17:55 homerepair
drw-rw----  2 root   wheel   512 May  9 17:55 hygiene
drw-rw----  2 root   wheel   512 May  9 17:55 instantmessaging
drw-rw----  2 root   wheel   512 May  9 17:55 jewelry
drw-rw----  2 root   wheel   512 May  9 17:55 jobsearch
drw-rw----  2 root   wheel   512 May  9 17:55 kidstimewasting
drw-rw----  2 root   wheel   512 May  9 17:55 mail
drw-rw----  2 root   wheel   512 May  9 17:55 mixed_adult
drw-rw----  2 root   wheel   512 May  9 17:55 mobile-phone
drw-rw----  2 root   wheel   512 May  9 17:55 naturism
drw-rw----  2 root   wheel   512 May  9 17:55 news
drw-rw----  2 root   wheel   512 May  9 17:55 onlineauctions
drw-rw----  2 root   wheel   512 May  9 17:55 onlinegames
drw-rw----  2 root   wheel   512 May  9 17:55 onlinepayment
drw-rw----  2 root   wheel   512 May  9 17:55 personalfinance
drw-rw----  2 root   wheel   512 May  9 17:55 pets
drw-rw----  2 root   wheel   512 May  9 17:55 phishing
drw-rw----  2 root   wheel   512 May  9 17:55 porn
drw-rw----  2 root   wheel   512 May  9 17:55 proxy
drw-rw----  2 root   wheel   512 May  9 17:55 radio
drw-rw----  2 root   wheel   512 May  9 17:55 reaffected
drw-rw----  2 root   wheel   512 May  9 17:55 religion
drw-rw----  2 root   wheel   512 May  9 17:55 ringtones
drw-rw----  2 root   wheel   512 May  9 17:55 searchengines
drw-rw----  2 root   wheel   512 May  9 17:55 sexual_education
drw-rw----  2 root   wheel   512 May  9 17:55 sexuality
drw-rw----  2 root   wheel   512 May  9 17:55 sportnews
drw-rw----  2 root   wheel   512 May  9 17:55 sports
drw-rw----  2 root   wheel   512 May  9 17:55 spyware
drw-rw----  2 root   wheel   512 May  9 17:55 updatesites
drw-rw----  2 root   wheel   512 May  9 17:55 vacation
drw-rw----  2 root   wheel   512 May  9 17:55 violence
drw-rw----  2 root   wheel   512 May  9 17:55 virusinfected
drw-rw----  2 root   wheel   512 May  9 17:55 warez
drw-rw----  2 root   wheel   512 May  9 17:55 weapons
drw-rw----  2 root   wheel   512 May  9 17:55 weather
drw-rw----  2 root   wheel   512 May  9 17:55 webmail
drw-rw----  2 root   wheel   512 May  9 17:55 whitelist

Собственно sports, violence, porn это и есть категории запретов (спорт, насилие, порнография). В файле /var/db/squidGuard/CATEGORIES приводится краткое описание к каждой из категорий.

Теперь нам надо настроить squidGuard, для этого необходимо изменить его конфигурационный файл squidGuard.conf

# cd /usr/local/etc/squid/
# cp squidGuard.conf.sample squidGuard.conf
#
#   /usr/local/etc/squid/squidGuard.conf
#

# Указываем где у нас располагаются наши базы
dbhome /var/db/squidGuard

# Указываем где будет храниться log файл squidGuard
logdir /var/log/

# Описываем классы доступа. Затем мы для каждого из классов
# (admins, clients) создадим свой набор правил доступа.
src admins {
ip  192.168.127.50
ip  192.168.127.100
}

src clients {
ip  192.168.127.10
ip  192.168.127.11
ip  192.168.127.12
ip  192.168.127.13
ip  192.168.127.14
ip  192.168.127.15
}

# В целях увеличения производительности желательно использовать
# диапазон адресов, например ip 192.168.127.10-192.168.127.15

# Далее описываем все категории запретов
dest ads {
domainlist       ads/domains
expressionlist   ads/expressions
urllist          ads/urls
redirect         http://192.168.127.230/block/ads.html
}

dest adult {
domainlist       adult/domains
urllist          adult/urls
redirect         http://192.168.127.230/block/adult.html
}

...
...
...

dest webmail {
domainlist       webmail/domains
urllist          webmail/urls
redirect         http://192.168.127.230/block/webmail.html
}

dest whitelist {
domainlist       whitelist/domains
urllist          whitelist/urls
redirect         http://192.168.127.230/block/whitelist.html
}

# Ну а теперь непосредственно делаем раздачу слонов.
# Клиентам, разрешаем все, кроме запрещенного,
# т.е. после слова pass вы должны указать все категории запрета,
# которые вы описывали с помощью ключевого слова dest.
# знак ! означает отрицание, т.е. если вы написали pass !porn,
# это значит что данные пользователи не смогут просматривать сайты,
# попадающие под категорию porn
acl {
clients  {
            pass !ads !adult ... !porn !warez all
         }

# Себе разрешаем все, кроме баннеров
admins   {
            pass !banner all
         }

# И наконец, задаем правило по умолчанию - всем все запрещаем.
default  {
            pass     none
            redirect http://192.168.127.230/block/default.html
         }
}

Сейчас я напримере опишу принцип построения файла squidGuard.conf, чтобы не приводить все категории запрета, так как их очень много. А принцип построения у них одинаковый.

Итак, в папке /var/db/squidGuard есть папки - ads, adult, porno и т.д. Каждая из этих папок соответствует отдельной категории запрета. В каждой из этих папок может находиться 3 файла:

  • domains - в данном файле содержатся запрещенные домены.
  • expressions - в данном файле содержатся регулярные выражения, которые применяются к запрашиваемому url. Т.е. для борьбы с порнографией вы добавляете сюда, наиболее часто встречаемые слова, например, pornstar, sexdream, showgirl, striptease) и т.д. Если какое-нибудь из этих слов встретится в url, то этот адрес будет заблокирован.
  • urls - из названия понятно, что здесь необходимо указывать запрещенные url, если вам надо заблокировать только определенный адрес, а не весь домен.

Domainlist, Urllist, Expressionlist

DOMAINLIST

Например, если у вас в файле domains есть строка sex.com, то будут блокироваться следующие адреса:

sex.com,
www.sex.com,
whatever.sex.com,
www.what.ever.sex.com

А адреса www.lesbian-sex.com, www.geysex.com уже не будут попадать под это правило.

URLLIST

Например, если у вас в файле urls есть строка sex.com/geys, то будут блокироваться следующие адреса:

http://sex.com/geys
http://sex.com/geys/whatever,
ftp://sex.com/geys/whatever,
ftp://www.sex.com/geys/whatever,
ftp://web.sex.com/geys/whatever,
ftp://www3.sex.com/geys/whatever,

А адреса sex.com/lesbians, sex.com/adult уже не будут попадать под это правило.

EXPRESSIONLIST

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

\.(ra?m|mpe?g?|mov|movie|qt|avi|dif|dvd?|mpv2|mp3|asf)($|\?)

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

попадут под категорию запрета и будут блокированы.

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

Каждая категория запрета описывается с помощью ключевого слова dest. И имеет следующий синтаксис

dest имя_категории {
domainlist       путь_к_файлу/имя_файла
expressionlist   путь_к_файлу/имя_файла
urllist          путь_к_файлу/имя_файла
дествие, если адрес попал под данную категорию запрета
}

Все пути в dest задаются относительно директории, указанной в параметре dbhome. Например, если вы указали dbhome /var/db/squidGuard, а в dest указали - domainlist ads/domains, то это значит, что у вас список с запрещенными доменами должен находиться в /var/db/squidGuard/ads, а сам файл должен называться domains.

Для составления полного списка категорий запрета, вы заходите в каждую из папок находящихся в /var/db/squidGuard/ и в зависимости от того, какие там файлы находятся, составляете соовтетствующее правило. Рекомендую давать имя категории запрета, совпадающее с именем папки, например, если папка называется audio-video, то имя категории будет - dest audio-video. Особо ленивые могут взять готовый squidGuard.conf

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

Для этого воспользуемся следующей командой

# squidGuard -d -C all
2006-05-09 18:59:29 [40660] init domainlist /var/db/squidGuard/ads/domains
2006-05-09 18:59:32 [40660] create new dbfile /var/db/squidGuard/ads/domains.db
2006-05-09 18:59:32 [40660] init expressionlist /var/db/squidGuard/ads/expressions
2006-05-09 18:59:32 [40660] init urllist /var/db/squidGuard/ads/urls
2006-05-09 18:59:32 [40660] create new dbfile /var/db/squidGuard/ads/urls.db
...
...
...
2006-05-09 19:09:35 [40660] init urllist /var/db/squidGuard/whitelist/urls
2006-05-09 19:09:35 [40660] create new dbfile /var/db/squidGuard/whitelist/urls.db
2006-05-09 19:09:35 [40660] squidGuard 1.2.0 started (1147201169.478)
2006-05-09 19:09:35 [40660] db update done
2006-05-09 19:09:35 [40660] squidGuard stopped (1147201775.362)

Как видно из сообщений файлы с БД называются urls.db и domains.db, старые файлы urls и domains нужно удалить. Теперь нам осталось только выставить необходимые права и создать лог файл.

# chown -R squid:squid /var/db/squidGuard
# chmod -R 640 /var/db/squidGuard
# chmod 550 /var/db/squidGuard
# chmod 550 /var/db/squidGuard/*
# touch /var/log/squidGuard.log
# chown squid:squid /var/log/squidGuard.log

Все, со squidGuard мы закончили. Теперь осталось только указать squid использовать в качестве редиректора squidGuard. Для этого внесем изменения в squid.conf.

#
#   /usr/local/etc/squid/squid.conf

#  TAG: redirect_program
# Указываем путь к squidGuard
redirect_program /usr/local/bin/squidGuard

#  TAG: redirect_children
# Количество одновременно запускаемых процессов squidGuard.
redirect_children 5

В ветке 2.6.STABLE произошли изменения и теперь вместо параметров redirect_program и redirect_children необходимо использовать url_rewrite_program и url_rewrite_children соответственно.

Теперь у нас все готово к запуску нашей связки.

# /usr/local/etc/rc.d/squid.sh start
Starting squid.

# cat /var/log/squidGuard.log
2006-05-09 19:12:33 [40744] init domainlist /var/db/squidGuard/ads/domains
2006-05-09 19:12:33 [40744] loading dbfile /var/db/squidGuard/ads/domains.db
2006-05-09 19:12:33 [40743] init domainlist /var/db/squidGuard/ads/domains
2006-05-09 19:12:33 [40743] loading dbfile /var/db/squidGuard/ads/domains.db
2006-05-09 19:12:33 [40744] init expressionlist /var/db/squidGuard/ads/expressions
...
...
...
2006-05-09 19:12:34 [40745] init urllist /var/db/squidGuard/whitelist/urls
2006-05-09 19:12:34 [40745] loading dbfile /var/db/squidGuard/whitelist/urls.db
2006-05-09 19:12:34 [40745] squidGuard 1.2.0 started (1147201953.012)
2006-05-09 19:12:34 [40745] squidGuard ready for requests (1147201954.939)
# cat /usr/local/squid/logs/cache.log | grep squidGuard
2006/05/09 19:12:32| helperOpenServers: Starting 5 'squidGuard' processes

Тестирование squidguard

После этого можно протестировать squidGuard, для этого воспользуйтесь скриптом

# perl squidGuard.pl
Введите тестируемый адрес:
192.168.127.10

В результате будет создан файл result.txt, с таким содержимым

# cat result.txt
Запрос: http://www.sex.com 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/adult.html 192.168.127.10/- - GET

Запрос: http://www.adult.com 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/adult.html 192.168.127.10/- - GET

Запрос: http://www.aport.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.porno.ru 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/adult.html 192.168.127.10/- - GET

Запрос: http://www.chat.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.test.com 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/ads.html 192.168.127.10/- - GET

Запрос: http://www.aport.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://adv.aport.ru/banners/ban_1342.gif 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/ads.html 192.168.127.10/- - GET

Запрос: http://www.bs.yandex.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.riva.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://linkexchange.ru/banners/bnr_dfg12.gif 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/ads.html 192.168.127.10/- - GET

Запрос: http://www.sga/read.mp3 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/audio-video.html 192.168.127.10/- - GET

Запрос: http://www.service.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.delit.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.teenslut.com 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/adult.html 192.168.127.10/- - GET

Запрос: http://www.abort.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://engine.awaps.ru:8000/br/GOLDEN.gif 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.rikki.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.mus.ru/read_me.mp3 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/audio-video.html 192.168.127.10/- - GET

Ну вот собственно и вся настройка. Теперь вы сэкономите много трафика.

Обновление БД

Часто возникает необходимость запретить или разрешить тот или иной url/домен. Я специально создавал для каждой категории запрета свою страничку. Так намного легче будет найти под какую категорию запрета попал тот или иной адрес.

После того, как вы узнали в какой категории содержится необходимый адрес, необходимо удалить или добавить его. Для этого мы создаем такой файл. Для примера я учитываю, что нужный адрес попал под категорию ADS.

Для этого, мы создаем файл domains.diff в папке /var/db/squidGuard/ads следующего содержания

+domain1.com
+domain2.com
+domain3.com
...
-domain5.com
-domain6.com
-domain7.com

Думаю, синтаксис и так понятен. Домены, перед которыми стоит знак + будут добавлены в список, а со знаком минус соответственно удалены из него. После того как вы создали файл, обновляем БД

# squidguard -d -u /var/db/squidGuard/ads/domains.diff
2009-11-17 10:17:47 [20777] New setting: dbhome: /var/db/squidGuard/
2009-11-17 10:17:47 [20777] New setting: logdir: /var/log/squid
2009-11-17 10:17:47 [20777] init domainlist /var/db/squidGuard/ads/domains
2009-11-17 10:17:47 [20777] loading dbfile /var/db/squidGuard/ads/domains.db
2009-11-17 10:17:47 [20777] update dbfile /var/db/squidGuard/ads/domains.db
Processing file and database /var/db/squidGuard/ads/domains.diff    
2009-11-17 10:17:47 [20777] update: added 3 entries, deleted 3 entries======================================] 100 % done
2009-11-17 10:17:47 [20777] squidGuard 1.2.0 started (1258445867.572)
2009-11-17 10:17:47 [20777] db update done
2009-11-17 10:17:47 [20777] squidGuard stopped (1258445867.686)

И даем команду squid на реконфигурацию, чтобы он заново загрузил обновленные БД.

# squid -k reconfigure
Фото автора
Артем Ведун
ИТ-специалист, исследователь цифровой гармонии

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

Так начался мой путь в прикладную нумерологию и изучение того, как числа влияют на решения, инфраструктуру и даже ИТ-проекты.

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

Верю, что в мире нет случайных чисел — даже в логах сервера.

Последние Статьи

Как выбрать частного SEO‑специалиста в Киеве: практическое руководство

Как выбрать частного SEO‑специалиста в Киеве: практическое руководство

В Киеве существует множество SEO‑услуг: крупные агентства, маленькие студии и частники, с разными подходами и ценами. Для бизнеса важно найти того специалиста, который пониманием задач, прозрачностью ..

Что предлагает KupiFanove.bg? для соц.сетей (smm)

Что предлагает KupiFanove.bg? для соц.сетей (smm)

KupiFanove.bg специализируется на предоставлении услуг по увеличению числа подписчиков и лайков в следующих социальных сетях: Instagram: Покупка подписчиков для повышения авторитета и доверия к ваш..

Почему вам нужен список SEO компаний в Варне?

Почему вам нужен список SEO компаний в Варне?

Сегодня Google обрабатывает более 40 000 поисковых запросов каждую секунду! С такими ошеломляющими цифрами выделиться среди жесткой конкуренции требует профессионального опыта от опытной SEO-команды. ..

Время 02:02 на часах: ангельская нумерология

Время 02:02 на часах: ангельская нумерология

Когда вы в очередной раз случайно бросаете взгляд на часы, и там застыли 02:02, это может быть не просто цифра — это тонкий знак от невидимого мира. Такие зеркальные времена не приходят в жизнь без пр..

Подписаться на рассылку