13. Приложение

Данный раздел предназначен для тех, кто хочет лучше разобраться в устройстве работы SkyDNS Zapret ISP.

13.1. Схема работы SkyDNS Zapret ISP

В этом разделе описана схема работы SkyDNS Zapret ISP.

13.1.1. Общая информация

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), которые исходя из полученных аргументов принимают решение о том, что вернуть на запрос.

13.1.2. Проверки в ACL

ACL на 3128 порту (нешифрованный трафик), основываясь на составляющих http запроса: домен, порт, путь, аргументы, принимает решение о том пропустить трафик или вернуть страницу блокировки.

ACL на 3130 порту (шифрованный трафик), основываясь на составляющих https запроса: SNI, принимает решение о том пропустить трафик или вернуть tcp-reset.

Порядок проверок в ACL:

  1. Происходит проверка на то, является ли значение в заголовке Host IP-адресом, а также какой протокол используется. Если HTTP и в заголовке IP - возвращаем страницу блокировки.
  2. Происходит поиск набора параметров среди правил фильтрации из Белого списка, если находим - пропускаем запрос.
  3. Происходит поиск набора параметров среди правил фильтрации из Черного списка, если находим - возвращаем страницу блокировки.
  4. Происходит поиск по маске, если находим - возвращаем страницу блокировки.
  5. Пропускаем запрос.

13.2. Фильтрация HTTPS и IPv6 и их особенности

13.2.1. Фильтрация HTTPS

Механизм блокировки https трафика:

  1. Трафик поступает на систему фильтрации (443 порт), где посредством iptables перенаправляется на 3130 порт. На этом порте слушает Squid, который принимает входящий пакет.
  2. Squid использует технологию SSL Bump. Она включает в себя установление двунаправленного защищенного соединение - одно в сторону клиента (Squid представляется запрашиваемым сервером, используя самоподписанный сертификат), другое в сторону сервера.
  3. Если обнаруживается попытка установления соединения с блокируемым ресурсом, Squid закрывает туннель в сторону сервера, а клиенту возвращает tcp-reset.
  4. Иначе трафик идёт без изменений.

Фильтрация осуществляется только, если ресурс заблокирован по домену. В этом случае используется SNI, на основании которого и осуществляется проверка. Фильтрация по URL в случае https трафика не работает.

13.2.2. Фильтрация доступа к ресурсам в реестре по протоколу IPv6

SkyDNS Zapret ISP поддерживает фильтрацию по протоколу IPv6 но только в том случае, если провайдер предоставляет своим пользователям IPv6 префикс, на основании которого компьютер пользователя генерирует IPv6 адрес.

В случае если провайдер не предоставляет своим пользователям префикс, то последние версии ОС Windows пытаются настроить использование протокола IPv6 поверх IPv4 в автоматическом режиме - происходит создание туннеля IPv6 поверх IPv4. Осуществлять фильтрацию IPv6 в таком случае невозможно.

13.3. Фильтрующий 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% перенаправление запросов к заблокированным ресурсам.

13.4. Кэш в 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 использует помимо этого другие кэши, плюс на внутренние нужды.

13.5. Таблицы базы данных

Описание таблиц базы данных.

В базу данных входят следующие таблицы:

  • filter - содержит правила фильтрации. Ресурс может быть заблокирован по IP-адресу, URL, доменному имени, маски домена.
  • route - содержит маршруты, ассоциированные с доменами из таблицы host. В эту же таблицу попадают маршруты, поставляемые вместе с источником (например, IP-адреса, которые заблокировал Роскомнадзор).
  • host - содержит доменные имена записей из таблицы filter.
  • src_net - содержит сети, из которых на систему фильтрации будет поступать трафик.
  • user - содержит данные об учетных записях пользователей web-интерфейса.

13.6. Список изменений

13.6.1. SkyDNS Zapret ISP 3.2.9

  1. Улучшена стабильность работы системы.

13.6.2. SkyDNS Zapret ISP 3.2.8

  1. Исправлена ошибка в работе ACL.

13.6.3. SkyDNS Zapret ISP 3.2.7

  1. Правила ip(6)tables восстанавливаются сами после перезагрузки.

