Установка ПО DosGate на РЕД ОС 7.3

Системные требования

  • Версия Linux Kernel не менее 5.10
  • Процессор Intel или AMD не менее 4 ядер
  • Не менее 8GB RAM
  • Свободная дисковая память от 10 ГБ

Дополнительная информация

1. Компоненты платформы (ПО)

Архитектура платформы основана на операционной системе Linux, и состоит из следующих компонентов:

  1. DosGate Controller - программа, компилирующая указанный пользователем набор правил в машинный код
  2. DosGate - программа, содержащая в себе машинный код, которая компилируется и загружается в ядро Linux Kernel с помощью DoSGate Controller
  3. DosGate Daemon - система, отвечающая за сбор статистики и автоматизированный контроль, загружаемая в Linux Kernel программы DoSGate

1.2 Техническая схема взаимодействия компонентов платформы (ПО)

1.3 Модули системы и их взаимодействие в рамках системы при обработке пакета

1.4 Описание модулей системы

  • ПО DoSGate имеет в себе функционал, реализованный модулями на разных частях платформы:
  • Арена - набор сетевых интерфейсов, и применяемых к ним настроек (см. настройки dosgate.conf в п. 4)
  • Routing Program - программа, определяющая в какой профиль должен быть направлен пакет
  • Профиль - набор правил, вводимых администратором, которые применяются к пакету, проходящему через профиль
  • Метка - специфичная таблица данных, в которую можно:
    1. По результату правила - занести информацию
    2. Занести информацию вручную (с помощью команд)
    3. Искать по метке и применять определенное действие (в случае, если данные из пакета присутствуют в метке)
  • Префикс-сет - таблица данных IP-адресов (CIDR, масок), в которую можно:
    1. Занести информацию вручную (с помощью команд)
    2. Искать по префикс-сету и применять определенное действие (в случае, если IP-адрес отправителя или получателя, присутствует в префикс-сете)

2. Подготовка аппартной платформы

2.1 Установка обновлений ОС

sudo dnf update
sudo dnf upgrade

2.2 Подключение репозитория Servicepipe

** Команду необходимо выполнять от пользователя с правами sudo*

curl -o "./setup-repo.sh" "https://public-repo.svcp.io/setup_script/setup-repo.sh" && \
    sudo chmod +x "./setup-repo.sh" && \
    sudo ./setup-repo.sh

2.3 Настройка сетевых интерфейсов

  • При использовании сетевых карт Intel с драйвером ixgbe рекомендуется ограничить кол-во потоков до 24:
  • Если у вас Mellanox, в настройках аппаратных интерфейсов, на которых будет работать DoSGate, рекомендуется произвести настройку XDP

2.4 Перезагрузка сервера

  • Требуется совершить перезагрузку ОС, чтобы убедиться что все сетевые интерфейсы настроены корректно

2.5 Установка пакетов, необходимых для работы ПО DosGate

sudo dnf update && sudo dnf install -y clang glibc glibc-devel.i686 libbpf-0.5.0-1.el8 libbpf-0.5.0-1.el8 libbpf-devel-0.5.0-1.el8.x86_64

3. Установка DoSGate

sudo dnf install -y libdt-1.2.0.1-1.el7 libaevent-0.1.1.3-1.el7 dosgate-3.2.3.1-1.el7

3.1 Настройка конфигурационных файлов

  • Досгейт имеет единый конфигурационный файл: /etc/dosgate.conf
  • Он вызывается при каждом запуске ПО и требует настройки
  • Его необходимо сконфигурировать до проверки однократного запуска
  • Подробнее, о его настройке - можно прочитать в п.4

3.2 Однократный запуск DoSGate

  • Используя команду: dosgate -o -l err
  • Требуется для проверки того, что dosgate запустился без каких-либо ошибок

3.3 Настройка модуля collectd

  • В dosgate.conf, согласно документации, требуется указать hostname, на который dosgate будет отправлять статистику (collectd hostname)
  • Рекомендованный плагин для связки с Graphite: write_graphite
  • Настройки модуля collectd осуществляются в рамках самого модуля collectd
  • Подробная настройка collectd и систем визуализации находится в п.5

3.4 Запуск DoSGate

Измените строку ExecStart=dosgate -f на ExecStart=dosgate -f -l crit

sed -i 's/dosgate -f/dosgate -f -l crit/' /usr/lib/systemd/system/dosgate.service
# Примените изменения
systemctl daemon-reload

# Запустите dosgate
systemctl start dosgate

# Если требуется, активируйте автоматический запуск сервиса Досгейт после перезапуска ОС
systemctl enable dosgate

4. Настройка dosgate.conf

  • Для доступа к командам управления производится аутентификация по SSH.
  • Все функции ПО используются за счет взаимодействия с командой: dgctl

4.1 Основной конфигурационный файл dosgate.conf

Файл настройки по умолчанию расположен в /etc/dosgate.conf Файл написан в формате YAML и содержит следующие блоки:

socket_conf
arena_conf
collectd

