11. Продвинутая настройка

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

11.1. Конфигурационный файл

Ниже представлен пример конфигурационного файла со всеми существующими параметрами:

---
# Устанавливает уровень логирования.
# Возможные варианты: DEBUG (логируется вся вспомогательная информация), INFO (логируется только информация из критичных мест (ответы ACL, загрузки списков)).
loglevel: DEBUG

# Включает логирование ответов ACL. Увеличивает время ответа ACL на ~20%
log_acl: False

# Содержит системные пути к различным командам.
system_paths:
  # Путь к команде `ipset`.
  ipset: /sbin/ipset
  # Путь к команде `unbound-control`.
  unbound_control: /usr/sbin/unbound-control
  # Путь к команде `iptables`.
  iptables: /sbin/iptables
  # Путь к команде `ip6tables`.
  ip6tables: /sbin/ip6tables
  # Путь к команде `iptables-restore`.
  iptables_restore: /sbin/iptables-restore
  # Путь к команде `ip6tables-restore`.
  ip6tables_restore: /sbin/ip6tables-restore
  # Путь к команде `service`.
  service: /usr/sbin/service

# Включает поддержку IPv6 в системе фильтрации - IPv6 адреса переносятся из источников в базу; доменные имена разрешаются в IPv6 адреса.
ipv6_support: true

ip_aggregator:
   # Граница агрегации.
   ip-barrier: 120
   # Включение агрегирования.
   enabled: true

resolver:
  # Количество параллельных подключений к Unbound.
  concurrency: 500
  # Время, которое прибавляется в реальному `ttl`, чтобы получить фиктивный.
  ttl: 3h
  # Таймаут между циклами разрешения доменов находящихся в базе.
  interval: 5m
  # Анонсировать маршруты посредством exabgp.
  dynamic-routing: true
  # next hop для всех анонсируемых маршрутов, менять только в случае необходимости.
  bgp-next-hop: 8.8.8.8
  # Устанавливает максимальное количество IP-адресов, которые будут заноситься в базу, после разрешения домена.
  ip-limit: 12
  # Адрес DNS-сервера, через который сервис `zi-update` будет производить разрешение доменных имён.
  dns-name: 127.0.0.1

admin:
  # Токен, используемый утилитой zi-check для авторизации и получения списка урлов.
  check-api-token: 32b24177-ad41-40ea-af74-45c9e5bdbf4d
  # Следующие значения устанавливают порог, привысив который, в web-интерфейсе на главной странице будут создаваться оповещения.
  # Допустимое количество дней с момента последней загрузки источника (любого).
  max_time_delta: 2
  # Допустимый процент используемой RAM.
  memory_threshold: 80
  # Допустимый процент используемого своп-файла.
  max_expected_swap: 80
  # Допустимый процент используемого места на диске.
  max_expected_memory: 80

# Каждый модуль загрузки (enricher) состоит из парсера и загрузчика. По умолчанию они оба включены.
# enable_parser: false - выключает парсер (занесение информации в бд).
# enable_downloader: false - выключает загрузчик. Парсер всё ещё работает.
enrichers:
   # Мин.Юст.
   mjust:
      name: mjust
      #enable_parser: false
      #enable_downloader: false

   # Белый список Роскомнадзора.
   # Стоит отметить, что он является полуофициальным. В нём находятся домены государственных служб, компаний.
   wrkn:
      name: wrkn
      enable_parser: false
      enable_downloader: false
      #  Адрес загрузки.
      url: https://storage.googleapis.com/smisc/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D1%85%20%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BE%D0%B2.xlsx
      # Время, через которое источник будет загружаться. По умолчанию 24 часа.
      # Пример формата: 12h - каждые 12 часов, 10m - каждые 10 минут.
      period: 24h

   # Список Роскомнадзора.
   rkn:
      name: rkn
      #enable_parser: false
      #enable_downloader: false

      operator_info:
        # Настроить, если для подписи запросов к API получения выгрузки используется ключ.
        # Этот блок необходимо закомментировать или удалить.
        operatorname: OOO "ОПЕРАТОР"
        inn: '6670123456'
        ogrn: '116670002345'
        email: 'root@loclhost.com'
        # Файлы для создания квалифицированной электронной подписи.
        certificate: /var/lib/skydns-zi/keys/private.pem
        privatekey: /var/lib/skydns-zi/keys/id_rsa.key

      signed_files:
        # Настроить, если для подписи запросов к API получения выгрузки.
        # Используется заранее заготовленный и подписанный запрос.
        # Этот блок необходимо закомментировать или удалить.
        xmlreqfile: /var/lib/skydns-zi/req/request.xml
        signaturefile: /var/lib/skydns-zi/req/request.xml.sig

