SquidGuard - для всех

Автор: Савченко Андрей

Эта статья - попытка разобраться с полезной на мой взгляд программой 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.gz
http://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz

Вы получаете папки:

ads		-	реклама (баннеры)
agressive	-	насилие
hacking		-	no comment
publicite	-	реклама
porn 		-	no comment
warez		-	порно

В каждой папке могут быть файлы:

  1. domains - список доменных имен:
  2. sex.com
    adult.com
    216.185.108.1
    (обращение  ко всему домену)
    
  3. expressions-список ожидаемых фрагментов слов в url:
  4. (sex|adult|lolita)
    (проверка на наличие указанных фраз в пути)
    
  5. urls - no coment:
  6. 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   #9
								#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