Для валидации корректности синтаксиса YAML, можно, например, использовать сайт https://www.yamllint.com

4.1.1 Блок socket_conf

  • Блок socket_conf имеет значения по умолчанию сразу после установки пакета. Он настроен для использования и работы с CLI
Пример конфигурации блока
sockets:

url: /run/dosgate/api.socket
user: nowhere
group: www-data
mode: 0660
acl: any
type: SCGI

url: /run/dosgate/fapi.socket
user: nowhere
group: www-data
mode: 0660
acl: any
type: FCGI
timeout:
send: 10
idle: 10

url: /run/dosgate/crlf.socket
user: nowhere:www-data
mode: 0660
acl: any
type: CRLF
timeout:
idle: 10
send: 10

url: /run/dosgate/cli.socket
user: root:dosgate
mode: 0660
acl: any
type: CLI
timeout:
idle: 10
send: 10
Описание блока socket_conf
  • URL
  • User
  • Group
  • Mode
  • ACL
  • Type
  • Timeout
Синтаксис URL, и значение полей

URL в формате family://address, где family - одно из значений family сокета:

  • unix - UNIX сокет на файловой системе сервера. В качестве адреса указывается полный путь
  • tcp - TCP сокет. В качестве адреса указывается строка host:port, или :port. В последнем случае будет прослушиваться адрес 0.0.0.0 (::)

Если URL представляет собой строку без family, то она предполагается из формата, а сама строка используется в качестве адреса:

  • Если строка начинается на '/', то подразумевается family = unix
  • Если строка содержит ":", то подразумевается family = tcp
User

user: user

  • Имя пользователя. Если пользователь не существует, то используется пользователь, от имени которого выполняется процесс (root). Актуально только для сокетов UNIX.
Group

group: group

  • Группа. Если группа не существует, то используется первичная группа пользователя, от имени которого выполняется процесс (root). Актуально только для сокетов UNIX.
Mode

Mode: mode

  • Режим доступа, (см. chmod). Актуально только для сокетов UNIX
ACL

acl: acl

  • Список контроля доступа. Перечисленные через запятую разрешенные target (см. CLI и API) или "any"
  • target - список частей системы, куда есть доступ, например: profile, router, arena, mark, pset, и др.
Type

type: type

Тип протокола/диалекта для сокета:

  • FCGI - FastCGI протокол, полный диалект
  • SCGI - SCGI протокол, полный диалект
  • CRLF - raw протокол, полный диалект
  • CLI - raw протокол, диалект CLI

RAW - протокол предполагает, что запрос оканчивается или последовательностью CRLF, или закрытием сокета в направлении сервера. Ответ так же оканчивается CRLF или окончательным закрытием сокета

Для того чтобы CLI мог посылать запросы, должен присутствовать хотя бы один сокет CLI с family UNIX и адресом "/run/dosgate/cli.socket"

Timeout

timeout:

idle: idle

send: send

  • Указываются в секундах. При отсутствии настройки - таймаута нет
  • Таймаут указывается на ответ dosgate на выполненную команду

4.1.2 Блок arena_conf

  • Данный блок не имеет значений по умолчанию. Его обязательно настраивать
  • Пример с VLAN swap и возвратом в том-же интерфейсе (outline): https://pastebin.com/raw/1DUh7azB
  • Пример inline инсталляции с возвратом трафика в др. интерфейсе, и обратным трафиком через Досгейт: https://pastebin.com/raw/s74cbjCJ
  • Пример inline инсталляции с возвратом трафика в др. интерфейсе, и обратным трафиком через Досгейт с LACP: https://pastebin.com/raw/RaGtsEjA
Синтаксис, и значение полей
Arenas
  • Набор сетевых интерфейсов и настроек обработки и возврата трафика
name (arena)
  • Уникальное имя арены
ID
  • Уникальный ID арены (обязателен с 3.2.2-5)
Name (nets)
  • Имя сетевого интерфейса, как показывает ip link. Обязательное поле
VID
  • VLAN id. Число от 0 до 4095. 0 означает отсутствие тега
Protocol
  • Протокол VLAN. Либо hex-число в формате 0x0000, либо мнемоническое значение:
Тэг Значение
802.1q, 8021q, q 0x8100
802.1ad, 8021ad, ad 0x88A8
802.1ah, 8021ah, ah 0x88E7
q-in-q, qq, qinq 0x9100
q-in-q1, qq2, qinq2 0x9200
q-in-q3, qq3, qinq3 0x9300
MAC
  • MAC-адрес в одной из форм:

xx:xx:xx:xx:xx:xx

xx-xx-xx-xx-xx-xx

xxxx.xxxx.xxxx

  • Где x - шестнадцатеричная цифра
RX block
  • Блок, описывающий способ обработки входящего трафика. Должен присутствовать всегда

mode: rx_mode

swap: swap

inline: inline

  • Если в блоке указан MAC-адрес, то обрабатывается только трафик с этим destination address
RX mode

