LINUX.ORG.RU

nDPI как замена l7filter

 ,


23

17

Если кому интересно, то вот рецепт

На большом потоке ( >300мбит/с ) c большим числом протоколов (>20) используется примерно 40% одного ядра Intel(R) Xeon(R) CPU E31230@3.20GHz. Если поток больше или процессор слабее, то включаем RPS или используем сетевые карты с multi-queue и irq-affinity :)

Требуется много памяти. На каждое соединение расходуется примерно 800+264*0.7 байт.

Исходники теперь есть на https://github.com/vel21ripn/nDPI/tree/netfilter

★★★★★

Последнее исправление: vel (всего исправлений: 3)
Ответ на: комментарий от vel

Собралось без патча на ядре 3.17.8 (меньше не пробовал). Поповоду memory leak не тестил, возможно.

http://devel.aanet.ru/ndpi/ у меня почему - то не детектит протоколы по нестандартным портам. В чем может быть дело?

yalexeyka
()
Ответ на: комментарий от yalexeyka

Не детектит только http трафик, ssh видит. https не пробовал.

yalexeyka
()
Ответ на: комментарий от vel

При одновременном использовании правил с xt_connlabel и даже если просто подгрузить модуль ndpi - ядро валится в панику!

[ 1088.459333] [<ffffffffa03ee699>] ? __ndpi_free_flow+0x99/0xd0 [xt_ndpi] [ 1088.459424] [<ffffffffa03ef00c>] ? ndpi_destroy_conntrack+0x9c/0xc0 [xt_ndpi] [ 1088.459509] [<ffffffff8131fb5a>] ? nf_conntrack_destroy+0x1a/0x30 [ 1088.459565] [<ffffffff81322860>] ? nf_ct_delete+0x120/0x210 [ 1088.459617] [<ffffffff81322950>] ? nf_ct_delete+0x210/0x210 [ 1088.459669] [<ffffffff81074b86>] ? call_timer_fn.isra.32+0x16/0x90 [ 1088.459724] [<ffffffff81322950>] ? nf_ct_delete+0x210/0x210 [ 1088.459776] [<ffffffff81074da0>] ? run_timer_softirq+0x1a0/0x230 [ 1088.459830] [<ffffffff81039aa5>] ? __do_softirq+0xf5/0x200 [ 1088.459881] [<ffffffff81039cfd>] ? irq_exit+0x9d/0xa0 [ 1088.459932] [<ffffffff810230cb>] ? smp_apic_timer_interrupt+0x3b/0x50 [ 1088.459989] [<ffffffff813acb17>] ? apic_timer_interrupt+0x67/0x70

stasn77
()
Ответ на: комментарий от stasn77

Это цена за отсутствие патча к ядру :(

либо ndpi либо connlabel, либо патчить ядро и использовать одновременно ndpi & connlabel.

Забыл об этом написать.

Если меток меньше 32, то проще использовать connmark

vel ★★★★★
() автор топика
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

понял, спасибо connmark уже используется для других нужд.... патч на 3.17 - 3.18 ляжет?

stasn77
()
Ответ на: комментарий от stasn77

Пока нет версии для 3.10+ с патчем.

Выложу вечером.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

Спасибо!

Применил последний по версии патч (3.14.5) на 3.18.3 - лёг ровно и работает, не паникует. )

Есть еще проблемка - таргет NDPI работает как-то совсем не адекватно! По крайней мере при маркировке. Это даже объяснить сложно, но по факту совсем не так как ожидается... трафик через него тупо куда-то «исчезает» при замене стандартной схемы на аналогичный вариант с NDPI (как в примерах).

stasn77
()
Ответ на: комментарий от stasn77

«исчезает» - это как ?

Таргет NDPI не выполняет детектирования протоколов, оно должно быть выполнено до этого. т.е. если просто сказать "-j NDPI ..." без предварительного "-m ndpi --proto", то оно естественно работать не будет.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

