Фильтрация доступа в интернет на Squid+SquidGuard
Добрый день. Помогите, пожалуйста, с проблемой. Есть шлюз на OpenSUSE 11.4, который выпускает сотрудников в интернет. На шлюзе поднят squid, надо решить проблему распределения прав доступа и блокировки нежелательного контента. Исходные данные: 1) В компании используется DHCP, поэтому надо либо уйти от использования фильтрации по IP (предпочтительно), либо вбивать кучу народа в статику DHCP (не хочется). 2) В компании работает софт, который не умеет работать с непрозрачными прокси, поэтому прокси должен быть прозрачным. Дальше интереснее: Редиректору, по идее, передается множество полезной информации, в том числе FQDN машины пользователя и его имя. Благодаря пункту 2 исходных данных, т.к. нет возможности узнать имя пользователя не спрашивая его (или я не нашел), был выбран вариант привязаться к FQDN машины, что не очень красиво, но терпимо. Дальше начинаются непонятные вещи: на сайте squidGuard в примерах описана конструкция вида (http://www.squidguard.org/Doc/examples.html - пример 3)
src privileged {
domain foo.bar
}
Однако при попытке изобразить это в конфиге, squidGuard запускается без ошибок, однако усердно делает вид, что группы privileged не существует.
Далее, потратив еще пару часов на поиски решения, я так устал, что решил написать прослойку между squid и squidGuard, которая должна получать запрос от squid, менять в нем местами имя пользователя и FQDN, передавать в squidGuard, получать ответ, менять местами обратно и возвращать в squid. Вот код:
<?php
$SGbin='/usr/sbin/squidGuard';
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/var/log/squidGuard/translator.log", "a") // stderr is a file to write to
);
stream_set_timeout(STDIN,86400);
$process=proc_open($SGbin, $descriptorspec, $pipes);
if(is_resource($process)){
while($str=fgets(STDIN)){
if(ereg('(.+) ([0-9.]+)/([^ ]+) ([^ ]+) (.+)',$str,$fields))
$str=$fields[1]." ".$fields[2]."/".$fields[4]." ".$fields[3]." ".$fields[5];
fwrite($pipes[0],$str);
$str=fgets($pipes[1]);
if(ereg('(.+) ([0-9.]+)/([^ ]+) ([^ ]+) (.+)',$str,$fields))
$str=$fields[1].' '.$fields[2].'/'.$fields[4].' '.$fields[3].' '.$fields[5];
fwrite(STDOUT,$str);
}
fclose($pipes[0]);
fclose($pipes[1]);
proc_close($process);
}
?>
Все это прекрасно работало в консоли, и работало именно так, как от него и ожидалось, однако каково же было мое удивление, когда при попытке запустить этот скрипт как редиректор, функция proc_open просто отказалась работать, т.е. новый процесс не создается, функция возвращает false, все редиректоры умирают и squid вместе с ними.
Дальше у меня кончились идеи, поэтому я обращаюсь к вам.
Эл. почта
Сообщить модератору Изменить Цитировать
Сообщений 1