nDPI :: 是否提供协议列表删除 "Default" 协议列表?

nDPI :: Does Supplying Protocol List Delete "Default" Protocol List?

我一直在通过大量的反复试验和本论坛的帮助学习 nDPI 库。我最近写了一个新版本的 C 程序(写在 Ubuntu,编译器是 GCC)并且相信我正确地使用了 nDPI 库。这是一个广泛的概述:

#include "ndpi_config.h"

static struct ndpi_detection_module_struct *ndpi_info_mod = NULL;

int main(int argc, char ** argv){

        // Set up nDPI
        // This is adapted from the "nDPI Quick Start Guide"
        NDPI_PROTOCOL_BITMASK all;
        ndpi_info_mod = ndpi_init_detection_module(ndpi_no_prefs);
        if(ndpi_info_mod == NULL) return -1;
        NDPI_BITMASK_SET_ALL(all);
        ndpi_set_protocol_detection_bitmask2(ndpi_info_mod, &all);
        ndpi_load_protocols_file(ndpi_info_mod, 
            "/home/me/myProtocols.protos");
        ndpi_finalize_initalization( ndpi_info_mod ); // Init the Detect Mod

        u_char* buffer = malloc( sizeof(char) * 1000 );

        while(1){

                buffer = capturePacket(); //this works, packet stored as char*

                // ...build all necessary nDPI structs here...

                ndpi_protocol ret = ndpi_detection_process_packet(
                        ndpi_info_mod, flowStruct, buffer, bufferSize, 0, 
                        srcStruct, dstStruct );

                printf("This packet was::  %s  (%d)\n", 
                        ndpi_get_proto_name(ndpi_info_mod, ret.app_protocol),
                        ret.app_protocol );
        }
}

出于测试目的,我特意写了一个很短的“myProtocols.protos”文件:

# Comment field :: myProtocols.protos
tcp:5201@iPerf3
tcp:80@Some_Useful_Protocol

上面的编译和运行很好。我 运行 一些测试流量,包括 iPerf3、HTTP、FTP 和 SNMP。这是输出,为简洁起见进行了编辑:

This packet was::  iPerf3  (243)
This packet was::  Some_Useful_Protocol  (244)
This packet was::  Unknown  (0)
This packet was::  Unknown  (0)

…第一个数据包是 iPerf3,第二个是 HTTP,第三个 FTP,第四个是 SNMP。使用 Wireshark 进行验证,我确信我发送的是真实流量。 我玩过 nDPI 足以知道,如果你安装它并在不提供协议文件的情况下使用它,它仍然能够识别常见的应用程序,如 HTTP、FTP、SNMP 等。我期待如果您提供协议文件,该文件将补充,而不是覆盖,“内置”协议列表。 This paper 在“扩展 nDPI”部分提出了同样多的建议。 此外,当我注释掉这一行时......

ndpi_load_protocols_file(ndpi_info_mod, "/home/me/myProtocols.protos");

…程序的输出变成了这样…

This packet was::  Unknown  (0)
This packet was::  Unknown  (0)
This packet was::  Unknown  (0)
This packet was::  Unknown  (0)

……这显然是不对的。

看来我的 nDPI 只能识别我的协议文件中列出的协议,而不能识别其他协议。我猜这里有两种可能性:

  1. 我在启动 nDPI 和“预烘焙”列表时做错了 协议还没有绑定?还是被抹杀了? ...或者什么...?

  2. 我捕获数据包的代码搞砸了 nDPI 无法读取。

老实说,我怀疑是(2)…但万一问题可能是(1),我想问问这个论坛。有人看到我的方法有问题吗?谢谢。

编辑:我添加了对“ndpi_finalize_initalization()”的调用,这在 post 的原始版本中是缺失的。不幸的是,这不会改变程序的行为...

加载协议文件补充内置协议;它不会覆盖它们。

在添加 ndpi_load_protocols_file 之前确保解码按预期工作。

最好将您的问题 post 转给 nDPI 的 github 问题: https://github.com/ntop/nDPI/issues