LINUX.ORG.RU

История изменений

Исправление vel, (текущая версия) :

Текущий ядерный патч никак не связан с ndpi. Это просто небольшое расширение возможностей nf_conntrack_extend.

Проблема появится в случае добавления нового протокола и в случае революционных изменений API nDPI.

Если в nDPI появляется новый протокол, то его нужно добавить в ndpi-netfilter/src/Makefile аналогично другим протоколам и сказать «make src/xt_ndpi.h» в ndpi-netfilter

ndpi-netfilter/ipt зависит только от ndpi-netfilter/src/xt_ndpi.h

ndpi-netfilter/src зависит и от ndpi-netfilter/src/xt_ndpi.h и от nDPI

У меня есть git для nDPI - git://lms.guap.ru/nDPI, но комменты к коммитам убогие.

Есть memory leak - 8 байт при каждой выгрузке модуля xt_ndpi.ko . Где - не знаю и искать лень!

О чем нужно знать: udp приходит дефрагментированное на уровне IPv4, но skb при этом может быть фрагментированный (я видел до ~7 кб пакеты с 5-ю фрагментами и skb ~1.5kb 3 фрагмента)! Я добавил в в xt_ndpi параметер mtu - он ограничивает размер skb которые будут линеаризироваться (это дополнительные временные расходы памяти). Если skb фрагментированный и его длина больше параметра mtu, то он тупо отбрасывается. IMHO mtu можно поднять до 4000 ( чтоб помещался в страницу ). Кстати, эта проблема есть и в l7filter. При нехватке памяти это убивает систему!

Настоятельно рекомендую не пытаться проверять пакеты которые имеют состояние INVALID или UNTRACKED в conntrack! Т.е.

iptables ..... -m conntrack ! --ctstate INVALID,UNTRACKED -m ndpi ....

Все параметры можно посмотреть через

grep -a . /sys/module/xt_ndpi/parameters/*

Из интересных

  • jumbo - фрагментированных skb длиной >mtu
  • skb_lin - обработанно не фрагментированных skb
  • skb_sgo - обработанно фрагментированных skb (т.е. с skb_clone)
  • zpl* - parsed lines - статистика по числу распознанных текстовых строк в пакете (в структуре flow есть двойной набор указателей на найденные строки и это самая длинная часть flow! в оригинале их было 200, но по моей статистике больше 70 строк было найдено всего 2-3 раза за неделю и сократив их до 64 я уменьшил структуру flow с 3800 байт до 1632).

    zpl010 - < 10 в пакете

    ...

    zpl080 - < 80 в пакете (уже не может быть )

    zpl100x - > 100

  • max_parsed_l - максимальное число распознанных строк

остальные параметры - отладочные счетчики разных событий (упешных или не успешных).

PS я примерно 5-6 дней тестировал на x86_64. Работает стабильно, но расходы памяти не радуют - 2816 байт на flow против 1632 на x86. С другой стороны на x86_64 нет проблем с доступностью памяти.

Исходная версия vel, :

Текущий ядерный патч никак не связан с ndpi. Это просто небольшое расширение возможностей nf_conntrack_extend.

Проблема появится в случае добавления нового протокола и в случае революционных изменений API nDPI.

Если в nDPI появляется новый протокол, то его нужно добавить в ndpi-netfilter/src/Makefile аналогично другим протоколам и сказать «make src/xt_ndpi.h» в ndpi-netfilter

ndpi-netfilter/ipt зависит только от ndpi-netfilter/src/xt_ndpi.h

ndpi-netfilter/src зависит и от ndpi-netfilter/src/xt_ndpi.h и от nDPI

У меня есть git для nDPI - git://lms.guap.ru/nDPI, но комменты к коммитам убогие.

Есть memory leak - 8 байт при каждой выгрузке модуля xt_ndpi.ko . Где - не знаю и искать лень!

О чем нужно знать: udp приходит дефрагментированное на уровне IPv4, но skb при этом может быть фрагментированный (я видел до ~7 кб пакеты)! Я добавил в в xt_ndpi параметер mtu - он ограничивает размер skb которые будут линеаризироваться (это дополнительные временные расходы памяти). Если skb фрагментированный и его длина больше параметра mtu, то он тупо отбрасывается. IMHO mtu можно поднять до 4000 ( чтоб помещался в страницу ). Кстати, эта проблема есть и в l7filter.

Настоятельно рекомендую не пытаться проверять пакеты которые имеют состояние INVALID или UNTRACKED в conntrack! Т.е.

iptables ..... -m conntrack ! --ctstate INVALID,UNTRACKED -m ndpi ....

Все параметры можно посмотреть через

grep -a . /sys/module/xt_ndpi/parameters/*

Из интересных

  • jumbo - фрагментированных skb длиной >mtu
  • skb_lin - обработанно не фрагментированных skb
  • skb_sgo - обработанно фрагментированных skb (т.е. с skb_clone)
  • zpl* - parsed lines - статистика по числу распознанных текстовых строк в пакете (в структуре flow есть двойной набор указателей на найденные строки и это самая длинная часть flow! в оригинале их было 200, но по моей статистике больше 70 строк было найдено всего 2-3 раза за неделю и сократив их до 64 я уменьшил структуру flow с 3800 байт до 1632).

    zpl010 - < 10 в пакете

    ...

    zpl080 - < 80 в пакете (уже не может быть )

    zpl100x - > 100

  • max_parsed_l - максимальное число распознанных строк

остальные параметры - отладочные счетчики разных событий (упешных или не успешных).

PS я примерно 5-6 дней тестировал на x86_64. Работает стабильно, но расходы памяти не радуют - 2816 байт на flow против 1632 на x86. С другой стороны на x86_64 нет проблем с доступностью памяти.