ipset_config:
   # Обратите внимание, что существуют аналогичные параметры для протокола IPv6 (в тех же блоках, но с цифрой 6).
   # Определяет размер хэша для указанных `ipset`.
  hash_size:
    v4_http_black_dst: 65536
    v4_https_black_dst: 65536
    v4_blacklist_nets_dst: 65536
    v4_isp_nets_src: 1024
    v4_isp_bypass_nets_src: 1024
    v4_whitelisted_ips: 1024

   # Устанавливает максимальное количество элементов, которое может содержать указанный `ipset`.
  max_elem:
    v4_http_black_dst: 150000
    v4_https_black_dst: 150000
    v4_blacklist_nets_dst: 150000
    v4_isp_nets_src: 1024
    v4_isp_bypass_nets_src: 1024
    v4_whitelisted_ips: 1024

11.2. Отключение загрузки и осуществление фильтрации по URL из списка Минюста

По умолчанию с сайта https://www.skydns.ru SkyDNS Zapret ISP скачивает список URL, подготовленный SkyDNS, на основе списка Министерства юстиции РФ. Чтобы не скачивать и не осуществлять фильтрацию по этому списку URL, установите значение параметров enricher.mjust.downloader: false enricher.mjust.parser: false в /etc/skydns-zi/config.yml:

mjust:
   downloader: false
   parser: false

Удалите связанные с этим списком файлы:

rm /var/lib/skydns-zi/src/zi-mj-urllist*

Опасно

Отключать не рекомендуется, так как через этот источник распространяются поддомены доменов, которые Роскомнадзор блокирует по маске.

11.3. Firewall

При установке пакета создаются правила firewall и ipset’ы, необходимые для работы skynds-zi. Если Вам необходимо добавить свои правила или ipset’ы, добавьте их в файлы /etc/firewall.conf и /etc/ipset.conf.

Содержимое данных файлов должно соответствовать формату выходных данных команд iptables-save и ipset save. Если Вы добавляете правила любым другим способом, они не будут восстановлены после перезагрузки системы.

11.4. Отказоустойчивость

Рассмотрим различные схемы подключения SkyDNS Zapret ISP в сеть и способы осуществления отказоустойчивости:

  1. Динамическая маршрутизация. В случае выхода из строя сервера SkyDNS Zapret ISP, перенаправление исходящего трафика на систему фильтрации осуществляться не будет, таким образом, не пострадает основной сервис сети – предоставление доступа абонентам в сеть Интернет.
  2. Статическая маршрутизация. В случае выхода из строя сервера SkyDNS Zapret ISP, необходимо на уровне скрипта предусмотреть очистку таблицы маршрутизации от добавленных статических маршрутов.

Диаграмма ниже демонстрирует способ осуществления отказоустойчивости при внедрении динамической маршрутизации:

_images/resilience.png

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

11.5. Масштабирование

Для масштабирования решения возможна установка в сеть дополнительного сервера SkyDNS Zapret ISP.

Если Вы используете схему с динамической маршрутизацией - необходимо, чтобы все маршруты, получаемые с серверов фильтрации по OSPF имели одинаковую стоимость маршрута (Equal-cost multi-path routing - ECMP), иначе никакого смысла от дополнительных серверов не будет, так как трафик будет идти через один. По умолчанию протокол OSPF поддерживает до 4 альтернативных путей.

Диаграмма ниже демонстрирует способ осуществления отказоустойчивости при внедрении динамической маршрутизации:

_images/resilience.png

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

Настройка балансировки на маршрутизаторе является индивидуальной, согласно документации производителя Вашего маршрутизатора.

