ebpf-blocker 1.0.0
XDP-based packet blocker using eBPF
Loading...
Searching...
No Matches
xdp_loader.h
Go to the documentation of this file.
1/// \file xdp_loader.h
2/// \brief Загрузчик BPF-объекта и менеджер XDP-программы.
3/// \details Предоставляет класс XdpBlocker для загрузки BPF-объекта из
4/// встроенного байткода, прикрепления XDP к интерфейсу и управления
5/// BPF-картами белого списка, чёрного списка и счётчиков дропов.
6
7#ifndef XDP_LOADER_H
8#define XDP_LOADER_H
9
10#include <cstdint>
11#include <string>
12#include <utility>
13#include <vector>
14
15#include "db.h"
16
17struct bpf_object;
18struct bpf_map;
19struct bpf_program;
20
21/// Управляет жизненным циклом XDP BPF-программы.
22///
23/// Загружает скомпилированный BPF-объект из встроенного в бинарник
24/// массива байткода (xxd), прикрепляет к сетевому интерфейсу и
25/// предоставляет методы для обновления LPM-карт и чтения счётчиков дропов.
27public:
28 XdpBlocker();
30
31 XdpBlocker(const XdpBlocker &) = delete;
32 XdpBlocker &operator=(const XdpBlocker &) = delete;
33 XdpBlocker(XdpBlocker &&) = delete;
35
36 /// Загружает BPF-объект и прикрепляет XDP-программу к интерфейсу.
37 /// @param[in] iface Имя сетевого интерфейса (например "eth0").
38 /// @throws std::runtime_error при любой ошибке.
39 void Load(const std::string &iface);
40
41 /// Открепляет XDP и закрывает BPF-объект. Безопасен для многократного вызова.
42 void Unload();
43
44 /// Заменяет все записи в указанной BPF-карте (whitelist_map / blacklist_map).
45 ///
46 /// Сначала очищает карту, затем вставляет все корректные записи.
47 /// @param[in] map_name "whitelist_map" или "blacklist_map".
48 /// @param[in] entries Список IP/CIDR-записей для вставки.
49 void UpdateMap(const std::string &map_name,
50 const std::vector<BlockEntry> &entries);
51
52 /// Сокращение для UpdateMap("whitelist_map", entries).
53 /// @param[in] entries Список записей белого списка.
54 void UpdateWhitelist(const std::vector<BlockEntry> &entries);
55 /// Сокращение для UpdateMap("blacklist_map", entries).
56 /// @param[in] entries Список записей чёрного списка.
57 void UpdateBlacklist(const std::vector<BlockEntry> &entries);
58
59 /// Читает и атомарно очищает BPF-карту drop_counter.
60 /// @return Вектор пар (source_ip, количество_дропов).
61 std::vector<std::pair<uint32_t, uint64_t>> ReadAndClearDropCounters();
62
63private:
64 bpf_object *obj_; ///< Дескриптор BPF-объекта libbpf.
65 bpf_map *whitelist_map_; ///< LPM trie для записей белого списка.
66 bpf_map *blacklist_map_; ///< LPM trie для записей чёрного списка.
67 bpf_map *drop_counter_map_; ///< Хэш-карта для счётчиков дропов по IP.
68 std::string iface_; ///< Имя текущего прикреплённого интерфейса.
69
70 /// Открывает и загружает BPF-объект из встроенного массива байткода.
71 void LoadBPFProgram();
72 /// Прикрепляет загруженную XDP-программу к iface_.
73 void AttachToInterface();
74 /// Открепляет XDP-программу от iface_.
76 /// Удаляет все записи из BPF-карты.
77 /// @param[in] map Указатель на BPF-карту.
78 void ClearMap(bpf_map *map);
79};
80
81#endif
XdpBlocker(XdpBlocker &&)=delete
XdpBlocker & operator=(const XdpBlocker &)=delete
void DetachFromInterface()
Открепляет XDP-программу от iface_.
void AttachToInterface()
Прикрепляет загруженную XDP-программу к iface_.
std::vector< std::pair< uint32_t, uint64_t > > ReadAndClearDropCounters()
Читает все записи из карты drop_counter и атомарно очищает их.
void Unload()
Открепляет XDP и закрывает BPF-объект. Безопасен для многократного вызова.
void LoadBPFProgram()
Открывает и загружает BPF-объект из встроенного массива байткода.
bpf_object * obj_
Дескриптор BPF-объекта libbpf.
Definition xdp_loader.h:64
std::string iface_
Имя текущего прикреплённого интерфейса.
Definition xdp_loader.h:68
XdpBlocker & operator=(XdpBlocker &&)=delete
bpf_map * whitelist_map_
LPM trie для записей белого списка.
Definition xdp_loader.h:65
void UpdateWhitelist(const std::vector< BlockEntry > &entries)
void UpdateBlacklist(const std::vector< BlockEntry > &entries)
void ClearMap(bpf_map *map)
Перебирает и удаляет все ключи из BPF-карты (итерация LPM trie).
bpf_map * drop_counter_map_
Хэш-карта для счётчиков дропов по IP.
Definition xdp_loader.h:67
bpf_map * blacklist_map_
LPM trie для записей чёрного списка.
Definition xdp_loader.h:66
void UpdateMap(const std::string &map_name, const std::vector< BlockEntry > &entries)
Заменяет все записи в указанной BPF-карте.
void Load(const std::string &iface)
XdpBlocker(const XdpBlocker &)=delete
Обёртка SQLite-базы данных и утилиты парсинга CIDR.