13.6.4. SkyDNS Zapret ISP 3.2.6

  1. Добавлена новая команада для мониторинга маршрутов и доменов в базе zi-ctl verify.
  2. Улучшена zi-ctl ipset.
  3. Добавлена возможность использовать свои наборы ipset, сохраняющиеся после перезагрузки системы (Правила iptables и ipset).

13.6.5. SkyDNS Zapret ISP 3.2.5

  1. Обновлена логика работы с белым списком при анонсировании маршрутов.
  2. Исправлена ошибка в формировании stub зон.
  3. Команда zi-ctl delete-expired теперь не является обязательной для запуска по cron’у.
  4. Добавлена возможность настройки параметров ipset’ов (zi-ctl ipset).

13.6.6. SkyDNS Zapret ISP 3.2.4

  1. Обновлена логика анонсирования маршрутов. Маршруты, присутствующие на маршрутизаторе, не анонсируются повторно.
  2. Письмо от zi-ctl download придёт только в случае, если какая-то из загрузок не выполнилась.

13.6.7. SkyDNS Zapret ISP 3.2.3

  1. Поддержка фильтрации по протоколу IPv6.

13.6.8. SkyDNS Zapret ISP 3.2.2

  1. Исправлены ошибки, связанные с командой очистки базы.
  2. Уменьшено потребление памяти для команды удаления истёкших маршрутов
  3. Оптимизирована команда zi-ctl create-zones при работе с большими объёмами данных.

13.6.9. SkyDNS Zapret ISP 3.2.1

  1. Была произведена унификация URL. Теперь URL со слэшом на конце и без - одна сущность.

13.6.10. SkyDNS Zapret ISP 3.2.0

  1. Добавлена возможность агрегации маршрутов.
  2. Исправлена 500 ошибка в Web интерфейсе, возникающая при попытке изменить страницу блокировки.
  3. Исправлена 500 ошибка в Web интерфейсе, возникающая при попытке перейти в раздел управления пользователями.

13.6.11. SkyDNS Zapret ISP 3.1.8

  1. Изменена конфигурация виртуального окружения.

13.6.12. SkyDNS Zapret ISP 3.1.7

  1. Исправлена ошибка когда SkyDNS Zapret ISP некорректно работал с openssl версией ниже 1.0.2

13.6.13. SkyDNS Zapret ISP 3.1.6

  1. Добавлена возможность загрузки собственного списка блокировок.
  2. Изменена логика работы белого списка для IP адресов.
  3. Исправлена ошибка с checkbox’ом на вкладке Фильтруемые подсети.
  4. Ipset v4_dns_filter_addr убран из использования.
  5. Исправлена ошибка, возникающая при добавлении IP адреса в любой из списков.
  6. Исправлена ошибка с зависимостями.
  7. Добавлена возможность оставлять конфигурационные файлы при удалении через purge.

13.6.14. SkyDNS Zapret ISP 3.1.5

  1. Обновлены debian скрипты.
  2. Улучшение системы логирования.

13.6.15. SkyDNS Zapret ISP 3.1.4

  1. Исправлена ошибка, приводящая к остановке процесса обновления маршрутов.

13.6.16. SkyDNS Zapret ISP 3.1.3

  1. Оптимизированы команды zi-ctl.
  2. Переход на raw sql с усовершенствованной системой логирования в ACL и одним курсором. Логирование для ACL включается отдельным параметром (log_acl).
  3. Поправлена логика работы параметра ip-limit.

13.6.17. SkyDNS Zapret ISP 3.1.2

  1. Исправлен фильтр по типам блокировки в веб-интерфейсе.
  2. Исправлена ошибка, когда было нельзя добавить правило фильтрации, если в другом списке уже существовало правило для данного домена.
  3. Исправлена ошибка, с одним фильтром на тип блокировки.

13.6.18. SkyDNS Zapret ISP 3.1.1

  1. Закончена работа с документацией.
  2. Ошибка с IPv6 адресом в ExpressionGenerator обрабатывается корректно.

13.6.19. SkyDNS Zapret ISP 3.1.0

  1. Переработаны страницы Списки/Маршруты/Фильтруемые сети в web-интерфейсе.
  2. Конфигурационный файл можно править из web-интерфейса.
  3. Обновлены правила для iptables.
  4. Доработан postinst скрипт.