Если Вы используете схему со статической маршрутизацией, то для всех дополнительных серверов достаточно будет выполнить шаги, указанные здесь (см Статическая маршрутизация).

В настоящее время единый центр управления серверами отсутствует. Каждый сервер придётся настраивать и обслуживать отдельно. На каждом сервере необходимо будет установить одинаковый конфигурационный файл, продублировать Списки исключений и настроить OSPF (BGP) сессии.

11.6. Списки исключений

11.6.1. Типы списков

  • Черный список
    Список ресурсов, которые провайдер должен индивидуально блокировать по судебным решениям. Допустимые типы блокировок: URL, domain, IP-адрес. Изменения вступают в силу с задержкой порядка пяти минут.
  • Белый список
    Список ресурсов, которые провайдер исключает из блокировки. Исключение может быть произведено по: URL, domain, IP-адрес. Имеет более высокий приоритет, чем Черный список. Изменения вступают в силу с задержкой порядка пяти минут.

Важно

Если Вы добавляете домен в Белый список, то все IP-адреса, ассоциированные с ним, станут «белыми». Таким образом Вы можете противодействовать тем доменам, которые добавляют IP-адреса популярных сайтов к своим (IP-спуфинг).

Пример: yandex.ru разрешился в 77.88.8.8/32, этот IP-адрес исчезает из анонсов.

  • Серый список
    Список сетей. Данный список позволяет Вам перенаправлять весь трафик, идущий в заданные сети, на сервер фильтрации. Отличие от добавления IP-адреса в Черный список заключается в том, что трафик на IP-адреса из Черного списка блокируется на уровне iptables, не достигая ACL. Его приоритет выше Черного списка, но ниже Белого. Изменения вступают в силу с задержкой порядка пяти минут.

Подсказка

Если Вы хотите незамедлительного применения обновлений, воспользуйтесь командами: zi-ctl domain в случае добавление в список домена или URL,

zi-ctl route в случае добавление в список IP-адреса.

11.6.2. Редактирование

Через консоль: zi-ctl filter

Через WEB UI:

Раздел «Списки/(Черный|Белый|Серый) список» (Создание нового правила)

_images/filters.png

11.7. Продвинутая настройка Squid

Конфигурационный файл /etc/squid/squid.conf.

В случае, если Вы наблюдаете проблему излишней блокировки, используйте следующую информационную справку.

Принцип работы Squid: Squid осуществляет балансировку запросов по 2 воркерам каждый из которых форкает по 4 процесса zi_sni_check, которые используются для фильтрации https трафика по имени домена, и zi_url_check, которые используется для фильтрации http трафика.

За это отвечают данные строки конфига:

workers 2
external_acl_type zi_sni_check children-max=4 %ssl::>sni sudo -u skydns-zi zi-squid-acl SNI
external_acl_type zi_url_check children-max=4 %DST %PORT %PATH sudo -u skydns-zi zi-squid-acl URL

Измение параметра workers изменяет количество процессов Squid’а. Параметр children-max отвечает за количество подпроцессов, производящих фильтрацию.

Следует помнить, что каждый подпроцесс имеет свой кэш ответов. Необоснованное увеличение их количества может привести к истощению ресурсов машины, и, как результат, прекращения функционирования системы фильтрации в целом.

Параметры, помогающие решить проблему чрезмерной блокировки:

  • negative_ttl - определяет время, в течение которого будут храниться отрицательные ответы (блокировка доступа) от подпроцесса фильтрации (значение в секундах, по умолчанию 1 час).
  • cache - определяет размерность кэша одного подпроцесса (по умолчанию 262144).

Необходимо добавить эти параметры перед children-max

После любых изменений нужно перезапустить сервис:

service squid restart

и обязательно проверить корректность запуска в лог файле /var/log/squid/cache.log.

11.8. Squid и HTTPS

Для фильтрации HTTPS трафика Squid использует самоподписанный сертификат. По умолчанию вместе с пакетом поставляется самоподписанный сертификат.

/etc/squid/squidCA.pem - расположение самоподписанного сертификата.

Если Вам нужно заменить его на свой, то выполните следующие команды:

