Снятие отпечатков сетевого трафика собственными силами Бэкенд, теория программирования
Занимается разработкой различных высоконагруженных сетевых сервисов под Linux на C++ и Boost на протяжении последних восьми лет. Последние два года работает ведущим разработчиком в компании Variti, помогая ей спасать Интернет от нашествия ботов.
Я работаю в компании, которая занимается защитой бизнеса от различных угроз в сети Интернет. Речь идет о парсинге, DDoS-атаках, скликивании и многом другом. Наше и подобные решения представляют собой высоконагруженные сетевые приложения, которые способны анализировать в райнтайме большие объемы трафика. Мы разбираем сетевые запросы на уровнях L3,4 и, основываясь на этой (и не только) информации, принимаем решение, пропускать эти самые запросы дальше или нет.
В докладе пойдет речь о нашем опыте работы с утилитой p0f для снятия отпечатков сетевого трафика, которая частично наделена необходимым нам функционалом. Несомненным плюсом этой утилиты является то, что это готовое решение с уже написанными и отлаженными алгоритмами, но использовать его как есть не представляется возможным из-за перечисленных ниже проблем:
* отсутствие обновлений;
* устаревший код;
* медленная работа с сетевой картой;
* медленные кэши;
* медленная апишка;
* отсутствие многопоточности;
* устаревшая база отпечатков.
Нам было очень важно устранить каждый недочет из этого списка. Поэтому взвесив все за и против, мы приняли решение о разработке собственного улучшенного аналога, который получил название p0f-ng, а вместе с ним и следующие преимущества:
* современный код;
* быстрая работа с сетевой картой;
* быстрые кэши;
* быстрая апишка;
* многопоточность;
* инструменты для пополнения базы отпечатков.
Мы подробно поговорим по каждому пункту. Остановимся немного на понятии отпечатка трафика в целом. Обсудим критерии выбора языка и наш опыт его использования в разработке высоконагруженных сервисов. Расскажем о сетевых стеках, скорость работы которых играет немаловажную роль в решении поставленной задачи. Затронем алгоритмические проблемы, возникающие при работе с большими объемами данных, и приведем способы их решения. Ну и, конечно же, наглядно продемонстрируем полученные уже сегодня результаты.
Технологии:
ipv4, ipv6, tcp, c++17, linux, p0f, dpdk, mqueue, mhash, graphite