Приложение
Данный раздел предназначен для тех, кто хочет лучше разобраться в устройстве работы SkyDNS Zapret ISP.
Схема работы SkyDNS Zapret ISP
Общая информация
SkyDNS Zapret ISP в автоматическом режиме (по умолчанию раз в час) скачивает источники, которые включены в файле конфигурации (по умолчанию список Роскомнадзор и список URL, подготовленный SkyDNS, на основе списка экстремистских материалов Министерства юстиции РФ). Служба SkyDNS Zapret ISP - zi-update
, постоянно разрешает доменные имена запрещенных ресурсов в IP-адреса. Полученные IP-адреса анонсируются на внутренний маршрутизатор. Трафик, идущий на эти IP-адреса, маршрутизируется на систему фильтрации.
Оставшийся трафик не меняет маршрут следования (см. раздел Схемы подключения SkyDNS Zapret ISP в сеть).
Попавший на SkyDNS Zapret ISP трафик классифицируется следующим образом:
Тип | Действие |
---|---|
Блокируемый http трафик | Возврат страницы блокировки |
Блокируемый https трафик | Возвращается tcp-reset |
Неблокируемый трафик | Маршрутизируется без изменений |
Ответы на пропущенный без изменений трафик идут через сеть напрямую к клиентам (осуществляется асимметричная маршрутизация).
Трафик, попавший на систему фильтрации, проходит через iptables, после чего попадает на Squid. Squid создаёт две своих копии - одна обрабатывает нешифрованный трафик и располагается на 3128 порту, вторая обрабатывает шифрованный и располагается на 3130 порту. Каждая из копий использует списки доступа (ACL), которые исходя из полученных аргументов принимают решение о том, что вернуть на запрос.
Проверки в ACL
ACL на 3128 порту (нешифрованный трафик), основываясь на составляющих http запроса: домен, порт, путь, аргументы, принимает решение о том пропустить трафик или вернуть страницу блокировки.
ACL на 3130 порту (шифрованный трафик), основываясь на составляющих https запроса: SNI, принимает решение о том пропустить трафик или вернуть tcp-reset.
Порядок проверок в ACL:
- Происходит проверка на то, является ли значение в заголовке Host IP-адресом, а также какой протокол используется. Если HTTP и в заголовке IP - возвращаем страницу блокировки.
- Происходит поиск набора параметров среди правил фильтрации из Белого списка, если находим - пропускаем запрос.
- Происходит поиск набора параметров среди правил фильтрации из Черного списка, если находим - возвращаем страницу блокировки.
- Происходит поиск по маске, если находим - возвращаем страницу блокировки.
- Пропускаем запрос.
Фильтрация HTTPS и IPv6 и их особенности
Фильтрация HTTPS
Механизм блокировки https трафика:
- Трафик поступает на систему фильтрации (443 порт), где посредством iptables перенаправляется на 3130 порт. На этом порте слушает Squid, который принимает входящий пакет.
- Squid использует технологию SSL Bump. Она включает в себя установление двунаправленного защищенного соединение - одно в сторону клиента (Squid представляется запрашиваемым сервером, используя самоподписанный сертификат), другое в сторону сервера.
- Если обнаруживается попытка установления соединения с блокируемым ресурсом, Squid закрывает туннель в сторону сервера, а клиенту возвращает tcp-reset.
- Иначе трафик идёт без изменений.
Фильтрация осуществляется только, если ресурс заблокирован по домену. В этом случае используется SNI, на основании которого и осуществляется проверка. Фильтрация по URL в случае https трафика не работает.
Фильтрация доступа к ресурсам в реестре по протоколу IPv6
SkyDNS Zapret ISP поддерживает фильтрацию по протоколу IPv6 но только в том случае, если провайдер предоставляет своим пользователям IPv6 префикс, на основании которого компьютер пользователя генерирует IPv6 адрес.
В случае если провайдер не предоставляет своим пользователям префикс, то последние версии ОС Windows пытаются настроить использование протокола IPv6 поверх IPv4 в автоматическом режиме - происходит создание туннеля IPv6 поверх IPv4. Осуществлять фильтрацию IPv6 в таком случае невозможно.
Фильтрующий DNS-сервер
В состав SkyDNS Zapret ISP также входит фильтрующий DNS-сервер (Unbound).
Он запущен на 127.0.0.2:53
. Запросы на него перенаправляются посредством iptables
. Перенаправление происходит если: порт назначения пакета - 53; IP-адрес, с которого пакет был отправлен, находится в фильтруемых сетях. Если IP-адрес источника находится в нефильтруемых сетях (сети, добавленные командой zi-ctl nets с опцией --bypass
), запрос перенаправляется на обычный DNS-сервер, который располагается на 127.0.0.1:53
.
Принцип работы: на основании таблиц с хостами и с IP-адресами формируются stub-зоны, тем самым гарантируется возврат того IP-адреса, который присутствует в таблице маршрутизации роутера. Такой подход гарантирует 100% перенаправление запросов к заблокированным ресурсам.
Кэш в Squid
В конфигурационном файле, поставляемом вместе с пакетом, кэш отключен.
cache deny all
Отключает кэширование данных, полученных от web-серверов (html страницы, иконки, картинки).
cache_dir aufs /var/spool/squid 20000 49 256
Папка, в которую будет помещаться кэш. Первое число - размер дискового кэша в мегабайтах. Второе число - количество поддиректорий первого уровня. Третье число - количество поддиректорий третьего уровня.
Squid использует ~1 Gb RAM, чтобы адресовать 10 Gb кэша.
maximum_object_size 32768 KB minimum_object_size 3 KB
Размер максимального и минимального файлов в кэше.
cache_swap_low 80 cache_swap_high 90
Определяет процент заполнения кэша, после которого Squid будет его очищать.
cache_mem 2500 MB maximum_object_size_in_memory 512 KB
cache_mem
- объём RAM, который будет использоваться для кэширования.
maximum_object_size_in_memory
- соответствует параметру maximum_object_size
, но для RAM.
cache_mem - не жесткое ограничение для всего RAM, которое будет использовано Squid-ом. Squid использует помимо этого другие кэши, плюс на внутренние нужды.
Таблицы базы данных
Описание таблиц базы данных.
В базу данных входят следующие таблицы:
- filter - содержит правила фильтрации. Ресурс может быть заблокирован по IP-адресу, URL, доменному имени, маски домена.
- route - содержит маршруты, ассоциированные с доменами из таблицы host. В эту же таблицу попадают маршруты, поставляемые вместе с источником (например, IP-адреса, которые заблокировал Роскомнадзор).
- host - содержит доменные имена записей из таблицы filter.
- src_net - содержит сети, из которых на систему фильтрации будет поступать трафик.
- user - содержит данные об учетных записях пользователей web-интерфейса.