<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; [Решено] Фильтрация доступа в интернет на Squid+SquidGuard]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=24668&amp;type=atom" />
	<updated>2012-10-15T10:52:34Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=24668</id>
		<entry>
			<title type="html"><![CDATA[Re: [Решено] Фильтрация доступа в интернет на Squid+SquidGuard]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=303617#p303617" />
			<content type="html"><![CDATA[<p>В общем, если вдруг кому интересно, а также для гугла напишу:</p><p>Поковыряв исходники, я выяснил следующее: правила, описывающие принадлежность хоста к группе-источнику, работают по принципу &quot;И&quot;, а не &quot;ИЛИ&quot;, т.е. группа<br /></p><div class="codebox"><pre><code>src admin {
     ip 192.168.0.1
     domain foo.domain.net
}</code></pre></div><p> подходит только в том случае, если хост имеет ОДНОВРЕМЕННО указанные IP и доменное имя.<br />Ну а чтобы сделать фильтрацию по доменным именам так, как надо мне, конструкция должна быть примерно такой:<br /></p><div class="codebox"><pre><code>src managers {
     ip 192.168.0.100-192.168.0.250     #Диапазон DHCP
     domain mgm01.domain.net, mgm02.domain.net, mgm03.domain.net
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Hormiga]]></name>
				<uri>https://linuxforum.ru/profile.php?id=25999</uri>
			</author>
			<updated>2012-10-15T10:52:34Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=303617#p303617</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[[Решено] Фильтрация доступа в интернет на Squid+SquidGuard]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=302828#p302828" />
			<content type="html"><![CDATA[<p>Добрый день.<br />Помогите, пожалуйста, с проблемой.<br />Есть шлюз на OpenSUSE 11.4, который выпускает сотрудников в интернет. На шлюзе поднят squid, надо решить проблему распределения прав доступа и блокировки нежелательного контента.<br />Исходные данные:<br />1) В компании используется DHCP, поэтому надо либо уйти от использования фильтрации по IP (предпочтительно), либо вбивать кучу народа в статику DHCP (не хочется).<br />2) В компании работает софт, который не умеет работать с непрозрачными прокси, поэтому прокси должен быть прозрачным.<br />Дальше интереснее:<br />Редиректору, по идее, передается множество полезной информации, в том числе FQDN машины пользователя и его имя. Благодаря пункту 2 исходных данных, т.к. нет возможности узнать имя пользователя не спрашивая его (или я не нашел), был выбран вариант привязаться к FQDN машины, что не очень красиво, но терпимо.<br />Дальше начинаются непонятные вещи: на сайте squidGuard в примерах описана конструкция вида (http://www.squidguard.org/Doc/examples.html - пример 3)<br /></p><div class="codebox"><pre><code>src privileged {
     domain foo.bar
     }</code></pre></div><p>Однако при попытке изобразить это в конфиге, squidGuard запускается без ошибок, однако усердно делает вид, что группы privileged не существует.</p><p>Далее, потратив еще пару часов на поиски решения, я так устал, что решил написать прослойку между squid и squidGuard, которая должна получать запрос от squid, менять в нем местами имя пользователя и FQDN, передавать в squidGuard, получать ответ, менять местами обратно и возвращать в squid.<br />Вот код:<br /></p><div class="codebox"><pre><code>&lt;?php

$SGbin=&#039;/usr/sbin/squidGuard&#039;;

$descriptorspec = array(
        0 =&gt; array(&quot;pipe&quot;, &quot;r&quot;),        // stdin is a pipe that the child will read from
        1 =&gt; array(&quot;pipe&quot;, &quot;w&quot;),        // stdout is a pipe that the child will write to
        2 =&gt; array(&quot;file&quot;, &quot;/var/log/squidGuard/translator.log&quot;, &quot;a&quot;)   // 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(&#039;(.+) ([0-9.]+)/([^ ]+) ([^ ]+) (.+)&#039;,$str,$fields))
                        $str=$fields[1].&quot; &quot;.$fields[2].&quot;/&quot;.$fields[4].&quot; &quot;.$fields[3].&quot; &quot;.$fields[5];
                fwrite($pipes[0],$str);
                $str=fgets($pipes[1]);
                if(ereg(&#039;(.+) ([0-9.]+)/([^ ]+) ([^ ]+) (.+)&#039;,$str,$fields))
                        $str=$fields[1].&#039; &#039;.$fields[2].&#039;/&#039;.$fields[4].&#039; &#039;.$fields[3].&#039; &#039;.$fields[5];
                fwrite(STDOUT,$str);
        }
        fclose($pipes[0]);
        fclose($pipes[1]);
        proc_close($process);
}
?&gt;</code></pre></div><p>Все это прекрасно работало в консоли, и работало именно так, как от него и ожидалось, однако каково же было мое удивление, когда при попытке запустить этот скрипт как редиректор, функция proc_open просто отказалась работать, т.е. новый процесс не создается, функция возвращает false, все редиректоры умирают и squid вместе с ними.</p><p>Дальше у меня кончились идеи, поэтому я обращаюсь к вам.</p>]]></content>
			<author>
				<name><![CDATA[Hormiga]]></name>
				<uri>https://linuxforum.ru/profile.php?id=25999</uri>
			</author>
			<updated>2012-10-12T08:02:06Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=302828#p302828</id>
		</entry>
</feed>