cp <YOUR_CERT> /etc/squid/squidCA.pem
chmod 400 /etc/squid/squidCA.pem
rm -rf /var/lib/squid_ssl_db
/usr/lib/squid/ssl_crtd -c -s /var/lib/squid_ssl_db
chown -R proxy:proxy /var/lib/squid_ssl_db
service squid restart

Важно

Ваш сертификат обязательно должен быть самоподписанным.

Подсказка

Чтобы создать самоподписанный сертификат, следуйте инструкции.

11.9. Агрегация маршрутов

SkyDNS Zapret ISP включает в себя функцию уменьшения количества анонсируемых маршрутов посредством сокращения длины префикса анонсируемой сети. По умолчанию данная функция включена (Конфигурационный файл ip_aggregator.enabled: true).

Сжатие происходит, когда количество маршрутов из сети превышает заданный барьер (Конфигурационный файл ip_aggregator.ip-barrier). Алгоритм учитывает адреса, находящиеся в белом списке.

Подсказка

Рассмотрим следующий пример: в анонсах присутствуют сети 1.1.1.2/32 и 1.1.1.3/32. Вы включаете функцию сжатия маршрутов, устанавливая ip_aggregator.ip-barrier: 1, после чего анонсируется лишь 1.1.1.0/24.

Предположим, Вы добавили в белый список адрес 1.1.1.135/32. В результате начнут анонсироваться следующие подсети: 1.1.1.0/25, 1.1.1.192/26, 1.1.1.160/27, 1.1.1.144/28, 1.1.1.136/29, 1.1.1.128/30, 1.1.1.132/31.

В результате агрегации на сервер фильтрации будет перенаправляться дополнительный трафик. Однако это не приведёт к его блокировке. Весь трафик, для которого нет правил фильтрации, будет пропущен дальше без изменений. Агрегация также повлечёт за собой увеличение нагрузки на сетевой интерфейс и процессор сервера, поэтому стоит внимательно подходить к выбору параметра ip_aggregator.ip-barrier. Значение по умолчанию - 120, было выбрано исходя из анализа маршрутов, находящихся в базе.

Важно

Чтобы изменения вступили в силу, необходима перезагрузка ExaBGP и zi-update. Для этого выполните команды:

supervisorctl stop zi-update
service exabgp restart
supervisorctl start zi-update

11.10. Правила iptables и ipset

SkyDNS Zapret ISP поставляет с собой набор базовых правил для обеспечения заворота трафика. Правила содержаться в отдельных файлах, соответствующих входному формату команд ip(6)tables-restore и ipset restore. Если Вы хотите применить свои собственные правила:

  • для iptables выполните cp /usr/share/skydns-zi/firewall.conf /etc/firewall.conf. После чего добавьте в файл /etc/firewall.conf ваши правила.
  • для ip6tables выполните cp /usr/share/skydns-zi/firewall6.conf /etc/firewall6.conf. После чего добавьте в файл /etc/firewall6.conf ваши правила.
  • для ipset добавьте правила в /etc/custom_ipsets.conf.

После этого выполните:

zi-ctl ipset update

11.11. Фильтрация по протоколу IPv6

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

Примечание

Обратитесь к разделу Фильтрация доступа к ресурсам в реестре по протоколу IPv6 прежде чем начать настройку.

Для включения фильтрации необходимо:

  • В конфигурационном файле добавить строчку: ipv6_support: true.
  • В файле /etc/quagga/daemons поменять ospf6d=no на ospf6d=yes.
  • Повторить Настройка маршрутизации (настроить OSPF для IPv6 в случае динамической маршрутизации, обновить скрипт выгрузки маршрутов в случае статической).
  • Добавить Ваш IPv6 префикс (Прием трафика), если Вы это не сделали при первоначальной настройке.
  • Выполните команду zi-ctl ipset update.

11.12. Настройка ipset’ов

Начиная с версии 3.2.5, SkyDNS Zapret ISP предоставляет возможность настроить параметры ipset’ов.

Настройка размера ipset’ов, а также допустимый размер хэша устанавливается с помощью блока ipset_config. После выставления новых значений, выполните:

zi-ctl ipset update --recreate