|
ebpf-blocker 1.0.0
XDP-based packet blocker using eBPF
|
#include <xdp_loader.h>
Public Member Functions | |
| XdpBlocker () | |
| ~XdpBlocker () | |
| XdpBlocker (const XdpBlocker &)=delete | |
| XdpBlocker & | operator= (const XdpBlocker &)=delete |
| XdpBlocker (XdpBlocker &&)=delete | |
| XdpBlocker & | operator= (XdpBlocker &&)=delete |
| void | Load (const std::string &iface) |
| void | Unload () |
| Открепляет XDP и закрывает BPF-объект. Безопасен для многократного вызова. | |
| void | UpdateMap (const std::string &map_name, const std::vector< BlockEntry > &entries) |
| Заменяет все записи в указанной BPF-карте. | |
| void | UpdateWhitelist (const std::vector< BlockEntry > &entries) |
| void | UpdateBlacklist (const std::vector< BlockEntry > &entries) |
| std::vector< std::pair< uint32_t, uint64_t > > | ReadAndClearDropCounters () |
| Читает все записи из карты drop_counter и атомарно очищает их. | |
Private Member Functions | |
| void | LoadBPFProgram () |
| Открывает и загружает BPF-объект из встроенного массива байткода. | |
| void | AttachToInterface () |
| Прикрепляет загруженную XDP-программу к iface_. | |
| void | DetachFromInterface () |
| Открепляет XDP-программу от iface_. | |
| void | ClearMap (bpf_map *map) |
| Перебирает и удаляет все ключи из BPF-карты (итерация LPM trie). | |
Private Attributes | |
| bpf_object * | obj_ |
| Дескриптор BPF-объекта libbpf. | |
| bpf_map * | whitelist_map_ |
| LPM trie для записей белого списка. | |
| bpf_map * | blacklist_map_ |
| LPM trie для записей чёрного списка. | |
| bpf_map * | drop_counter_map_ |
| Хэш-карта для счётчиков дропов по IP. | |
| std::string | iface_ |
| Имя текущего прикреплённого интерфейса. | |
Управляет жизненным циклом XDP BPF-программы.
Загружает скомпилированный BPF-объект из встроенного в бинарник массива байткода (xxd), прикрепляет к сетевому интерфейсу и предоставляет методы для обновления LPM-карт и чтения счётчиков дропов.
Definition at line 26 of file xdp_loader.h.
| XdpBlocker::XdpBlocker | ( | ) |
Definition at line 38 of file xdp_loader.cpp.
References PrintLibbpfLog().
| XdpBlocker::~XdpBlocker | ( | ) |
Definition at line 44 of file xdp_loader.cpp.
References Unload().
|
delete |
|
delete |
|
private |
Прикрепляет загруженную XDP-программу к iface_.
Прикрепляет XDP-программу к сетевому интерфейсу.
Definition at line 106 of file xdp_loader.cpp.
Referenced by Load().
|
private |
Перебирает и удаляет все ключи из BPF-карты (итерация LPM trie).
Удаляет все записи из BPF-карты.
| [in] | map | Указатель на BPF-карту. |
Definition at line 145 of file xdp_loader.cpp.
Referenced by UpdateMap().
|
private |
Открепляет XDP-программу от iface_.
Открепляет XDP-программу от сетевого интерфейса.
Definition at line 129 of file xdp_loader.cpp.
References iface_.
Referenced by Unload().
| void XdpBlocker::Load | ( | const std::string & | iface | ) |
Загружает BPF-объект и прикрепляет XDP-программу к интерфейсу.
| [in] | iface | Имя сетевого интерфейса (например "eth0"). |
| std::runtime_error | при любой ошибке. |
Definition at line 50 of file xdp_loader.cpp.
References AttachToInterface(), iface_, and LoadBPFProgram().
Referenced by main().
|
private |
Открывает и загружает BPF-объект из встроенного массива байткода.
Definition at line 75 of file xdp_loader.cpp.
References blacklist_map_, blocker_bpf, blocker_bpf_len, drop_counter_map_, obj_, and whitelist_map_.
Referenced by Load().
|
delete |
|
delete |
| std::vector< std::pair< uint32_t, uint64_t > > XdpBlocker::ReadAndClearDropCounters | ( | ) |
Читает все записи из карты drop_counter и атомарно очищает их.
Читает и атомарно очищает BPF-карту drop_counter.
Definition at line 215 of file xdp_loader.cpp.
References drop_counter_map_.
Referenced by main().
| void XdpBlocker::Unload | ( | ) |
Открепляет XDP и закрывает BPF-объект. Безопасен для многократного вызова.
Definition at line 56 of file xdp_loader.cpp.
References blacklist_map_, DetachFromInterface(), drop_counter_map_, iface_, obj_, and whitelist_map_.
Referenced by main(), and ~XdpBlocker().
| void XdpBlocker::UpdateBlacklist | ( | const std::vector< BlockEntry > & | entries | ) |
Сокращение для UpdateMap("blacklist_map", entries).
| [in] | entries | Список записей чёрного списка. |
Definition at line 205 of file xdp_loader.cpp.
References UpdateMap().
Referenced by main().
| void XdpBlocker::UpdateMap | ( | const std::string & | map_name, |
| const std::vector< BlockEntry > & | entries ) |
Заменяет все записи в указанной BPF-карте.
Заменяет все записи в указанной BPF-карте (whitelist_map / blacklist_map).
Сначала очищает карту, затем вставляет все корректные записи.
| [in] | map_name | "whitelist_map" или "blacklist_map". |
| [in] | entries | Список IP/CIDR-записей для вставки. |
Сначала очищает карту, затем вставляет каждую корректную запись BlockEntry.
Definition at line 165 of file xdp_loader.cpp.
References blacklist_map_, ClearMap(), CIDR::ip, ParseCIDR(), CIDR::prefixlen, and whitelist_map_.
Referenced by UpdateBlacklist(), and UpdateWhitelist().
| void XdpBlocker::UpdateWhitelist | ( | const std::vector< BlockEntry > & | entries | ) |
Сокращение для UpdateMap("whitelist_map", entries).
| [in] | entries | Список записей белого списка. |
Definition at line 201 of file xdp_loader.cpp.
References UpdateMap().
Referenced by main().
|
private |
LPM trie для записей чёрного списка.
Definition at line 66 of file xdp_loader.h.
Referenced by LoadBPFProgram(), Unload(), and UpdateMap().
|
private |
Хэш-карта для счётчиков дропов по IP.
Definition at line 67 of file xdp_loader.h.
Referenced by LoadBPFProgram(), ReadAndClearDropCounters(), and Unload().
|
private |
Имя текущего прикреплённого интерфейса.
Definition at line 68 of file xdp_loader.h.
Referenced by AttachToInterface(), DetachFromInterface(), Load(), and Unload().
|
private |
Дескриптор BPF-объекта libbpf.
Definition at line 64 of file xdp_loader.h.
Referenced by AttachToInterface(), LoadBPFProgram(), and Unload().
|
private |
LPM trie для записей белого списка.
Definition at line 65 of file xdp_loader.h.
Referenced by LoadBPFProgram(), Unload(), and UpdateMap().