Думаю перед каждым администратором рано или поздно встает вопрос, как бороться с нецелевым использованием интеренет трафика, или если по простому, как запретить пользователям скачивать музыку, видео, просматривать порно сайты и т.д. и т.п.
Конечно это можно сделать и с помощью самого squid, с помощью acl, но на мой взгляд для этих целей более подходит squidGuard. Принцып работы тот же, т.е. мы создаем acl (Access Control List) списки управления доступом и затем разрешаем/запрещаем определенным классам пользователей те или инные категории.
В предыдущей статье я описывал настройку прокси сервера squid. Поэтому буду исходить из того, что squid у вас уже настроен и работает.
Итак, как всегда, устанавливаем все ПО из портов, 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 есть строка sex.com, то будут блокироваться следующие адреса:
sex.com, www.sex.com, whatever.sex.com, www.what.ever.sex.com
А адреса www.lesbian-sex.com, www.geysex.com уже не будут попадать под это правило.
Например, если у вас в файле 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 уже не будут попадать под это правило.
Допустим мы хотим блокировать загрузку аудио и видео файлов, наиболее распространенных форматов. В этом случае наиболее эффективным будет использование регулярного выражения следующего вида:
\.(ra?m|mpe?g?|mov|movie|qt|avi|dif|dvd?|mpv2|mp3|asf)($|\?)
Думаю синтаксис данного файла очевиден, именно благодаря этому списку запросы типа:
попадут под категорию запрета и будут блокированы.
Учитывайте эти особенности при добавлении новых правил. Регулярные выражения и производительность Советую не злоупотреблять регулярными выражениями, особенно при большой нагрузке. Так как они потребляют очень много ресурсов. Производительность зависит от сложности самого регулярного выражения, а так же от производительности библиотеки регулярных выражений, с которой был собран squidGuard.
Каждая категория запрета описывается с помощью ключевого слова dest. И имеет следующий синтаксис
dest имя_категории { domainlist путь_к_файлу/имя_файла expressionlist путь_к_файлу/имя_файла urllist путь_к_файлу/имя_файла дествие, если адрес попал под данную категорию запрета }
Для составления полного списка категорий запрета, вы заходите в каждую из папок находящихся в /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
Теперь у нас все готово к запуску нашей связки.
# /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, для этого воспользуйтесь скриптом
# 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