Добавление политики обработки трафика

Для добавления новой политики обработки трафика в систему 5А выполните следующие шаги:

  1. Откройте раздел Главная → Кластеры балансировки.

  2. Перейдите в кластер, в котором находится сервис, для которого будет добавлена новая политика.

  3. Откройте раздел Политики.

  4. Нажмите Добавить политику.

  5. Заполните форму Новая политика. Все поля, отмеченные звёздочкой, являются обязательными для заполнения.

    Пример заполнения формы "Новая политика"

    Пример заполнения формы "Новая политика"

    • Название — название для добавляемой политики, которое будет использоваться в системе 5А.

    • Протокол — сетевой протокол, на котором будет обработка трафика с помощью данной политики. Доступные варианты:

      • http,
      • https,
      • tcp.
    • Место помещения — параметр определяет, на каком этапе обработки трафика будет применяться выбранная политика — до или после взаимодействия с бэкенд-сервером. Доступные варианты зависят от выбранного протокола и позволяют точно контролировать, где именно происходят модификации данных.

      Протоколы HTTP/HTTPS:

      • Изменение данных на пути к серверу — политика применяется к HTTP-запросу, исходящему от клиента к бэкенду. Позволяет модифицировать заголовки запроса, URI, метод, тело перед отправкой на сервер.
      • Изменение заголовков ответа от сервера — политика применяется к HTTP-ответу, возвращаемому бэкендом клиенту. Позволяет изменять, удалять или добавлять HTTP-заголовки.
      • Изменение тела ответа от сервера — политика применяется к телу HTTP-ответа перед отправкой клиенту. Поддерживает поиск и замену текстовых шаблонов и манипуляции с контентом.

      Протокол TCP:

      • Изменение TCP-данных — политика применяется к данным TCP-потока между клиентом и сервером.
    • Описание — краткое описание назначения и особенностей политики.

    • Стратегия — способ комбинирования условий политики. Доступные варианты:

      • Первое совпадение — если хотя бы одно условие было соблюдено при анализе трафика (логическое "ИЛИ"), применяется обработка трафика (выполняются все действия политики в порядке их добавления);
      • Все совпадения — обработка трафика применяется, если все условия были соблюдены при анализе трафика (логическое "И").
    • Условия политики — набор требований к свойствам трафика, по которым проводится его анализ. Подробное описание условий и их параметров представлено ниже в разделе Справочник условий для правил политики.

      • НЕ — флажок инвертирует результат проверки условия. Флажок есть у каждого условия, но у условий, где отрицание не поддерживается, он отображается приглушённым и недоступен.
      • Группа — основной тип параметра проверки трафика. Для протокола TCP доступны группы: TCP Хост, Источник IP и TLS ClientHello (последняя — только для анализа начального TLS-сообщения без расшифровки).
      • Атрибут — уточняющий тип параметра проверки трафика. Набор атрибутов зависит от выбранной группы.
      • Значение — значение параметра, по которому производится проверка трафика.
      ℹ️

      Дополнительные условия добавляются нажатием на Добавить условие. Удаление условий выполняется нажатием на значок корзины справа от условия.

    • Действия политики — действие с трафиком, выполняемое при выполнении условий политики. Подробное описание действий и их параметров представлено ниже в разделе Справочник действий для правил политики.

      • Действие — основной тип выполняемого действия с трафиком. При использовании группы TLS ClientHello доступно только действие Перенаправление трафика.
      • Атрибут — уточняющий параметр для действия. Для Перенаправление трафика доступны: Хост (указание адреса) или Группа узлов (выбор группы серверов).
      • Параметры — значение параметра для выполняемого действия.
      ℹ️

      Дополнительные действия добавляются нажатием на Добавить действие. Удаление действий выполняется нажатием на значок корзины справа от действия.

      Важно: порядок выполнения действий будет от верхнего (первого) к нижнему (последнему).

  6. Нажмите Сохранить для добавления политику в систему 5А.

Справочник условий для правил

