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 只能识别我的协议文件中列出的协议,而不能识别其他协议。我猜这里有两种可能性:
我在启动 nDPI 和“预烘焙”列表时做错了
协议还没有绑定?还是被抹杀了? ...或者什么...?
我捕获数据包的代码搞砸了
nDPI 无法读取。
老实说,我怀疑是(2)…但万一问题可能是(1),我想问问这个论坛。有人看到我的方法有问题吗?谢谢。
编辑:我添加了对“ndpi_finalize_initalization()”的调用,这在 post 的原始版本中是缺失的。不幸的是,这不会改变程序的行为...
加载协议文件补充内置协议;它不会覆盖它们。
在添加 ndpi_load_protocols_file
之前确保解码按预期工作。
最好将您的问题 post 转给 nDPI 的 github 问题:
https://github.com/ntop/nDPI/issues
我一直在通过大量的反复试验和本论坛的帮助学习 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 只能识别我的协议文件中列出的协议,而不能识别其他协议。我猜这里有两种可能性:
我在启动 nDPI 和“预烘焙”列表时做错了 协议还没有绑定?还是被抹杀了? ...或者什么...?
我捕获数据包的代码搞砸了 nDPI 无法读取。
老实说,我怀疑是(2)…但万一问题可能是(1),我想问问这个论坛。有人看到我的方法有问题吗?谢谢。
编辑:我添加了对“ndpi_finalize_initalization()”的调用,这在 post 的原始版本中是缺失的。不幸的是,这不会改变程序的行为...
加载协议文件补充内置协议;它不会覆盖它们。
在添加 ndpi_load_protocols_file
之前确保解码按预期工作。
最好将您的问题 post 转给 nDPI 的 github 问题: https://github.com/ntop/nDPI/issues