Как связка Squid+SquidGuard использует блэклист?

Как связка Squid+SquidGuard использует блэклист?

Большое количество возникающих в последнее время вопросов вида "Как использовать ваши блэклисты в реальной ситуации?", дали нам возможность осознать необходимость написания серии статей на эту тематику.  Последнюю пару недель мы потратили на сборку и нагрузочное тестирование системы фильтрации доменов и URL-ей на базе связки iptables, Squid и SquidGuard под наши блэклисты. Узнали достаточно много интересных нюансов, которыми и начинаем делиться в данной статье. 

Во вводной части мы опишем общие понятия, необходимые для понимания дальнейших рассуждений, во второй части - то, как SquidGuard принимает решение о блокировании доменов, а далее коснемся обработки SquidGuard-ом доменов на национальных языках.

 

Вводная часть

SquidGuard это программа-редиректор, предназначенная для работы в паре с кэширующим прокси-сервером Squid. Основное ее назначение - это очень быстро дать ответ, доставлять ли пользователю содержимое сайта, либо перенаправить его на страницу, сообщающую, что доступ к сайту ограничен (в том случае, если запрашиваемый сайт находится в списке запрещенных). Проще говоря, взаимодействие программ сводится к элементарному диалогу:

Squid: "Загружать контент с сайта example.com?"
SquidGuard: "Да, загружай контент с сайта example.com"

или возможен второй вариант:

Squid: "Загружать контент с сайта porn.com?"
SquidGuard: "Нет, загружай контент со страницы localhost/blocked_by_squid.html"

Также SquidGuard обладает мощной настраиваемой системой контроля доступа, позволяющей настраивать группы пользователей, создавать различные политики доступа и прочее. Однако это является отдельной темой, достойной специальной статьи, мы же сконцентрируемся на особенностях того, как SquidGuard принимает решение, что ответить (а именно, куда переслать пользователя).

Решение о блокировании URL-я SquidGuard принимает на основании подключенных текстовых файлов со списком доменов. Они бывают двух видов: blacklist - домены, к которым необходимо запретить доступ и whitelist - домены к которым необходимо разрешить доступ. Необходимо понимать, что домены в этих списках могут быть как второго уровня (example.com), так и третьего и выше уровней: subdomain.example.com, subsubdomain.subdomain.example.com. Причем, в зависимости от того, домены (и поддомены) какого уровня присутствуют или отсутствуют в блэклисте, SquidGuard использует различную логику для принятия решения.

 

Логика принятия решения SquidGuard

Простейший случай - в блэклисте находится ТОЛЬКО домен второго уровня:

example.com

В этом случае блокируется доступ ко всему домену и всем его поддоменам (включая префикс www.): http://example.com, http://www.example.com, http://foo.example.com, http://foo.bar.subdomain.example.com.

Если в блэклисте находятся домен и его поддомен (или поддомены), либо два и более поддомена одного домена:

      example.com
ero.example.com

Заблокированы будут только http://example.com, http://ero.example.com и все домены 4-го уровня http://s1.ero.example.com. Обратите внимание: все остальные поддомены, включая служебные префиксы www, будут доступны пользователю: http://images.example.com, http://www.example.com, http://www2.example.com

Аналогично, если в блэклисте указаны только домены третьего уровня:

ero.example.com
sex.example.com

заблокированы будут  http://ero.example.com и http://sex.example.com и все их поддомены 4-го и выше уровней (http://s1.sex.example.com, http://s1.images.ero.example.com) для этих поддоменов (включая служебные префиксы www.). Домен example.com и иные его поддомены третьего уровня будут доступны.

Резюмировать правила можно следующим образом:

Служебные префиксы www., www1. - www9. рассматриваются как поддомены вышестоящего уровня.

Если в блэклисте указан только один домен или поддомен, блокируется он и все его вышестоящие поддомены.

Если в блэклисте указаны два и более поддомена одного уровня, блокируются только они и все их вышестоящие поддомены.

Если в блэклисте указаны поддомены разных уровней, то блокируется домен нижестоящего уровня, домен вышестоящего уровня и все его поддомены вышестоящего уровня. Обратите внимание, что т.к. префикс www. рассматриваются в качестве поддомена, то доступ к домену нижестоящего уровня с префиком www. будет открыт.

 

Работа SquidGuard в многоязычной системе доменных имен (punycode)

В связи с появлением доменов на национальных языках была реализована схема конвертации доменов с национальных языков на латиницу под названием Punycode. Общая идея проста - URL на национальном языке, например, http://сайт.рф, по определенной логике переводится в домен вида http://xn--80aswg.xn--p1ai, доступный для понимания интернет-службами. Так как конвертации подвергается каждый уровень доменного имени независимо от других, структура доменного имени при этом сохраняется: http://форум.сайт.рф преобразуется в http://xn--l1adgmc.xn--80aswg.xn--p1ai

Конвертация в и из pinycode происходит на уровне браузера пользователя, поэтому и для DNS-серверов, и для прокси-серверов все происходит прозрачно и незаметно. Логика работы проста: пользователь вводит URL на национальном языке, браузер переводит его в punycode, отсылает запрос к DNS-серверу, получает ответ с требуемым IP-адресом, обращается по нему за контентом и выдает его пользователю. 

В том случае, когда в запрашиваемую логику добавляется связка Squid+SquidGuard, то в ней вообще ничего не меняется - к ним уже приходит на проверку сконвертированный в punycode URL. Просто и изящно. Понятно, что в блэклистах должны содержаться уже переведенные в punycode домены.