Установка ПО DosGate
Системные требования
- Версия Linux Kernel - 6.5
- Процессор Intel или AMD не менее 4 ядер
- Не менее 8GB RAM
- Свободная дисковая память от 10 ГБ
Дополнительная информация
- Рекомендованные технические характеристики платформы Досгейт
- Архитектура кластера
- Протестированные операционные системы
Инструкции по установке для Российских ОС
1. Компоненты платформы (ПО)
Архитектура платформы основана на операционной системе Linux, и состоит из следующих компонентов:
- DosGate Controller - программа, компилирующая указанный пользователем набор правил в машинный код
- DosGate - программа, содержащая в себе машинный код, которая компилируется и загружается в ядро Linux Kernel с помощью DoSGate Controller
- DosGate Daemon - система, отвечающая за сбор статистики и автоматизированный контроль, загружаемая в Linux Kernel программы DoSGate
1.2 Техническая схема взаимодействия компонентов платформы (ПО)
1.3 Модули системы и их взаимодействие в рамках системы при обработке пакета
1.4 Описание модулей системы
- ПО DoSGate имеет в себе функционал, реализованный модулями на разных частях платформы:
- Арена - набор сетевых интерфейсов, и применяемых к ним настроек (см. настройки dosgate.conf в п. 4)
- Routing Program - программа, определяющая в какой профиль должен быть направлен пакет
- Профиль - набор правил, вводимых администратором, которые применяются к пакету, проходящему через профиль
- Метка - специфичная таблица данных, в которую можно:
- По результату правила - занести информацию
- Занести информацию вручную (с помощью команд)
- Искать по метке и применять определенное действие (в случае, если данные из пакета присутствуют в метке)
- Префикс-сет - таблица данных IP-адресов (CIDR, масок), в которую можно:
- Занести информацию вручную (с помощью команд)
- Искать по префикс-сету и применять определенное действие (в случае, если 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:
ethtool -L eth1 combined 24
- https://www.spinics.net/lists/netdev/msg439438.html
- Если у вас 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
Статистика в пакетах