HTTP/HTTPS-политики

  • Выполнять всегда — указывается для безусловного выполнения действий политики.
  • HTTP Заголовок — проверка соответствия указанному HTTP-заголовку, дополнительных атрибутов нет.
  • HTTP Хост — проверка соответствия серверу HTTP-запроса. Доступные атрибуты:
    • Хост — соответствие по имени сервера;
    • Порт — соответствие по порту сервера;
    • Полная строка — соответствие по полному строковому заголовку сервера.
  • HTTP URI — проверка соответствия полному URI запроса или соответствие его частям. Доступные атрибуты:
    • Схема — соответствие схеме (например, https, ftp);
    • Хост — соответствие имени сервера в URI;
    • Параметр query — соответствие значению указанного параметра запроса из строки запроса;
    • Значение query — соответствие тексту, указанному в строке запроса;
    • Порт — соответствие номера порта в URI;
    • Расширение — соответствие расширению файла в URI (например, html);
    • Путь — соответствие пути в URI;
    • Сегмент пути — соответствие части пути URI по числовому индексу;
    • Полная строка — соответствие указанному полному строковому тексту.
  • HTTP User Agent — проверка соответствия на основе данных в заголовке User Agent. Доступные атрибуты:
    • Браузер — соответствие по имени или типу браузера из указанного списка;
    • Версия браузера — соответствие по версии браузера;
    • Тип устройства — соответствие по типу устройства из указанного списка.
  • HTTP метод — проверка соответствия используемому типу HTTP-метода.
  • Источник IP — проверка соответствия указанному IP-адресу.
  • Аутентификация — проверка по тому, кто вошёл: имя пользователя, группа, атрибут. Доступные атрибуты описаны в статье Аутентификация в политиках и сценариях.

TCP-политики

  • TCP Хост — проверка соответствия серверу TCP-запроса. Доступные атрибуты:

    • Хост назначения — соответствие по имени сервера;
    • Порт назначения — соответствие по порту сервера.
  • Источник IP — проверка соответствия адресу или подсети. Доступные атрибуты:

    • IP-адрес — соответствие IP-адресу;
    • Вхождение в подсеть — соответствие подсети, указывается в формате "xxx.xxx.xxx.xxx/xx".
  • TLS ClientHello — группа предназначена для анализа начального TLS-сообщения клиента ClientHello без расшифровки полезного трафика. На основании набора шифров, заявленных клиентом, можно определить наличие ГОСТ-шифров и перенаправить такой трафик на отдельную группу серверов или устройство дешифрации, например NGate.

    ⚠️

    Ограничения для условий группы TLS ClientHello:

    • Условие доступно только для политик с протоколом TCP.
    • В рамках одного правила может быть добавлено только одно условие из группы TLS ClientHello.
    • Для правил, содержащих условие TLS ClientHello, доступно только одно действие — «Перенаправление трафика».
    • Отрицание условия (НЕ) не поддерживается.

    Доступные атрибуты:

    • Cipher suites: ГОСТ - атрибут для обнаружения трафика, в котором клиент в ClientHello предлагает ГОСТ-шифры (коды 0xC100…0xC106). При выборе этого атрибута поле Значение автоматически устанавливается в ГОСТ и не редактируется. Если условие срабатывает, трафик считается ГОСТ-трафиком и может быть перенаправлен на отдельный backend.

      Пример выбора атрибута "Cipher suites: ГОСТ"

      Пример выбора атрибута "Cipher suites: ГОСТ"

    • Cipher suites: список - атрибут для ручного задания произвольного набора cipher suites. В поле Значение укажите список шестнадцатеричных кодов шифров через запятую, например: 0xC100, 0xC101, 0xC102. Условие считается выполненным, если в ClientHello клиента присутствует хотя бы один шифр из указанного списка.

      Пример заполнения атрибута "Cipher suites: список"

      Пример заполнения атрибута "Cipher suites: список"

Справочник действий для правил

