1

Добрый день.
Помогите, пожалуйста, с проблемой.
Есть шлюз на 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 вместе с ними.

Дальше у меня кончились идеи, поэтому я обращаюсь к вам.

2

В общем, если вдруг кому интересно, а также для гугла напишу:

Поковыряв исходники, я выяснил следующее: правила, описывающие принадлежность хоста к группе-источнику, работают по принципу "И", а не "ИЛИ", т.е. группа

src admin {
     ip 192.168.0.1
     domain foo.domain.net
}

подходит только в том случае, если хост имеет ОДНОВРЕМЕННО указанные IP и доменное имя.
Ну а чтобы сделать фильтрацию по доменным именам так, как надо мне, конструкция должна быть примерно такой:

src managers {
     ip 192.168.0.100-192.168.0.250     #Диапазон DHCP
     domain mgm01.domain.net, mgm02.domain.net, mgm03.domain.net
}