SquidGuard Guide

Date: 2001/02/26
Андрей Савченко (zakat@ukr.net) Date: 2001/03/01

SquidGuard - для ВСЕХ.

Эта статья - попытка разобраться с полезной на мой взгляд программой SquidGuard редиректа и фильтрации запросов Squid.
  1. Назначение SquidGuard.
  2. Возможности.
  3. Окружение: используемая OS и среда.
  4. Настройка конфигурации.
  5. Тестирование.
  6. Использование совместно со Squid.
  7. Ссылки.
  8. Критика и Отзывы.
  1. Назначение SquidGuard.

    SquidGuard предназначен для работы с proxy-сервером Squid и служит для редиректа и фильтрации запросов Squid.

  2. Возможности.

    Возможности SquidGuard:

    1. гибкая фильтрация запросов;
    2. опознавание пользователей по IP-адресу или имени;
    3. работа по расписанию;
    4. обрезка (а точнее подмена) banners и т.д.

  3. Окружение: используемая OS и среда.

    Несколько слов об окружении.

    Имеется:

    Я хочу рассмотреть только те элементы настройки SquidGuard, которые реально работают у меня . Думаю, большинству администраторов этого будет достаточно. Я администрирую работу с Интернет приложениями в учебном заведении.
      Общее количество машин - около 100. SquidGuard позволяет бороться с вредными наклонностями студентов (порнография, чаты, агрессия, наркотики и т.д.), а также экономить трафик (рекламные банеры, mp3 и т.д.). В то же время отдельным пользователям можно позволить посещать всё или только список "хороших" сайтов.

    Так, реклама прошла успешно, теперь к делу.

  4. Настройка конфигурации.

    Любым способом устанавливаем пакет SquidGuard (например из портов). Стандартно инсталляция проходит в папку /usr/local/SquidGuard.
      Здесь создаются папки:

    Качаем архив blacklists.tar.gz, распаковываем и полученные папки с файлами выкладываем в папку db.

    Можно использоать адреса:

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

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

    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/

    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-а , желательно протестировать его работу.

  5. Тестирование.

    Создаем исполняемый файл 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-а.

  6. Использование совместно со Squid.

    Cтартуем из squid.
    Добавляем в файл squid.conf:

    По идее все уже работает за исключением следующего:

    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 автоматически будет преобразовывать их при загрузке (замедляет загрузку).

  7. Ссылки.

    Полная докумунтация находится по адресу:

  8. Критика и Отзывы.

    Все отзывы, замечания и критику просьба отправлять по адресу zakat@ukr.net


Date: 2001/02/26
Андрей Савченко (zakat@ukr.net) Date: 2001/03/01