Установка ПО DosGate

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

  • Версия Linux Kernel - 6.5
  • Процессор 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 Установка обновлений ОС

apt update
apt upgrade

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

Добавьте ключ

sudo wget --http-user=[ваш логин] --http-password=[ваш пароль] -O - https://public-repo.svcp.io/keyFile | sudo apt-key add -

Добавьте репозиторий

sudo nano /etc/apt/sources.list.d/servicepiperepo.list

# Содержимое:

deb [arch=amd64] https://[ваш логин]:[ваш пароль]@public-repo.svcp.io/ubuntu/ xenial contrib

Проверьте что репозиторий доступен

sudo apt update

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

  • Сетевые интерфейсы должны быть настроены согласно "ifupdown"
  • При использовании сетевых карт Intel с драйвером ixgbe рекомендуется ограничить кол-во потоков до 24:
  • Если у вас Mellanox, в настройках аппаратных интерфейсов, на которых будет работать DoSGate, рекомендуется указать настройку "tune_xdp = 1"
    • tune_xdp = 1 в файл /etc/network/interfaces
  • Требуется убрать настройки интерфейсов, которые управляются "ifupdown", из профиля netplan (файл может находиться по адресу: /etc/netplan/00-installer-config.yaml)
  • Добавить DNS-сервер в настройку systemd-resolved (файл может находиться по адресу: /etc/systemd/resolved.conf). Этот шаг можно пропустить, если интерфейс управления будет настраиваться через netplan (т.к. настройки DNS выполнит netplan)
  • Добавить NTP-сервер, если стандартные NTP-серверы недоступны из-за политики безопасности (файл может находиться по адресу: /etc/systemd/timesyncd.conf

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

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

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

  • Требуется скачать на сервер все пакеты dosgate. Версии передаются вендором, или вы можете использовать последние.

  • Выполнить команды:
    sudo apt install libdt1=1.2.4-1 libaevent1=0.2.0-3

    sudo apt install dosgate=3.5.0-2

  • Если есть неудовлетворённые зависимости, то требуется их установить и закончить установку с помощью команды: apt -f install

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

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

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

  • Используя команду: dosgate -o -l err
  • Требуется для проверки того, что dosgate запустился без каких-либо ошибок. Детали запуска можно посмотреть в логах запуска сервиса (systemctl status 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
sudo nano /etc/systemd/system/dosgate.service 
или 
sudo nano /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 apt install collectd=5.12.0-10ubuntu0.1

5.1.1 Настройка collectd

Файл /etc/collectd/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/collectd.conf.d">
        Filter "*.conf"
</Include>

Файл /etc/collectd/collectd.conf.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/collectd.conf.d/dosgate-types.db"

Файл /etc/collectd/collectd.conf.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

5.2.1 Установка Docker

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER

** Проверить что установка успешна **

docker version
systemctl status docker

5.2.3 Установка контейнера Graphite

sudo mkdir -p /data/graphite/{data,logs,conf,statsd_config}

5.2.4 Добавление Graphite в systemd

sudo nano /etc/systemd/system/graphite-docker.service

# Содержание должно соответствовать:

[Unit]
Description=Graphite Docker Container
Documentation=https://github.com/graphite-project/docker-graphite-statsd
After=docker.service
Requires=docker.service

[Service]
Type=simple
TimeoutStartSec=0
Restart=on-failure
RestartSec=30s
ExecStartPre=-/usr/bin/docker kill graphite
ExecStartPre=-/usr/bin/docker rm graphite
ExecStartPre=/usr/bin/docker pull graphiteapp/graphite-statsd
ExecStart=/usr/bin/docker run \
            --name graphite \
            --restart=always \
            -p 8080:80 \
            -p 2003-2004:2003-2004 \
            -p 2023-2024:2023-2024 \
            -p 8125:8125/udp \
            -p 8126:8126 \
            -v /data/graphite/data:/opt/graphite/storage \
            -v /data/graphite/conf:/opt/graphite/conf \
            -v /data/graphite/statsd_config:/opt/statsd/config \
            -v /data/graphite/logs:/var/log \
            graphiteapp/graphite-statsd

SyslogIdentifier=graphite
ExecStop=/usr/bin/docker stop graphite

[Install]
WantedBy=multi-user.target

5.2.5 Запуск Graphite

systemctl daemon-reload
systemctl enable graphite-docker
systemctl start graphite-docker.service

** Проверяем что сервис активен и запущен без ошибок **

systemctl status graphite-docker.service

5.2.6 Настройка Graphite

Рекомендовано: установить диапазон хранения Graphite в 10 секунд вместо 1 минуты (стандартное значение после установки) для более точной статистики

sudo nano /data/graphite/conf/storage-schemas.conf

** Добавляем в начало файла storage-schemas.conf до других аналогичных записей **

[default]
pattern = .*
retentions = 10s:14d,60s:365d

** Перезапускаем Graphite и удаляем папку dosgate с старыми данными **

sudo systemctl stop graphite-docker
sudo rm -rf /data/graphite/data/whisper/dosgate

** Запускаем Graphite **

sudo systemctl start graphite-docker

5.3 Формат хранения данных в Graphite

dosgate имеет следующую вложенность при хранении данных в Graphite

hostname.arena|profile.stats.bytes|packets

hostname

Задается в dosgate.conf вместе с таймером отправки данных в collectd

arena

Задается в dosgate.conf, название арены – списка сетевых интерфейсов и правил маршрутизации к ним относящихся

profile

Профиль защиты, который создается администратором системы, и трафик, который им обрабатывается (сбрасывается, пропускается, ...)

stats

Действие которое происходит с трафиком. drop,accept,pass,reply,error,-j STATS name.

drop - трафик сброшен как результат правила (-j DROP)

accept - трафик не был сброшен и отправлен согласно настройкам dosgate.conf

pass - трафик передан в операционную систему как результат правила (-j PASS)

reply - досгейт ответил на пакет вместо конечного получателя, используется, например, при TCP авторизации, когда досгейт проверяет IP отправителя на IP-spoofing и отправляет ему TCP пакет с RST флагом или неверным Sequence

error - пакет не был обработан системой, потому что не соответствует IP RFC или досгейт не смог его разобрать (сломанный пакет)

-j STATS name - статистика указанной метки. Указывается по желанию администратором при создании правила, позволяет посмотреть статистику конкретного правила (например, правило -m protocol udp -j STATS udp_packets -j DROP сбрасывает все пакеты протокола UDP, а также создает отдельную статистику всех пакетов и байт по конкретно этому правилу)

bytes

Статистика в байтах (для получения бит, нужно умножить в 8 раз)

packets

Статистика в пакетах

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

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