в смысле работать не будет? без одновременного использования "-m ndpi --proto" в одном правиле с "-j NDPI" не выполнит маркировку с последующим ACCEPT|CONTINUE|RETURN ?

stasn77
()
Ответ на: комментарий от vel

без проверки таргет можно использовать? например, просто чтобы промаркировать пакет и сделать return в родительскую цепочку?

stasn77
()
Ответ на: комментарий от stasn77

Если трафик не проходил детектирование, то -j NDPI не работает, он просто ничего не делает!

С одной стороны это логично.

А с точки зрения универсальности - хорошо бы чтоб работало.

vel ★★★★★
() автор топика
Ответ на: комментарий от as_lan

подправил только ndpi-netfilter.

Последние опыты на виртуалке (kernel 3.18.3 + qemu) пока не выявили проблем, кроме того, что собранный ранее трафик оказался непригодный для повторения - там был включен tso и половина трафика получилась с неверными контрольными суммами.

Я собраю обычно 250Гб трафика для анализа.

vel ★★★★★
() автор топика
Ответ на: комментарий от ramadan

Таки собрал под Centos7+IMQ (ядро 3.10) и без патча ядра. icmp и ssh тут работает. С патчем ядра будет возможно чуть позже. Мануал к вечеру запилю подробный. Есть небольшие подводные камни при сборке. Разберусь для начала с ними.

as_lan ★★
()
Ответ на: комментарий от vel

Сегодня заметил что r8636_v0 не обнаруживает p2p. Пока не понял почему. Лишь пару пакетов детектирует, хотя трафик в этот момент порядка 20мбит/с. Попробую собрать еще раз, но v3.

as_lan ★★
()
Ответ на: А мануал удалось составить? от firebolt

Centos http://a7lanov.blogspot.ru/2015/01/centos-ndpi-imq.html Ubuntu http://a7lanov.blogspot.ru/2014/10/ubuntu-imq-ndpi-07122014.html

Centos только 7 и только x64 (x32 в принципе сейчас не так и нужен, да и разницы там особо большой не должно быть, разве что .config подправить. первую строчку. IMQ тоже должен лечь без проблем. Но если очень надо под 32, могу и под него попробовать собрать). На Centos 6 нет родных ядер 3 ветки. А с ванильным не хотелось возиться. Может когда нибудь с ванильным и под Centos6 соберу.

Ubuntu не обновлял. Там итак под свежий r8636_v3

as_lan ★★
()
Ответ на: комментарий от vel

У меня какой-то косяк с таргетом NDPI с параметром --ret - пакеты тупо перестают ходить. Попробовал в стандартном модуле xt_CLASSIFY и xt_connmark поменять вердикт с XT_CONTINUE на XT_RETURN - результат тот же, не ходят. С NF_ACCEPT все нормально, стандартный таргет -j RETURN тоже работает как должен.

Куда копать?

stasn77
()
Ответ на: комментарий от stasn77

В каких таблицах (mangle/filter) и в каких цепочках пытался использовать -j NDPI c --ret или --accept ?

TRACE не пробовал включать ?

vel ★★★★★
() автор топика
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

TRACE, который в iptables raw ? Если пакету сгенерированному самим хостом делать --ret в OUTPUT, то до POSTROUTING он уже не долетает, последняя запись - то самое правило с ретурном.

stasn77
()
Ответ на: комментарий от stasn77

Да, есть такой косяк. Объяснить пока не могу.

В FORWARD тоже самое.

Завтра попробую разобраться.

vel ★★★★★
() автор топика
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от stasn77

