Эта статья - попытка разобраться с полезной на мой взгляд
программой SquidGuard редиректа и фильтрации запросов Squid.
SquidGuard предназначен для работы с proxy-сервером SQUID.
Возможности SquidGuard:
1) гибкая фильтрация запросов;
2) опознавание пользователей по IP-адресу или имени;
3) работа по расписанию;
4) обрезка (а точнее подмена) banners и т.д.
Я хочу рассмотреть только те элементы настройки SquidGuard, которые реально
работают у меня . Думаю, большинству администраторов этого
будет достаточно.
Я администрирую работу с Интернет приложениями в учебном
заведении. Общее количество машин - около 100.
SquidGuard позволяет бороться с вредными наклонностями студентов (порнография,
чаты, агрессия, наркотики и т.д.), а также экономить трафик (рекламные
банеры, mp3 и т.д.).
В то же время отдельным пользователям можно позволить посещать всё
или только список "хороших" сайтов.
Так, реклама прошла успешно, теперь к делу.
Любым способом устанавливаем пакет SquidGuard (например из портов).
Стандартно инсталляция проходит в папку /usr/local/SquidGuard.
Здесь создаются папки db, log и файлы squidGuard, squidGuard.conf
Качаем архив blacklists.tar.gz, распаковываем и полученные папки с файлами
выкладываем в папку db. Можно использоать адреса:
ftp://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gzhttp://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz
Вы получаете папки:
ads - реклама (баннеры)
agressive - насилие
hacking - no comment
publicite - реклама
porn - no comment
warez - порно
В каждой папке могут быть файлы:
1. domains -список доменных имен : sex.com
adult.com
216.185.108.1
(обращение ко всему домену)
2. expressions-список ожидаемых фрагментов слов в url : (sex|adult|lolita)
(проверка на наличие указанных фраз в пути)
3. urls - no coment : host.com/anus
12.10.220.125/alisa
(обращение к части домена)
Редактируем squidGuard.conf/
Все примеры взяты из реального conf - файла.
Поэтому несколько слов об окружении.
Имею:
FreBSD-4.5
Squid/2.4.STABLE3
Apache/1.3.20 www.my.host
SquidGuard 1.1.4
logdir /var/SquidGuard # путь к лог директории
dbhome /usr/local/squidGuard/db # путь к базам
#готовим прикольную подмену для mp3 файлов
rewrite mp3 {
s@.*\.mp3$@http://www.my.host/my.mp3@r
}
# по адресу http://www.my.host/my.mp3 выложим свой mp3 - прикол (например:
#"Так мычит обычная корова ..")
#готовим диапазоны времени (нерабочее время)
time leisure-time {
weekly * 00:00-08:00 17:00-24:00 # ночь и вечер
weekly fridays 16:00-17:00 # + пятница с 16:00 до 17:00 (если у вас короткий день)
weekly sat sun 00:00-24:00 # + выходные
date*.01.01 # + Новый Год
# и т. д.
}
#Создаем группы
src kids {
ip 192.168.0.200 #любит качать mp3 (но канал не резиновый)
}
src student {
ip 192.168.0.1-192.168.0.45 #любят все (но не все стоит показывать)
}
src vasya {
ip 192.168.0.62 #просто Вася (chat,chat и еще раз chat)
}
src vasya2 {
ip 192.168.1.20 # просто Вася II (и ел бы "inet" ,и спал бы
#c "inet", а работать, когда!?! )
}
src comandor {
ip 192.168.4.170 192.168.1.1 #начальство (добавить нечего)
}
src my {
ip 192.168.0.100 #a это моя машинка
}
#Наша цель:
#Для :
# kids - обрезать файлы mp3;
# student - обрезать все неприличное и ненужное;
# vasya - в рабочее время отключить chat;
# vasya2 - в рабочее время отключить все кроме списка
# "хороших" адресов;
# my - мне можно все!!!
# для всех - убрать рекламу.
#
# Подключение баз.
dest pornography {
domainlist porn/domains
expressionlist porn/expressions
urllist porn/urls
}
dest warez {
domainlist warez/domains
urllist warez/urls
}
dest agressive {
domainlist agressive/domains
urllist agressive/urls
}
dest good {
domainlist good/domains #список "хороших" адресов
#(составляется самостоятельно)
}
dest chat {
domainlist chat/domains #список "chat" адресов
#(составляется самостоятельно)
expressionlist chat/expressions #ожидаемые фразы
}
dest ads {
domainlist ads/domains
expressionlist ads/expressions
urllist ads/urls
redirect 302: http://www.my.host/Images/not_banner.gif
# адрес рисунка для подмены рекламных баннеров
}
dest drugs {
domainlist drugs/domains
urllist drugs/urls
}
dest hacking {
domainlist hacking/domains
urllist hacking/urls
}
acl {
kids {
pass !ads all #все кроме рекламы
rewrite mp3 #подмена mp3 файлов на наш файл (смотри выше)
}
student {
pass !warez !chat !pornography !agressive !drugs !hacking !ads all
#все, кроме ,warez ,chat ,pornography ,agressive ,drugs ,hacking ,ads
redirect http://www.my.host/cgi-bin/bl.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u
}
vasya within leisure-time {
pass !ads all #все, кроме рекламы, в нерабочее время
} else {
pass !chat !ads all #отключение chat-ов в рабочее время
redirect http://www.my.host/cgi-bin/bl.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u
}
vasya2 within leisure-time {
pass !ads all #все, кроме рекламы, в нерабочее время
} else {
pass good !ads all #ограничение разрешенных сайтов списком good в рабочее время
redirect http://www.my.host/cgi-bin/bl.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u
}
my {
pass all
}
comandor {
pass !warez !chat !pornography !agressive !drugs !hacking !ads all
#покажем, что мы недаром кушаем хлеб
#pass all # все равно "попросят"
}
default { #для всех остальных
pass none
redirect http://www.my.host
log /var/SquidGuard/defoult.log #и запишем в лог
}
}
Файл bl.cgi поставляется как squidGuard.cgi.in . Он выводит на экран
симпатичный ответ в случае отказа на запрос.
Базы взяты из файла blacklists.tar.gz по адресу www.sguidguard.org
SguidGuard выполняет redirect только на host, а не на файловую систему.
Предположим, что файл squidGuard.conf у нас готов. У меня он лежит
по пути /usr/local/bin/squidGuard.conf.
Проверяем владельца и разрешения.
Для squidGuard и squidGuard.conf - владелец тот же, что и в squid.conf
прописан для cache_effective_user
Разрешения:
squidGuard 755
squidGuard.conf 644
Перед запуском squidGuard из под Squid-а , желательно протестировать
его работу.
Тестируем.
Создаем исполняемый файл test и пишем
/usr/local/ squidGuard /squidGuard </usr/local/squidGuard/squidGuard /in > /usr/local/squidGuard/squidGuard/out -d
Из файла in будет чтение запросов, в файл out будет выведен результат.
Ключ -d - для режима отладки.
Создаем файл in. Как видно ниже, у него некий стандартный формат:
http://www.adult.com/live.mp3 192.168.0.200/- - GET #1
http://www.adult.com 192.168.0.200/- - GET #2
http://www.aport.ru 192.168.0.200/- - GET #3
http://www.sex.ru 192.168.0.10/- - GET #4
http://www.chat.ru 192.168.0.1/- - GET #5
http://www.k_k_k.com 192.168.0.20/- - GET #6
http://www.aport.ru 192.168.0.15/- - GET #7
http://adv.aport.ru:8000/banners/GOLDEN.gif 192.168.0.22/- - GET #8
http://www.chat.ru 192.168.0.62/- - GET #9
http://www.aport.ru 192.168.0.62/- - GET #10
http://adv.aport.ru:8000/banners/GOLDEN.gif 192.168.0.62/- - GET #11
http://www.sex.ru 192.168.0.100/- - GET #12
http://www.sex.ru 192.168.0.100/- - GET #13
http://www.chat.ru 192.168.0.100/- - GET #14
http://www.k_k_k.com 192.168.0.100/- - GET #15
http://www.aport.ru 192.168.0.100/- - GET #16
http://adv.aport.ru:8000/banners/GOLDEN.gif 192.168.0.100/- - GET #17
http://www.aport.ru 192.168.5.200/- - GET #18
http://www.mus.ru/live.mp3 192.168.0.227/- - GET #19
*Для удобства разбора полетов я справа пронумеровал строки.
Запускаем файл test в рабочее время. На экране получаем сообщения
о загрузке баз, и в результате получаем файл out.
В случае сообщения об ошибке в строке N## следует учитывать ,
что ошибка может быть в предыдущей строке!!!
302: http://www.my.host/my.mp3 192.168.0.200/- - GET #1
#2
#3
http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.10&clientname=&clientident=&clientgroup=student&targetgroup=pornography&url=http://www.sex.ru 192.168.0.10/- - GET #4
http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.1&clientname=&clientident=&clientgroup=student&targetgroup=chat&url=http://www.chat.ru 192.168.0.1/- - GET #5
#6
#7
302:http://www.my.host/Images/not_banner.gif 192.168.0.22/- - GET #8
http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.62&clientname=&clientident=&clientgroup=vasya&targetgroup=chat&url=http://www.chat.ru 192.168.0.62/- - GET #8
#10
302:http://www.my.host/Images/not_banner.gif 192.168.0.62/- - GET #11
#12
#13
#14
#15
#16
#17
http://www.my.host 192.168.5.200/- - GET #18
http://www.my.host 192.168.0.227/- - GET #19
Как видим, kids будет слушать "Корову ...".
2 ,3,6,7,10,12,13,14,15,16,17-ий запросы прошли без редиректа;
4, 5 - блокирование porno для студентов;
8, 11 - подмена баннера;
9 - блокирование chat-а для vasya;
18,19 - чужаки.
Изменив leisure-time, запускаем файл test для нерабочего времени .
В результате получаем файл out для нерабочего времени
302: http://www.my.host/my.mp3 192.168.0.200/- - GET
http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.10&clientname=&clientident=&clientgroup=student&targetgroup=pornography&url=http://www.sex.ru 192.168.0.10/- - GET
http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.1&clientname=&clientident=&clientgroup=student&targetgroup=chat&url=http://www.chat.ru 192.168.0.1/- - GET
302:http://www.my.host/Images/not_banner.gif 192.168.0.22/- - GET
302:http://www.my.host/Images/not_banner.gif 192.168.0.62/- - GET
http://www.my.host 192.168.5.200/- - GET
http://www.my.host 192.168.0.227/- - GET
Как видим, vasya получил доступ к chat-ам
Теперь, разобравшись в этой кухне, вы можете написать свой Conf ,
протестировать его и запустить из под Squid-а.
Cтартуем из squid.
Добавляем в файл squid.conf.
redirect_program /usr/local/bin/squidGuard
redirect_children 3
redirector_bypass on # для случая, если все редиректы заняты -
ломись напрямую, иначе squid слетает.
По идее все уже работает за исключением следующего:
1. Для строки подмены banners через редирект
http://www.my.host/Images/not_banner.gif нужно
выложить файл www.my.host/Images/not_banner.gif .
Это может быть ваш banner, logo или рисунок 1х1.
2. Для красивого ответа на запрет "строка вида"
http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.1&clientname=&clientident=&clientgroup=student&targetgroup=chat&url=http://www.chat.ru
нужно найти файл
...../port/www/squidguard/work/squidGuard-1.1.4/samples/squidGuard.cgi.in,
переименовать (например, bl.cgi) и подправить под свой host.
Выложить в свою web/cgi-bin и подправить путь для редиректа
в файле squidGuard.conf
Теперь можно наслаждаться результатами своей работы.
В случае необходимости правим файлы domains,expressions и urls
ПРИМЕЧАНИЕ !
Если вы внесли изменения в файл domains или urls, то для вступления
изменений в силу вам необходимо выполнить следующую команду
/usr/local/bin/squidGuard -C all для создания файлов domains.db и urls.db.
Если лень, то удалите все файлы *.db, и squidGuard автоматически будет
преобразовывать их при загрузке (замедляет загрузку).
Полная докумунтация находится по адресу http://www.squidguard.org
1.03.2002 Киев.
Савченко Андрей
Все отзывы, замечания и критику просьба отправлять по адресу zakat@ukr.net