aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Nazaryev <sergey@nazaryev.ru>2018-11-06 16:34:49 +0000
committerSergey Nazaryev <sergey@nazaryev.ru>2018-11-06 16:54:01 +0000
commitd8f1be1e93e114807bc561858514e31d02cbf013 (patch)
tree1672be7c8c7124b3adf3fc3673ae8d3693a75f09
parent070561e040f666c7692a0baa80a7577bf423cbd5 (diff)
downloadifstat-d8f1be1e93e114807bc561858514e31d02cbf013.zip
ifstat-d8f1be1e93e114807bc561858514e31d02cbf013.tar.gz
ifstat-d8f1be1e93e114807bc561858514e31d02cbf013.tar.bz2
Набросал небольшой README.md
-rw-r--r--README.md114
1 files changed, 114 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1ff6256
--- /dev/null
+++ b/README.md
@@ -0,0 +1,114 @@
+ifstat
+======
+
+Эта программа обрабатывает пакеты с сетевого интерфейса, собирает
+статистику (количество полученных пакетов, количество полученных
+байт, распределение количества пакетов по их размерам) о трафике
+установленного вида и отправляет броадкастом полученную статистику по
+[ubus](ubus).
+
+## Зависимости
+
+
+ - актуальное ядро Linux с поддержкой eBPF и XDP (4.4+ должно подойти);
+
+ - запущенный ubusd, установленные libubus (скомпиленный с
+ поддержкой lua) и libuloop;
+
+ - LLVM/Clang, luajit (устанавливаются из репозитория);
+
+ - libbcc (может быть собрано в виде deb-пакета из репозитория);
+
+ - tcpreplay (для тестов)
+
+## Запуск и конфигурация
+
+```shell
+sudo bcc/src/lua/bcc-probe ifstatd.lua # сервер (компиляция, инъекция eBPF, отправка)
+./ifstat.lua # клиент (отображение статистики от сервера)
+```
+
+В качестве конфига используется находящийся рядом с `ifstatd.lua`
+файл `config.lua`.
+
+```lua
+local _config = {
+ delay_ms = 500,
+ iface = "enp0s8",
+
+ filters = {
+ {
+ filter_num = 0, -- номер фильтра
+ enabled = 1, -- включен (1) / выключен (0)
+ ipproto = IPPROTO_TCP, -- IPPROTO_TCP, IPPROTO_UDP или ANY
+ src_ip = "140.82.33.182", -- строка с IPv4 или ANY
+ dst_ip = ANY, -- аналогично src_ip
+ src_port = 22, -- номер UDP/TCP-порта или ANY
+ dst_port = ANY -- аналогично src_port
+ },
+ {
+ filter_num = 1,
+ enabled = 0,
+ },
+ ...
+}
+```
+
+## Архитектура
+
+Для того, чтобы собирать статистику максимально эффективно,
+используется интерфейс ядра [eBPF](ebpf). Это даёт возможность
+запускать код, подсчитывающий статистику, прямо в ядре. Кроме того,
+для наибольшей производительности eBPF-код вешается на XDP (eXpress
+Data Path), что позволяет получить доступ до пакета даже раньше, чем
+он будет обработан сетевым стеком Linux'а.
+
+Основной код, который задействован в подсчёте статистики, написан на
+Си (`ifstat_kern.c`). Процессом компиляции и инъекцией этого кода в
+ядро занимается lua-скрипт, основанный на официальных байндингах
+проекта [bcc](bcc) (это фреймворк, упрощающий процесс создания
+утилит, использующих eBPF). Непосредственно компиляцией занимается
+LLVM/Clang.
+
+## Почему я выбрал Lua в качестве вспомогательного языка?
+
+ 1. Весь критичный к производительности код запускается в ядре и
+ написан на Си, всё остальное (парсинг конфигов и командной
+ строки, инъекция eBPF, вычитка готовых данных, отправка данных
+ по ubus) можно было написать на любом подходящем для этих задач
+ языке.
+
+ 2. Проект bcc официально поддерживает нативный интерфейс
+ (библиотеку libbcc) для инъекции eBPF в ядро и байндинги к нему
+ поддерживаются непосредственно разработчиком только для Lua и
+ Python -- выбор сильно сужается;
+
+ 3. Проект ubus предоставляет только нативный интерфейс и
+ Lua-байндинги.
+
+ 4. Идея написать с нуля и поддерживать байндинги для bcc или ubus
+ ля других языков откидывается сразу.
+
+Таким образом, на выбор остаются только Си и Lua. Писать на
+Lua обработку конфигов и сериализацию/десериализацию данных
+значительно проще и приятнее, чем на Си, поэтому Lua и был выбран.
+
+## Пример вывода утилиты ifstat
+
+```
+filter0
+=======
+≤ 64: 36
+65 .. 127: 18
+128 .. 255: 10
+256 .. 511: 13
+512 .. 1023: 3
+1024 .. 1512: 10
+≥ 1513: 0
+Bytes received: 27100
+Packetes received: 90
+```
+
+[ubus]: https://oldwiki.archive.openwrt.org/doc/techref/ubus
+[bcc]: https://github.com/iovisor/bcc
+[ebpf]: https://lwn.net/Articles/740157/