"--ret" не работает и судя по всему никогда не работала :(

Видать я где-то накосячил когда тестировал. Придется убрать опцию "--ret". Печалька.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

Она нигде не работает, не только в Вашем модуле - действительно печалька, было бы так удобно. ((

Кстати, ссылка на исправленный nDPI-1.5.1.r8636_v3a.tar.gz не работает, отсутствует файл.

stasn77
()
Ответ на: комментарий от as_lan

Пересобрал модуль. Ядро не патченное. Все равно порт 8080 не распознает.Или для нормальной работы нужен патч ядра. Собирал под Ubuntu 14.04. Ядро 3.13.0-24-generic

--2015-01-27 11:45:53--  http://www2.epfr.ru:8080/
Распознаётся www2.epfr.ru (www2.epfr.ru)… 79.110.251.208
Подключение к www2.epfr.ru (www2.epfr.ru)|79.110.251.208|:8080... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 19043 (19K) [text/html]
Сохранение в: «/dev/null»

100%[===================================================================================================================================================================================================>] 19 043      --.-K/s   за 0,09s

2015-01-27 11:45:53 (212 KB/s) - «/dev/null» сохранён [19043/19043]


Chain INPUT (policy ACCEPT 72 packets, 204961 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       0        0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            protocol http
      43    56708 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            protocol ssl
       0        0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            protocol bittorrent
      27     1080 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            protocol ssh
       4      403 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            protocol dns

yalexeyka
()
Ответ на: комментарий от yalexeyka

Для детектирования трафика нужно просматривать трафик в обе стороны, т.ч. в output тоже нужно правила добавлять.

По-хорошему, нужно иметь 2 правила

iptables -t mangle -A PREROUTING -m ndpi --all
iptables -t mangle -A OUTPUT -m ndpi --all
А потом уже в filter что-то с этим делать

vel ★★★★★
() автор топика
Ответ на: комментарий от yalexeyka

Используйте -m ndpi --http_proxy. --http видит только по 80 порту.

as_lan ★★
()
Ответ на: комментарий от vel

Я заметил этот баг с 80 порту недели 2 назад, забыл отписать. при http_proxy детектирует. Просто http не видит. От правил iptables не зависит.

as_lan ★★
()
Ответ на: комментарий от as_lan

Debian Wheezy, ядро из backports 3.16-amd64, то есть, без патча ядра. Шаг 9, собираю пакеты iptables 1.4.14 (в прошлый раз вроде бы их же собирал):

In file included from libipq.c:34:0:
../include/libipq/libipq.h:33:43: fatal error: linux/netfilter_ipv4/ip_queue.h: No such file or directory
compilation terminated.
firebolt
()
Ответ на: комментарий от firebolt

iptables-1.4.14 это очень старая версия.

IMHO на данный момент нет смысла собирать iptables отличный от 1.4.21, особенно с ядрами 3.Х.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

Новая проблема:

[ 159.637959] Call Trace: [ 159.638035] [<ffffffffa0385241>] ? ndpi_id_search_or_insert+0x41/0x130 [xt_ndpi] [ 159.638155] [<ffffffffa03865e7>] ? ndpi_mt+0x5b7/0x6f0 [xt_ndpi] [ 159.643163] RIP [<ffffffff811d7788>] memcmp+0x8/0x50

Ядро 3.18.3 патченое из r8636_v3b, в mangle INPUT/OUTPUT проверяю через "-m ndpi" локальный трафик - в течении минуты паника.

stasn77
()
Ответ на: комментарий от stasn77

Выяснил, что так крашится если выключить IPv6 в ndpi_protocol_ids.h )

Более того с версией модуля из r8636_v3b и патченым ядром 3.18.3 крашится (RIP [<ffffffffa03cc334>] ndpi_mt+0x234/0x780 [xt_ndpi]) в сочетании с connlabel, а вот r8636_v3а не падает в этом случае.

stasn77
()
Ответ на: комментарий от as_lan

с новой (v3c) icmp таки заработал и детектируется!

as_lan ★★
()
Ответ на: комментарий от stasn77

r8636_v3b - неправильная, я по ошибке не ту ветку экспортировал. r8636_v3с правильная.

После патча нужно пересобрать все сторонние модули!

Если без патча, то xt_connlabel нельзя загружать. Либо удалить его, либо в blacklist modprobe.

vel ★★★★★
() автор топика
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

С connlabel, патчем и т.д. все понятно. Дело было в «кривой» v3b. На v3c все ОК.

А вот с выключением поддержки IPv6 по прежнему косяк - kernel panic.

stasn77
()
Ответ на: комментарий от vel

У Debian даже в backports нет свежее версии.

Не понимаю, что за ошибку я получал! Сейчас собираю с ванильным ядром, пропатчил его, собираю опять пакеты iptables и все проходит без ошибок! Какая связь между тем не найденным в исходниках iptables файлом и другим ядром?

firebolt
()
Ответ на: комментарий от as_lan

Вот мой результат сборки на Debian Wheezy:

root@server:/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter# make 
make -C ipt
make[1]: Entering directory `/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/ipt'
cc -fPIC -I../include -I../lib -I../src -DOPENDPI_NETFILTER_MODULE -O2 -Wall -D_INIT=libxt_ndpi_init -c -o libxt_ndpi.o libxt_ndpi.c;
cc -shared -o libxt_ndpi.so libxt_ndpi.o;
rm libxt_ndpi.o
make[1]: Leaving directory `/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/ipt'
make -C src
make[1]: Entering directory `/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src'
make -j 4 -C /lib/modules/3.17.8-ndpi/build M=$PWD modules -w;
make[2]: Entering directory `/usr/src/linux-3.17.8'
  CC [M]  /usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/main.o
  CC [M]  /usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/../lib/protocols/../third_party/src/node.o
  CC [M]  /usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/../lib/protocols/../third_party/src/ahocorasick.o
  CC [M]  /usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/../lib/ndpi_main.o
/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/main.c:91:2: error: #error NF_CONNTRACK_LABELS not defined
/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/main.c: In function ‘ndpi_mt_init’:
/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/main.c:1336:22: error: ‘NF_CT_EXT_LABELS’ undeclared (first use in this function)
/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/main.c:1336:22: note: each undeclared identifier is reported only once for each function it appears in
make[3]: *** [/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src/main.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [_module_/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src] Error 2
make[2]: Leaving directory `/usr/src/linux-3.17.8'
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src'
make: *** [all] Error 2
root@server:/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter# make install
make -C ipt install
make[1]: Entering directory `/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/ipt'
if [ -d /lib/xtables ]; then install libxt_ndpi.so /lib/xtables; ln -fs libxt_ndpi.so /lib/xtables/libxt_NDPI.so ; else echo "No pkg-config --variable=xtlibdir xtables"; fi
make[1]: Leaving directory `/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/ipt'
root@server:/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter# make modules_install
make -C src modules_install
make[1]: Entering directory `/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src'
make -C /lib/modules/3.17.8-ndpi/build M=$PWD modules_install;
make[2]: Entering directory `/usr/src/linux-3.17.8'
  DEPMOD  3.17.8-ndpi
make[2]: Leaving directory `/usr/src/linux-3.17.8'
depmod -a;
make[1]: Leaving directory `/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter/src'
root@server:/usr/src/nDPI-1.5.1.r8636_v3c/ndpi-netfilter# modprobe xt_ndpi
FATAL: Module xt_ndpi not found.
firebolt
()
Ответ на: комментарий от firebolt

Минимальные требования к конфигурации ядра.

Networking support  --->
  Networking options  --->
  [*] Network packet filtering framework (Netfilter)  --->
        Core Netfilter Configuration  --->
          Netfilter connection tracking support (M/Y)
          "connlabel" match support (M)

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

Я просто коментирую строчку #define NDPI_DETECTION_SUPPORT_IPV6 в src/include/ndpi_protocol_ids.h. Все пересобираю, подгружаю модуль. Закидываю любой входящий/исходящий трафик того же хоста через правило с "-m ndpi --all" - в результате рано или поздно (обычно в течении пары минут) кернел паник.

stasn77
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.