nDPI流量协议分析(应用软件识别)
nDPI識別的協議號大全
#ifndef _NDPI_H_
#define _NDPI_H_
typedef enum {
?NDPI_PROTOCOL_FTP_CONTROL=1 ?, ?// ?1 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_MAIL_POP ?, ?// ?2
?NDPI_PROTOCOL_MAIL_SMTP ?, ?// ?3
?NDPI_PROTOCOL_MAIL_IMAP ?, ?// 4
?NDPI_PROTOCOL_DNS ?????????????, ?// ?5
?NDPI_PROTOCOL_IPP ?, ?// ?6
?NDPI_PROTOCOL_HTTP ????????????, ??// ?7
?NDPI_PROTOCOL_MDNS ?, ?// ?8
?NDPI_PROTOCOL_NTP ?, ?// ?9
?NDPI_PROTOCOL_NETBIOS ?, ?// ?10
?NDPI_PROTOCOL_NFS ?, ?// ?11
?NDPI_PROTOCOL_SSDP ?, ?// ?12
?NDPI_PROTOCOL_BGP ?, ?// ?13
?NDPI_PROTOCOL_SNMP ?, ?// ?14
?NDPI_PROTOCOL_XDMCP ?, ?// ?15
?NDPI_PROTOCOL_SMB ?, ?// ?16
?NDPI_PROTOCOL_SYSLOG ?, ?// ?17
?NDPI_PROTOCOL_DHCP ?, ?// ?18
?NDPI_PROTOCOL_POSTGRES ?, ?// ?19
?NDPI_PROTOCOL_MYSQL ?, ?// ?20
?NDPI_PROTOCOL_TDS ?, ?// ?21
?NDPI_PROTOCOL_DIRECT_DOWNLOAD_LINK,// ?22
?NDPI_PROTOCOL_MAIL_POPS, ?// ?23
?NDPI_PROTOCOL_APPLEJUICE, ?// ?24
?NDPI_PROTOCOL_DIRECTCONNECT, ?// ?25
?NDPI_PROTOCOL_SOCRATES ?, ?// ?26
?NDPI_PROTOCOL_WINMX ?, ?// ?27
?NDPI_PROTOCOL_VMWARE ?, ?// ?28
?NDPI_PROTOCOL_MAIL_SMTPS, ?// ?29
?NDPI_PROTOCOL_FILETOPIA, ?// ?30
?NDPI_PROTOCOL_IMESH ?, ?// ?31
?NDPI_PROTOCOL_KONTIKI ?, ?// ?32
?NDPI_PROTOCOL_OPENFT ?, ?// ?33
?NDPI_PROTOCOL_FASTTRACK, ?// ?34
?NDPI_PROTOCOL_GNUTELLA ?, ?// ?35
?NDPI_PROTOCOL_EDONKEY ?, ?// ?36 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_BITTORRENT, ?// ?37
?NDPI_PROTOCOL_EPP, ?// ?38
?NDPI_PROTOCOL_XBOX=47, ?// ?47
?NDPI_PROTOCOL_QQ ?, ?// ?48
?NDPI_PROTOCOL_MOVE , ?// ?49
?NDPI_PROTOCOL_RTSP ?, ?// ?50
?NDPI_PROTOCOL_MAIL_IMAPS, ?// ?51
?NDPI_PROTOCOL_ICECAST ?, ?// ?52
?NDPI_PROTOCOL_PPLIVE ?, ?// ?53 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_PPSTREAM, ?// ?54
?NDPI_PROTOCOL_ZATTOO ?, ?// ?55
?NDPI_PROTOCOL_SHOUTCAST, ?// ?56
?NDPI_PROTOCOL_SOPCAST ?, ?// ?57
?NDPI_PROTOCOL_TVANTS ?, ?// ?58
?NDPI_PROTOCOL_TVUPLAYER, ?// ?59
?NDPI_PROTOCOL_QQLIVE ?, ?// ?61
?NDPI_PROTOCOL_THUNDER ?, ?// ?62
?NDPI_PROTOCOL_SOULSEEK ?, ?// ?63
?NDPI_PROTOCOL_IRC ?, ?// ?65
?NDPI_PROTOCOL_AYIYA ?, ?// ?66
?NDPI_PROTOCOL_UNENCRYPED_JABBER, ?// ?67
?NDPI_PROTOCOL_MSN ?, ?// ?68
?NDPI_PROTOCOL_OSCAR ?, ?// ?69
?NDPI_PROTOCOL_YAHOO ?, ?// ?70
?NDPI_PROTOCOL_BATTLEFIELD ?, ?// ?71
?NDPI_PROTOCOL_QUAKE ?, ?// ?72
?NDPI_PROTOCOL_STEAM ?, ?// ?74 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_HALFLIFE2, ?// ?75
?NDPI_PROTOCOL_WORLDOFWARCRAFT, ?// ?76
?NDPI_PROTOCOL_TELNET ?, ?// ?77
?NDPI_PROTOCOL_STUN ?, ?// ?78
NDPI_PROTOCOL_IP_IPSEC ????????, ?// ?????????79
NDPI_PROTOCOL_IP_GRE ????????????, ?// ?????????80
NDPI_PROTOCOL_IP_ICMP ???????????, ?// ?????????81
NDPI_PROTOCOL_IP_IGMP ???????????, ?// ?????????82
NDPI_PROTOCOL_IP_EGP ????????????, ?// ?????????83
NDPI_PROTOCOL_IP_SCTP ???????????, ?// ?????????84
NDPI_PROTOCOL_IP_OSPF ???????????, ?// ?????????85
NDPI_PROTOCOL_IP_IP_IN_IP ???????, ?// ?????????86
?NDPI_PROTOCOL_RTP ?, ?// ?87
?NDPI_PROTOCOL_RDP ?, ?// ?88
?NDPI_PROTOCOL_VNC ?, ?// ?89
?NDPI_PROTOCOL_PCANYWHERE, ?// ?90
NDPI_PROTOCOL_SSL ???, ?// ?91
?NDPI_PROTOCOL_SSH ?, ?// ?92
?NDPI_PROTOCOL_USENET ?, ?// ?93
?NDPI_PROTOCOL_MGCP ?, ?// ?94
?NDPI_PROTOCOL_IAX ?, ?// ?95
?NDPI_PROTOCOL_TFTP ?, ?// ?96
?NDPI_PROTOCOL_AFP ?, ?// ?97
?NDPI_PROTOCOL_STEALTHNET, ?// ?98
?NDPI_PROTOCOL_AIMINI ?, ?// ?99
?NDPI_PROTOCOL_SIP ?, ?// ?100
?NDPI_PROTOCOL_TRUPHONE ?, ?// ?101
?NDPI_PROTOCOL_DHCPV6 ?, ?// ?103
?NDPI_PROTOCOL_ARMAGETRON, ?// ?104
?NDPI_PROTOCOL_CROSSFIRE, ?// ?105
?NDPI_PROTOCOL_DOFUS ?, ?// ?106
?NDPI_PROTOCOL_FIESTA ?, ?// ?107
?NDPI_PROTOCOL_FLORENSIA, ?// ?108
?NDPI_PROTOCOL_GUILDWARS, ?// ?109
?NDPI_PROTOCOL_KERBEROS ?, ?// ?111
?NDPI_PROTOCOL_LDAP ?, ?// ?112
?NDPI_PROTOCOL_MAPLESTORY, ?// ?113
?NDPI_PROTOCOL_MSSQL ?// ?114
?NDPI_PROTOCOL_PPTP ?, ?// ?115
?NDPI_PROTOCOL_WARCRAFT3, ?// ?116
?NDPI_PROTOCOL_WORLD_OF_KUNG_FU ?, ?// ????117
?NDPI_PROTOCOL_MEEBO ?, ?// ?118
?NDPI_PROTOCOL_DROPBOX ?, ?// ?121
?NDPI_PROTOCOL_SKYPE ?, ?// ?125
?NDPI_PROTOCOL_DCERPC ?, ?// ?127
?NDPI_PROTOCOL_NETFLOW ?, ?// ?128
?NDPI_PROTOCOL_SFLOW ?, ?// ?129
?NDPI_PROTOCOL_HTTP_CONNECT ???, ?// ?????????130
?NDPI_PROTOCOL_HTTP_PROXY ??????, ?// ?????????131
?NDPI_PROTOCOL_CITRIX ?, ?// ?132
?NDPI_PROTOCOL_SKYFILE_PREPAID ?, ?// ?136
?NDPI_PROTOCOL_SKYFILE_RUDICS ?, ?// ?137
?NDPI_PROTOCOL_SKYFILE_POSTPAID ?, ?// ????138
?NDPI_PROTOCOL_CITRIX_ONLINE ?, ?// ?139
?NDPI_PROTOCOL_WEBEX ?, ?// ?141
?NDPI_PROTOCOL_VIBER ?, ?// ?144
?NDPI_PROTOCOL_RADIUS ?, ?// ?146
?NDPI_SERVICE_WINDOWS_UPDATE ?, ?// ?147
?NDPI_PROTOCOL_TEAMVIEWER ?, ?// ?148 /* xplico.org */
?NDPI_PROTOCOL_LOTUS_NOTES ?, ?// ?150
?NDPI_PROTOCOL_SAP ?, ?// ?151
?NDPI_PROTOCOL_GTP ?, ?// ?152
?NDPI_PROTOCOL_UPNP ?, ?// ?153
?NDPI_PROTOCOL_LLMNR ?, ?// ?154
?NDPI_PROTOCOL_REMOTE_SCAN ?, ?// ?155
?NDPI_PROTOCOL_SPOTIFY ?, ?// ?156
?NDPI_PROTOCOL_H323 ?, ?// ?158 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_OPENVPN ?, ?// ?159 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_NOE ?, ?// ?160 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_CISCOVPN ?, ?// ????161 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_TEAMSPEAK ?, ?// ?162 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_TOR ?, ?// ?163 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_SKINNY ?, ?// ?164 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_RTCP ?, ?// ?165 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_RSYNC ?, ?// ?166 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_ORACLE ?, ?// ?167 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_CORBA ?, ?// ?168 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_UBUNTUONE ?, ?// ??? ?169 /* Remy Mudingay <mudingay@ill.fr> */
?NDPI_PROTOCOL_WHOIS_DAS ?, ?// ?170
?NDPI_PROTOCOL_COLLECTD ?, ?// ????171
?NDPI_PROTOCOL_SOCKS5 ??????????, ?// ?????????172 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_SOCKS4 ??????????, ?// ?????????173 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_RTMP ?, ?// ?174 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_FTP_DATA ?, ?// ????????175 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_ZMQ ???????????????, ?// ??????????????????????177
?NDPI_PROTOCOL_MEGACO ???? , ?// ?181 /* Gianluca Costa <g.costa@xplico.org> */
?NDPI_PROTOCOL_REDIS ?????????????, ?// ??????????????????????182
?NDPI_PROTOCOL_PANDO ?, ?// ?183 /* Tomasz Bujlow <tomasz@skatnet.dk> */
?NDPI_PROTOCOL_VHUA ??????????????, ?// ??????????????????????184
?NDPI_PROTOCOL_TELEGRAM ?, ?// ????185 /* Gianluca Costa <g.costa@xplico.org> */
?NDPI_PROTOCOL_QUIC ?, ?// ????188 /* Andrea Buscarinu <andrea.buscarinu@gmail.com> - Michele Campus <michelecampus5@gmail.com> */
?NDPI_PROTOCOL_WHATSAPP_VOICE ?, ?// ????189
?NDPI_PROTOCOL_EAQ, ?//
?NDPI_PROTOCOL_STARCRAFT , ?// ????213 /* Matteo Bracci <matteobracci1@gmail.com> */
?NDPI_PROTOCOL_TEREDO , ?// ????????214
?NDPI_PROTOCOL_UNKNOWN
} L7ProtocolId;
#endif
1. 介紹
nDPI是一個從OpenDPI發展而來的DPI庫,現在由ntop組織負責維護。
為了給你提供一個跨平臺DPI的體驗,nDPI除了支持Unix平臺,還支持Windows(和Mac)。為了使nDPI更加適合應用于流量監控,我們將會持續進行優化,比如一旦發現存在對網絡流量監控非必須的、卻拖慢了DPI引擎的功能時,可以執行關閉。
不管使用了哪個端口,nDPI都可以探測到實際的應用層協議。這意味著既可以探測運行在非標準端口上的協議(e.g探測運行在非80端口上的http流量),又可以探測運行在一個標準端口上的其他協議(e.g探測運行在80端口上的Skype流量)。這是因為現在端口跟協議關聯的概念已經被打破。
在過去的幾個月里,我們已經為nDPI增加了以下多個功能:
一個名為ndpiReader的增強型demo
可以被編譯進kernel成為一個模塊,使其更加高效
從各方面提升了識別速度,目前nDPI在這方面已經遠遠超過了前代的OpenDPI
新增了大量的協議支持(目前為止已經支持超過180種協議),覆蓋范圍從商業類協議(如SAP和Citrix)到桌面協議(如Dropbox和Spotify)
可以定義基于端口(端口范圍)的協議探測,豐富了傳統的僅僅基于端口的探測手段
為了使nDPI支持探測加密連接,我們增加一個用于SSL的解碼器(同時支持客戶端和服務端),用以找出那些使用了加密證書的協議。這使我們可以識別那些以前無法探測到的協議,比如Citrix和AppleiCloud等
通過基于額外的一些字符串匹配方式,我們可以支持識別一些常見的應用子協議
2. 代碼下載
在你搭建ntop和nProbe的過程中nDPI就會自動被下載。也可以作為一個獨立的DPI庫來使用,源代碼可以通過gitclone https://github.com/ntop/nDPI.git下載。
或者:https://github.com/ntop/nDPI/archive/2.4.tar.gz
3. nDPI庫安裝
其他
安裝方式跟平臺以及發行版相關,這里列舉了一些:Ubuntu/Debian #apt-get install build-essential#apt-get install git autoconf automake autogen libpcap-dev libtoolFedora/CentOS #yum groupinstall "Development tools"#yum install git autoconf automake autogen libpcap-devel libtoolMacOSX(using http://brew.sh) # brew install autoconf automake libtool gitFreeBSD #pkg install autoconf automake libtool gmake git依賴環境:
libpcap autotools libtool gawk gcc build-essential安裝:
cd nDPI ./autogen.sh ./configure make cd example ./ndpiReader --helpVersion2.0版本在工程目錄下執行make時,默認就編譯了example目錄下的ndpiReader
4. ndpiReader的命令行選項
以下列出了該demo程序的有效選項以及對應的簡單解釋
$./ndpiReader -hndpiReader-i <file|device> [-f <filter>][-s <duration>][-m<duration>][-p<protos>][-l <loops> [-q][-d][-h][-t][-v <level>][-n<threads>] [-w <file>] [-j <file>]Usage:-i<file.pcap|device>???????????????????|指定一個需要被識別的pcap文件/文件列表,或者需要被嗅探的|設備接口/接口列表(文件列表或接口列表使用","作為分隔符)-f<BPF filter>????????????????????????????|指定一條BPF規則的過濾字串-s<duration>?????????????????????????????|最大的嗅探時間(顯然只在嗅探接口時生效)-m<duration>????????????????????????????| pcap文件分段解析超時時間(顯然只在解析pcap文件時生效)-p<file>.protos??????????????????????????|指定一個自定義的協議識別配置文件(eg.protos.txt)-l<num loops>???????????????????????????|指定循環執行嗅探的次數(僅用于測試)-n<num threads>???????????????????????|指定線程數量,缺省跟設備接口數量對應|如果傳入的是pcap文件時固定使用單線程-j<file.json>???????????????????????????????|指定一個輸出包內容的json文件-g<id:id...>????????????????????????????????|指定線程-CPU親和關系映射表-d??????????????????????????????????????????????|禁止協議猜測功能-q??????????????????????????????????????????????|安靜模式,意味著不打印信息-t???????????????????????????????????????????????|解析GTP隧道協議-r???????????????????????????????????????????????|打印 nDPI版本和git版本-w<path>??????????????????????????????????|指定測試信息的輸出文件-h??????????????????????????????????????????????| help信息-v<1|2|3>??????????????????????????????????|按級別進一步打印包的詳細信息,分為1、2、3級
5. 協議文件
通過基于字符串的匹配方式,nDPI可以支持識別應用層的子協議。這是因為存在很多像AppleiCloud/iMessage,WhatsApp等新出現的子協議,以及其他使用http(s)的協議,這些協議可以通過解碼主機SSL證書或http頭中的"Host"字段而被識別。因此我們決定嵌入一個有效字符串匹配庫到nDPI中,這個庫基于AC自動機算法來匹配成百上千的有效子串(i.e運行在商業硬件上的nDPI可以處理超過10Gbit的流量)
通過使用一個協議文件,你可以在運行時設置自定義的子協議,這個協議文件的格式如下:
# Subprotocols
# Format:
# host:"<value>",host:"<value>",.....@<subproto>
host:"googlesyndication.com"@Google
host:"venere.com"@Venere
host:"kataweb.it",host:"repubblica.it"@Repubblica
host:"ntop"@ntop
你還可以配置基于IP的子協議,格式如下:
# IP based Subprotocols
# Format:
# ip:<value>,ip:<value>,.....@<subproto>
ip:213.75.170.11@CustomProtocol
你還可以配置基于端口的子協議,格式如下:
# Format:
# <tcp|udp>:<port>,<tcp|udp>:<port>,.....@<proto>
tcp:81,tcp:8181@HTTP
udp:5061-5062@SIP
tcp:860,udp:860,tcp:3260,udp:3260@iSCSI
tcp:3000@ntop
只需要在運行ndpiReader時加上使用“-p”選項,就可以測試你自定義的配置協議了。當然你也可以通過在你的程序中調用nDPI的APIndpi_load_protocols_file()來測試你的配置。
6 .示例
這節中我們將展示一些demo程序ndpiReader的使用范例。
6.1現場捕獲模式
下面這個例子展示了ndpiReader的現場捕獲模式,其中“-i”選項用來指定需要進行嗅探的設備接口,“-s”選項指定了嗅探的時間。
$sudo ./ndpiReader -i eth0 -s 20-----------------------------------------------------------*NOTE: This is demo app to show *some* nDPI features.*In this demo we have implemented only some basic features*just to show you what you can do with the library. Feel*free to extend it and send us the patches for inclusion------------------------------------------------------------UsingnDPI (2.0.0-838-6607c33) [1 thread(s)]Capturinglive traffic from device eth0...Capturingtraffic up to 5 secondsRunningthread 0...nDPIMemory statistics:nDPIMemory (once): 93.13 KBFlowMemory (per flow): 1.25 KBActualMemory: 1.49 MBPeakMemory: 1.49 MBTrafficstatistics:Ethernetbytes: 80367 (includes ethernet CRC/IFC/trailer)Discardedbytes: 1200IPpackets: 236 of 256 packets totalIPbytes: 74703 (avg pkt size 291 bytes)Uniqueflows: 165TCPPackets: 0UDPPackets: 230VLANPackets: 4MPLSPackets: 0PPPoEPackets: 0FragmentedPackets: 0MaxPacket size: 328PacketLen < 64: 28PacketLen 64-128: 9PacketLen 128-256: 6PacketLen 256-1024: 193PacketLen 1024-1500: 0PacketLen > 1500: 0nDPIthroughput: 47.22 pps / 125.62 Kb/secAnalysisbegin: 01/Jan/1970 08:00:00Analysisend: 01/Jan/1970 08:00:00Trafficthroughput: 47.22 pps / 125.62 Kb/secTrafficduration: 4.998 secGuessedflow protos: 1Detectedprotocols:Unknown packets: 194 bytes: 69976 flows: 143NetBIOS packets: 19 bytes: 2116 flows: 8SSDP packets: 2 bytes: 416 flows: 2IGMP packets: 2 bytes: 120 flows: 2ICMPV6 packets: 4 bytes: 344 flows: 1DHCPV6 packets: 3 bytes: 455 flows: 3LLMNR packets: 10 bytes: 760 flows: 5Cloudflare packets: 2 bytes: 516 flows: 1Protocolstatistics:Acceptable 4727 bytesUnrated 69976 bytes
6.2文件捕獲模式
最簡單的創建一個pcap文件的方法是使用tcpdump命令,就像下面這個例子一項:
$sudo tcpdump -i eth0 -w /var/tmp/capture.pcap -vtcpdump:listening on eth0, link-type EN10MB (Ethernet), capture size 262144bytes^C248packets captured252packets received by filter0packets dropped by kernel一旦pcap文件被創建,你就可以像下面這樣運行ndpiReader:
$sudo ./ndpiReader -i /var/tmp/capture.pcap-----------------------------------------------------------*NOTE: This is demo app to show *some* nDPI features.*In this demo we have implemented only some basic features*just to show you what you can do with the library. Feel*free to extend it and send us the patches for inclusion------------------------------------------------------------UsingnDPI (2.0.0-838-6607c33) [1 thread(s)]Capturinglive traffic from device eth0...Capturingtraffic up to 5 secondsRunningthread 0...nDPIMemory statistics:nDPIMemory (once): 93.13 KBFlowMemory (per flow): 1.25 KBActualMemory: 1.49 MBPeakMemory: 1.49 MBTrafficstatistics:Ethernetbytes: 80650 (includes ethernet CRC/IFC/trailer)Discardedbytes: 1020IPpackets: 231 of 248 packets totalIPbytes: 75106 (avg pkt size 302 bytes)Uniqueflows: 164TCPPackets: 2UDPPackets: 227VLANPackets: 1MPLSPackets: 0PPPoEPackets: 0FragmentedPackets: 0MaxPacket size: 328PacketLen < 64: 19PacketLen 64-128: 6PacketLen 128-256: 13PacketLen 256-1024: 193PacketLen 1024-1500: 0PacketLen > 1500: 0nDPIthroughput: 155.03 K pps / 412.96 Mb/secAnalysisbegin: 14/Dec/2017 15:37:39Analysisend: 14/Dec/2017 15:37:44Trafficthroughput: 49.59 pps / 135.25 Kb/secTrafficduration: 4.659 secGuessedflow protos: 0Detectedprotocols:Unknown packets: 200 bytes: 71136 flows: 146MDNS packets: 6 bytes: 1197 flows: 3NetBIOS packets: 6 bytes: 552 flows: 3SSDP packets: 3 bytes: 624 flows: 2ICMPV6 packets: 1 bytes: 86 flows: 1DHCPV6 packets: 5 bytes: 761 flows: 5LLMNR packets: 10 bytes: 750 flows: 4Protocolstatistics:Acceptable 3970 bytesUnrated 71136 bytes6.3協議文件
為了闡述清楚協議文件的作用,我們現在就來講解如何識別ntop.org的流量。
可以像下面這樣編輯protos.txt.
$echo 'host:"ntop.org"@nTop' > protos.txt
修改完協議文件之后,你就可以像下面這樣運行ndpiReader:
$sudo ./ndpiReader -i eth0 -s 30 -p ./protos.txt
7.API nDPI
這節中高亮的就是nDPI的API。
這節中將ndpiReader作為一個基本范例來展示如何初始化nDPI庫。首先需要一個編譯完成的庫以及一個合適的Makefile(i.e就像ndpiReader的Makefile那樣)
為了在你的程序中使用nDPI的API,你除了要include自己的頭文件外,還需要添加類似下面這一行:
#include<ndpi/ndpi_main.h>
庫可以按照下面的順序執行初始化:
[1].創建并初始化一個nDPI核心庫探測模塊
structndpi_detection_module_struct * module =ndpi_init_detection_module();
備注:本API格式在Version2.0版本中較之前版本差異很大。
這個探測模塊中維護了所有支持的協議。
本API只是注冊了所有支持的協議,但并未使能其中任何一個協議
[2].ndpiReader接下來通過一些宏使能了探測模塊中的所有協議(顯然你可以根據自己的需求來決定使能哪些協議)
NDPI_BITMASK_SET_ALL(all);
ndpi_set_protocol_detection_bitmask2(
structndpi_detection_module_struct *ndpi_struct,
constNDPI_PROTOCOL_BITMASK * dbm);
參數含義如下:
@ndpi_struct指向當前操作的探測模塊
@dbm調用者實際通過該集合來控制實際需要應用的協議,只有該字段中被置1的對應協議,其協議分析器才真正允許被加載
備注:本API的作用就是使能一個已經初始化的nDPI核心庫探測模塊中的協議
[3].為了導入已經存在的協議文件,你還必須調用下面的API
ndpi_load_protocols_file(structndpi_detection_module_struct *ndpi_mod, char* path);
參數含義如下:
@ndpi_mod指向當前操作的探測模塊
@path協議文件的路徑
[4].一旦從你的pcap文件或設備接口上捕獲到了數據流,就可以調用下面的API來進行分析
ndpi_protocolndpi_detection_process_packet(
structndpi_detection_module_struct *ndpi_struct,
structndpi_flow_struct *flow,
constunsigned char *packet,
constunsigned short packetlen,
constu_int64_t current_tick_l,
structndpi_id_struct *src,
structndpi_id_struct *dst)
參數含義如下:
@ndpi_struct指向傳入包所屬的探測模塊
@ndpi_flow指向傳入包所屬的數據流
@packet指向傳入包的IP頭
@packetlen IP包的長度
@current_tick_l收到該IP包的時間(ms)
@src指向源用戶狀態機
@dst指向目的用戶狀態機
備注:本API是ndpi核心庫處理收到包的入口,通過分析傳入的IP包,完成數據流的識別,最后返回是別結果.
如果想了解更深入的信息,我們建議你閱讀下面這些文件:
nDPI/example/pcapReader.c,
nDPI/src/include/ndpi_structs.h,
nDPI/src/include/ndpi_public_functions.h
nDPI/src/ndpi_main.c.
具體的協議解析器文件都被放在nDPI/src/protocols文件夾中。??????????????????
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的nDPI流量协议分析(应用软件识别)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图的DFS和BFS
- 下一篇: matlab实现线性规划