微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nDPI ::提供协议列表会删除“默认”协议列表吗?

如何解决nDPI ::提供协议列表会删除“默认”协议列表吗?

我已经通过反复试验和本论坛的帮助来学习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,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()”中,该调用在本文的原始版本中丢失。不幸的是,这不会改变程序的行为...

解决方法

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

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

最好将您的问题发布到 nDPI 的 github 问题: https://github.com/ntop/nDPI/issues

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。