LINUX.ORG.RU
ФорумAdmin

Фильтрация доступа в интернет на Squid+SquidGuard

 ,


0

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 вместе с ними.

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

Эл. почта

Сообщить модератору Изменить Цитировать

Сообщений 1

Как вариант, чтоб не настраивать dhcp, можно время аренды выставить на месяц или на два. - Будет стабильно один ip адрес, и не надо ничего руками городить. Если есть софт который не умеет ходить через непрозрачный прокси - может помочь сокс сервер какой-нибудь... А чтоб не спрашивало логина-пароля - это домен+kerberos или NTLM

DALDON ★★★★★ ()
Ответ на: комментарий от DALDON

Если есть софт который не умеет ходить через непрозрачный прокси - может помочь сокс сервер какой-нибудь...

И софт, и браузеры ходят через 80-й порт. Фильтрация сайтов для браузеров нужна, поэтому сокс не вариант.

NTLM

Не совместим с прозрачным проксированием

домен+kerberos

Можно подробнее?

время аренды выставить на месяц или на два

Но это же некрасивое решение.

Hormiga ()
Ответ на: комментарий от Hormiga

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

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

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
}

Hormiga ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.