Режим обработки входящего трафика:

  • vlan - обрабатывается только трафик в указанном VLAN, остальной пропускается в ОС. Если VID = 0 или не указан, обрабатывается только нетегированный трафик
  • transparent - обрабатывается трафик во всех VLAN + нетегированный. Используется по умолчанию
Swap
  • Указывает, нужно ли менять MAC-адреса во фрейме при отправке. Если указано false или 0, то адреса не меняются. В противном случае (если значение не указано) - они меняются местами
Inline
  • Интерфейс работает в inline-режиме, то есть он невидим для других хостов в сети. ARP-запросы, широковещательные запросы, STP/GVRP/etc не передаются в ОС. Если опция не указана, то интерфейс пересылает этот трафик в ОС
TX block
  • Описывает политику обработки трафика, который должен быть переслан в соответствии с окончанием обработки правилами или срабатывании действия ACCEPT. Если не указан, то копируется из блока RX, а отсутствующие в нём параметры принимают значения по умолчанию.

mode: rx_mode

cos: cos

  • Если в блоке указан MAC-адрес, то трафик пересылается на него. В противном случае он отправляется на тот адрес, с которого был получен
Mode

Режим обработки исходящего трафика:

  • swap - меняется последний в стеке тег VLAN, или добавляется если трафик нетегированный. Если VID отсутствует, то пакет не меняется, если равен 0, то верхний тег снимается при наличии. Используется по умолчанию
  • push - новый тег добавляется безусловно, даже если последний был точно таким же. Если VID = 0 или отсутствует, то ничего не добавляется.
CoS
  • Класс сервиса в тегированных пакетах. Число от 0 до 7
TX-policy

Параметр "tx-policy" в разделе конфигурации "rx:" управляет обработкой следующих классов трафика:

  • lacp — медленный протокол LACP
  • llm — IEEE802.1 Link-local multicast, предназначенная для 01:80:C2:00:00:x
  • multicast - Любой L2 multicast, кроме link-local
  • unknown - unhandled ethertypes

Например, если параметр LACP отсутствует, то LACP будет передан в ОС Досгейта, а не в TX-интерфейс.

4.1.3 Блок collectd

hostname: msk-dl-srv2.dosgate
period: 10
  • В dosgate.conf указывается частота записи метрик в collectd — period и имя хоста, который будет использоваться для именования метрик (hostname)

4.1.4 Reply block

  • Описывает политику обработки трафика, который должен быть переслан в соответствии с правилами, которые генерируют собственный трафик в ответ на входящий пакет
  • Если не указан, то копируется из блока TX. Формат полностью соответствует формату блока TX

5. Настройка инструментов визуализации

** Включает 2 этапа: **

Установка и конфигурация collectd для сбора аналитики;

Установка и конфигурация локального Graphite или подключение внешнего Graphite в collectd;

5.1 Установка collectd

Установка пакета через APT для Ubuntu 22.04:

sudo dnf install -y collectd-5.12.0-1.el7

5.1.1 Настройка collectd

Файл /etc/collectd.conf должен содержать только эту информацию:

FQDNLookup true
TypesDB "/usr/share/collectd/types.db"

LoadPlugin logfile
LoadPlugin syslog

<Plugin logfile>
        LogLevel "info"
        File STDOUT
        Timestamp true
        PrintSeverity false
</Plugin>

<Plugin syslog>
        LogLevel info
</Plugin>

<Include "/etc/collectd.d">
        Filter "*.conf"
</Include>

Файл /etc/collectd.d/dosgate.conf должен содержать только эту информацию:

LoadPlugin write_graphite
<Plugin write_graphite>
        <Node "localhost"> 
                Host "127.0.0.1" ## Заменяется на адрес внешнего Graphite при необходимости
                Port "2003"
                Protocol "tcp"
        </Node>
</Plugin>

LoadPlugin unixsock
<Plugin unixsock>
        SocketFile "/var/run/collectd-unixsock"
        SocketPerms "0660"
        DeleteSocket false
</Plugin>

TypesDB "/etc/collectd.d/dosgate-types.db"

Файл /etc/collectd.d/dosgate-types.db должен содержать только эту информацию:

dgstats         packets:COUNTER:0:U     bytes:COUNTER:0:U

5.1.2 Запуск collectd

sudo systemctl restart collectd
systemctl status collectd # Убедиться что всё запустилось
systemctl enable collectd

5.1.3 Добавление collectd в /etc/dosgate.conf

collectd:
  hostname: dosgate # Если вы устанавливаете DosGate в кластере, название должно быть уникально для платформы
  period: 10

5.1.4 Перезапуск dosgate, проверка записи метрик

sudo systemctl restart dosgate
sudo systemctl status dosgate
# В логе должно появиться сообщение "[dg_collectd_sender.c:70, GLOB] Collectd send success"

5.2 Установка Graphite

Установка стека Graphite не тестировалась на РЕД ОС Linux, рекомендуемая установка - на отдельном сервере на базе Ubuntu

Пункт 5.2 инструкции по установке DosGate

6. Установка и настройка веб-интерфейса

Инструкция по установке веб-интерфейса