Добрый день! Меня зовут Михолап Константин. Работаю в небольшом операторе связи инженером, а вот в каком уже поймете по AS и страничке в PeeringDB.
В 2025-ом году никого уже не удивить наличием возможности визуализировать входящий трафик для разного рода ISP или ЦОД, поэтому возможно Вы уже слышали что-то про Akvorado.
В рамках этой статьи познакомимся с адаптацией такого программного комплекса инструмента Akvorado. И так, Akvorado - это Netflow-коллектор с функциями визуализации собираемого трафика. К публике он вышел в 2022 году, о нем много кто слышал, я уверен. Были разные материалы например в linkmeup. Очень прост для установки, развертывания и возможно даже обслуживания (если вы чуть-чуть знаете Сlickhouse).


Главные достоинства изображены на скриншоте, примеры использования, но мы углубимся немного в сложности, применения в суровом русском провайдере. О том, что такое полоса предоплаты и бёрст думаю говорить не стоит.
Нюансы развертывания
Необходимо было адаптировать представленный продукт в сеть оператора, для того чтобы собирать данные о трафике от поставщиков, поэтому в конфиг файле akvorado.yaml зададим заготовленный перечень своих автономных систем.
clickhouse:
asns:
31257: Orion Telecom Krk
Далее, чтобы наши данные влезли, пришлось поработать с докером, чтобы использовать свою директорию для контейнеров и данных. Для этого использовал настройку, которую задают в файле /etc/docker/daemon.json
{
"data-root": "/mnt/disk/akvorado/data"
}
Переходим к файлу inlet.yaml, чтобы отредактировать настройки SNMP, Exporter Classifiers, Interface Classifiers. Можно использовать дефолтный конфиг и адаптировать его под свои нужды. Если у Вас несколько городов очень удобно классифицировать трафик по Exporter.Name и сразу метить его регионом принадлежности.
metadata:
workers: 10
provider:
type: snmp
communities:
::/0: public
core:
default-sampling-rate: 1000
workers: 6
exporter-classifiers:
- ClassifySiteRegex(Exporter.Name, "^([^-]+)-", "$1")
- Exporter.Name endsWith ".KRK" && ClassifyRegion("krk")
- ClassifyTenant("orion")
- ClassifyRole("clients")
interface-classifiers:
- |
ClassifyConnectivityRegex(Interface.Description, "^(<<|##) (?i)(upstream|transit|peering|pni|ppni|ix):? ", "$2") &&
ClassifyProviderRegex(Interface.Description, "^(<<|##) (?i)(upstream|transit|peering|pni|ppni|ix):? (\\S+)", "$3") &&
ClassifyExternal()
- ClassifyInternal()
Пару слов про импорт сетей, бывает такая потребность если сетей очень много, а их хочется как-то классифицировать, то можно использовать YAML include. Создадим заранее файл network.yaml куда поместим одну сеть для классификации.
109.226.247.0/24:
name: white-zlgk-clients
role: clients
site: white-zlgk
region: zlgk
tenant: orion
Чтобы импорт заработал из файла, нам необходимо вернуться в akvorado.yaml и отредактировать его.
clickhouse:
networks:
!include "network.yaml"
Суровые реалии российского мелкого провайдеринга будут отображены ниже.

Так вот, куча поставщиков, у многих лучшая или худшая связность. Хуже все то, что этим трафиком нужно управлять, потом чувствуешь себя героем мема с Заком Галифианакисом.

Конечно приходится отталкиваться от ширины канала и использовать в лучшем случае BGP Community от магистрального провайдера (например в ещё более лучшем случае использовать BGP Community на Local Preference от той AS откуда идет трафик), в худшем случае использовать самые топорные атрибуты например AS Path...
Или другой мем

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

Рассмотрим второй кейс отслеживания внутреннего трафика, когда L3-агрегация стоит за другой L3-агрегацией. Отсюда нужно учитывать к эксплуатации емкость двух агрегацией и делить трафик одной агрегации от другой.

Более детальный кейс L3-агрегации за L3-агрегацией

Выводы
Более чем уверен, что большинство из читающих использовали Akvorado по своим нуждам и адаптациям под свою сеть будь то операторы связи или же крупные ЦОД. В рамках статьи постарался показать обычные кейсы только для входящего трафика для тех кто ещё не знаком с этим инструментом. Если вы крупный магистральный оператор с кучей транзитного трафика, конечно Вам не помешает использование BMP благо у Akvorado есть поддержка.
Мое личное мнение, что Akvorado недооцененный продукт, абсолютно бесплатный на данный момент, что немало важно в наше время. Долго наблюдал когда же появится хоть какой-то материал здесь, но его не было.
Всем добра и спасибо за внимание!
Комментарии (5)
ZloyKishechnik
14.02.2025 16:39Спасибо за статью. Подскажите, вы сравнивали этот инструмент с elastiflow? Мы активно используем его, однако для нас это довольно "дорого" с точки зрения ресурсов инфраструктуры: нужно держать довольно жирную инсталляцию, так как под капотом elastic.
Однако основное отличие, почему мы его используем - возможность детально смотреть источник/назначение в развертке по ip-адресам и портам (удобно, например, для детектирования ддосов конкретно в нашем сценарии). Есть ли подобный фунционал тут?
aztec102 Автор
14.02.2025 16:39Добрый день!
ElastiFlow похожий продукт, единственное отличие на мой взгляд это другая подкапотная начинка. Жаль что конечно что он теперь в архиве и как теперь принято в OpenSource - было бесплатным, стало платным.
Akvorado тоже прожорлив до ресурсов, на данный момент имеется инсталляция с примерно такими спецификациями (16 vCPU, 32 GB RAM, 3 TB SSD). Если следить за таблицами в Clickhouse можно экономить место и не хранить например старые данные.
В Akvorado есть поля SrcPort и DstPort в случае когда приходится поискать по-конкретному можно так же использовать SrcAddr и DstAddr + есть возможность выбрать протокол через поле Proto.
ovsp
Удивительно хабра больше нет но статьи откудато "материализуются".