HTTP/HTTPS-политики

  • Редирект — действие по перенаправлению соединения. Доступные атрибуты:

    • Полный редирект — перенаправление на указанный URL.
    • Замена схемы — выполнение замены протокола вида HTTP->HTTPS или HTTP->HTTP с изменением используемого порта.
    • Замена части URL — перенаправление на новый URL, который получается путем подстановки указанных замен в изначальном URL.
  • Замена — действие по замене HTTP-заголовка в запросе или ответе. Доступные атрибуты:

    • Заголовок — замена HTTP-заголовка в запросе;
    • HTTP Host — замена заголовка HTTP Host в запросе;
    • HTTP Referer — замена заголовка HTTP Referer в запросе;
    • HTTP URI — замена HTTP URI, пути или строки в запросе.
  • Добавление — действие по добавлению HTTP-заголовка из запроса или ответа. Доступные атрибуты:

    • Заголовок — добавление HTTP-заголовка в запрос или ответ;
    • HTTP Cookie — добавление заголовка HTTP Cookie в ответ;
    • HTTP Referer — добавление заголовка HTTP Referer в запрос;
    • HTTP Set Cookie — добавление заголовка HTTP Set Cookie в ответ.
  • Удаление — действие по удалению HTTP-заголовка из запроса или ответа. Доступные атрибуты:

    • Заголовок — удаление HTTP-заголовка из запроса или ответа;
    • HTTP Cookie — удаление заголовка HTTP Cookie из ответа;
    • HTTP Referer — удаление заголовка HTTP Referer из запроса;
    • HTTP Set Cookie — удаление заголовка HTTP Set Cookie из ответа.
  • Перенаправление трафика (forwarding) — действие по перенаправлению трафика на указанный URL. Доступные атрибуты:

    • Хост — перенаправление на указанный URL (например, https://example.com).
  • Перенаправление на группу — действие по перенаправлению трафика на заранее заданную группу серверов. Доступные атрибуты:

    • Группа серверов — выбор группы из выпадающего списка групп, созданных в кластере. Запрос направляется на пул серверов этой группы.
  • Установка повторного шифрования — действие, включающее или отключающее TLS-шифрование между балансировщиком и бэкендом. Доступные атрибуты:

    • Включить — при установке флажка (чекбокса) соединение до бэкенда будет шифроваться (re-encrypt), при снятии — нет. В интерфейсе поле представлено в виде галочки.
    Пример заполнения "Повторное шифрование"

    Пример заполнения "Повторное шифрование"

  • Установка SSL имени — действие, задающее SNI (Server Name Indication) для TLS-соединения с бэкендом. Доступные атрибуты:

    • Имя — доменное имя, которое будет использовано в SNI и для проверки сертификата бэкенда.
  • Логирование — действие по записи сообщения в лог-файл. В качестве атрибута указывается уровень критичности сообщения.

    • Сообщение — запись указанного текста сообщения в лог-файл.
  • Аутентификация — требование входа выбранным профилем аутентификации. Доступные атрибуты описаны в статье Аутентификация в политиках и сценариях.

    • Системная переменная — дополнительно в тексте сообщения будет отображено значение выбранной переменной на момент записи.
  • Заблокировать — блокировка трафика на ресурс.

  • Кастомная страничка — отправка клиенту кастомной HTML-страницы. Доступные атрибуты:

    • Простой HTML — в качестве параметра передается исходный код простой HTML-страницы.

      ⚠️

      Важно: код страницы не должен содержать работу с внешними ресурсами, такими как импорты, работу с файлами и т.п. Пример допустимой страницы представлен ниже в разделе Дополнительные материалы.

    • Из файла — в качестве параметра передается полное имя файла (с расширением), который должен быть размещён на балансировщике в папке /etc/nginx/html/. В файле должна находится HTML-страница в формате строки BASE64, причем все вложенные структуры (изображения, стили и т.д.) должны быть тоже в формате BASE64.

      ℹ️

      Для подготовки файла используйте скрипт, представленный ниже в разделе Дополнительные материалы.

  • Обновление заголовка — изменение данных в HTTP-заголовке ответа, отправляемого сервером. Действие доступно при указании значения "Изменение заголовков ответа от сервера" в параметре Место помещения.

  • Обновление тела ответа — изменение данных в HTTP-теле ответа, отправляемого сервером. Действие доступно при указании значения "Изменение тела ответа от сервера" в параметре Место помещения.

TCP-политики

  • Перенаправление трафика — действие перенаправляет TCP-соединение на указанный backend. Доступные атрибуты:

    • Хост — адрес сервера (например, 10.0.0.5:8080);
    • Группа узлов — выбор группы серверов из выпадающего списка.
  • Сброс соединения — принудительный сброс TCP-соединения. Доступные атрибуты:

    • По причине - в качестве Параметра указывается текст, который будет выводиться в логах при сбросе.
  • SSL — действие задаёт SNI (Server Name Indication) для TLS-соединения с бэкендом. Доступные атрибуты:

    • SNI к бэкенду — доменное имя, которое будет использовано в SNI.

Дополнительные материалы

Для подготовки статического контента, который должен быть использован в рамках действия "Кастомная страничка" с параметром "Из файла", используйте приведённый ниже скрипт на Python. Скрипт рекурсивно обходит директорию web/, собирает все файлы (включая HTML, изображения и другие ресурсы) и создаёт итоговый файл data.txt, который должен быть размещён на балансировщике в директории /etc/nginx/html/.

Пример структуры директории web/:

web/
├── index.html
├── main.css
├── logo.png
└── banner.jpg

Скрипт:

import os
import base64
import mimetypes
import re
from bs4 import BeautifulSoup
from PIL import Image
import io
import json
 
def optimize_image(image_path):
   """Сжимает картинку в WebP и возвращает bytes"""
   img = Image.open(image_path)
   buf = io.BytesIO()
   img.save(buf, format="WEBP", quality=70)  # качество 70%
   return buf.getvalue(), "image/webp"
 
def file_to_data_uri(file_path):
   try:
       data, mime_type = optimize_image(file_path)
   except Exception:
       # fallback: если не удалось в WebP — читаем как есть
       with open(file_path, "rb") as f:
           data = f.read()
       mime_type, _ = mimetypes.guess_type(file_path)
       if mime_type is None:
           mime_type = "application/octet-stream"
   encoded = base64.b64encode(data).decode("utf-8")
   return f"data:{mime_type};base64,{encoded}"
 
def replace_urls(css_text, folder_path):
   def repl(match):
       url = match.group(1).strip('"\'')
       img_path = os.path.join(folder_path, url)
       if os.path.isfile(img_path):
           return f'url("{file_to_data_uri(img_path)}")'
       else:
           print(f"⚠️ Файл {url} не найден, пропускаю")
           return match.group(0)
   return re.sub(r'url\(([^)]+)\)', repl, css_text)
 
def convert_html(folder_path):
   html_path = os.path.join(folder_path, "index.html")
 
   with open(html_path, "r", encoding="utf-8") as f:
       soup = BeautifulSoup(f, "html.parser")
 
   # <img src="...">
   for img in soup.find_all("img"):
       src = img.get("src")
       if not src:
           continue
       img_path = os.path.join(folder_path, src)
       if not os.path.isfile(img_path):
           continue
       img["src"] = file_to_data_uri(img_path)
 
   # CSS url(...)
   for style in soup.find_all("style"):
       if style.string:
           style.string = replace_urls(style.string, folder_path)
 
   for tag in soup.find_all(style=True):
       tag["style"] = replace_urls(tag["style"], folder_path)
 
   # Минимизируем HTML: убираем лишние пробелы и переносы
   final_html = " ".join(str(soup).split())
 
 
   encoded_html = base64.b64encode(final_html.encode("utf-8")).decode("utf-8")
 
   # Сохраняем в data.txt
   with open("data.txt", "w", encoding="utf-8") as f:
       f.write(encoded_html)
 
   print(f"✅ Готово! Файл сохранён")
 
if __name__ == "__main__":
   convert_html("web")

Пример простой HTML-страницы для действия "Кастомная страничка" с параметром "Простой HTML":

<html lang="ru">
 <head>
   <meta charset="UTF-8">
   <title>Ошибка 405</title>
   <style>
     body {
       margin: 0;
       display: flex;
       justify-content: center;
       align-items: center;
       height: 100vh;
       background: linear-gradient(teal, navy);
       color: #ffffffff;
       font-family: sans-serif;
       text-align: center;
     }
 
     h1 {
       font-size: 4em;
       margin: 0;
     }
 
     p {
       font-size: 1.2em;
       margin: 0.5em 0;
     }
 
     .emoji {
       font-size: 5em;
       margin-bottom: 0.3em;
     }
   </style>
 </head>
 <body>
   <div>
     <div class="emoji"> ⛔️ </div>
     <h1>405</h1>
     <p>Метод GET запрещён</p>
   </div>
 </body>
</html>