• 1. DPI培训文档
  • 2. DPI的概念和应用  DPI技术,即DPI(Deep Packet Inspection)深度包检测技术是一种基于应用层的流量检测和控制技术,当IP数据包、TCP或UDP数据流通过基于DPI技术的带宽管理系统时,该系统通过深入读取IP包载荷的内容来对OSI七层协议中的应用层信息进行重组,从而得到整个应用程序的内容。   基于DPI技术的带宽管理解决方案与我们熟知的防病毒软件系统在某些方面比较类似,即其能识别的应用类型必须为系统已知的,以用户熟知的BT为例,其Handshake的协议特征字为“.BitTorrent Protocol”;换句话说,防病毒系统后台要有一个庞大的病毒特征数据库,基于DPI技术的带宽管理系统也要维护一个应用特征数据库,当流量经过时,通过将解包后的应用信息与后台特征数据库进行比较来确定应用类型;而当有新的应用出现时,后台的应用特征数据库也要更新才能具有对新型应用的识别和控制能力。
  • 3. 应用程序流量的特征分析应用程序的流量:通常含有多个tcp和udp连接。 DPI最基本的单位:连接 如何标示多个报文属于同一个连接:五元组 五元组的概念:源目ip、传输层协议、源目端口号
  • 4. 如何识别? 通过识别应用程序的每一个连接,从而识别一个应用程序所有的流量,那么如何识别一个连接? 通过五元组信息识别 通过HTTP头域字段值识别 通过应用层数据中的特殊字符串识别 通过连接流的特征识别 通过peer学习识别
  • 5. 五元组信息识别 对于一些标准协议,比如DNS等,由于其端口号固定,可以使用端口号识别。这种识别方式简单高效,但容易造成误识别,比如某个应用程序伪装成标准协议的端口号。 某些应用流量的目的ip由dns解析得出,或者ip地址为固定的几个,则可以使用域名或ip地址识别。如果端口号也是固定的,则可以同时使用域名加端口号或ip加端口号。
  • 6. HTTP头域字段值识别 由于HTTP协议头域中通常存在多个字段,并且该字段的值与应用相关联,以Pplive视频的http流量为例,其Referer字段的值含有player.pplive.cn,并且content-type为video/mp4,很容易通过这2个字段的值来识别该连接为Pplive视频的流量。
  • 7. 应用层数据中的特殊字符串识别 对于非HTTP的TCP连接和UDP连接来说,如果无法通过五元组信息识别,字符串识别是可以优先考虑的。 以BT下载中的peer之间的tcp连接为例,请求和响应中均含有特殊字符串13-42-69-74-54-6f-72-72-65-6e-74-20-70-72-6f-74-6f-63-6f-6c。
  • 8. 连接流的特征识别 对于非HTTP的TCP连接和UDP连接来说,如果无法通过五元组信息识别,应用层数据中也不存在特殊字符串,那么,可以考虑从连接流的特征来识别,通常这种特征需抓取更多次数报文来验证。 流的特征: 应用层数据载荷长度<>=固定值 应用层数据载荷长度<>=载荷中2或4个字节大端或小端取值±固定值 应用层数据载荷最开始或结尾的几个字节为某固定值
  • 9. 连接流的特征识别 以大话西游3的游戏过程中的tcp连接为例,第一个报文的第一个字节为04,并且载荷长度为5,第二个报文载荷长度为3: 以eMule下载的tcp连接为例,其前2个报文的第一个字节为e3,2-5这4个字节通过小端字节序取值+5=载荷长度:
  • 10. 连接流的特征识别 以QQ登陆的UDP报文为例,其载荷的第一个字节为02,最后一个字节为03:
  • 11. 适用于识别大多数P2P视频、下载的应用中的UDP流量。   P2P的概念?   通常在启动P2P应用时,client会向某个server提交和请求信息,提交包括其监听的端口号、所拥有的资源,在开始下载时会请求拥有该资源的其它peer,并且在之后的下载过程中一直会使用该端口号,对于该server我们称之为打洞服务器。P2P应用的UDP连接很多,通过分析多种P2P应用,我们发现这些连接的源端口都一样,并且为最初和打洞服务器通信时所用的端口号,因此我们的想法是让设备自动学习到该client的ip端口对,以后每有一个新连接,直接用该连接的ip端口对去与学习到的ip端口对匹配,匹配上的话直接识别为该应用。   那么如何学习该ip端口对呢?就是通过打洞服务器,通常该服务器的ip是通过某个域名DNS解析得到的,并且服务器端监听的端口号为固定的一个或几个。以tmedia.p2sp.baidu.com域名端口号8000为例,tmedia.p2sp.baidu.com解析的ip为123.125.113.30,如果出现UDP连接的目的ip是该123.125.113.30,并且端口号为8000,则学习该UDP连接的源ip端口对。 对于以上五种识别方式,通常是多种结合起来使用来识别一个应用。peer学习识别
  • 12. 特征库的组织 特征库共有8个文件: dpi.sum dpi.class dpi.hostgroup dpi.domain dpi.ip dpi.proto dpi.feature dpi.rule
  • 13. 特征库的组织 dpi.sum文件的内容和解释:   [proto]count=1000  Proto项指定特征库支持的proto数量,设备初始化时跟据该数分配相应的数据结构个数(外加内置的应用个数)。  [hostgroup]count=300  Hostgroup项指定特征库支持的hostgroup数量,设备初始化时跟据该数分配相应的数据结构个数(外加名为”n/a”的hostgroup)。  [ip]count=10000  Ip项指定特征库支持的ip个数,设备初始化时跟据该数分配相应的数据结构个数。  [domain]count=1000  Domain项指定特征库支持的domain个数,设备初始化时跟据该数分配相应的数据结构个数。  [feature]count=10000  Feature项指定特征库支持的feature个数,设备初始化时跟据该数分配相应的数据结构个数。 dpi.sum的内容和解释
  • 14. 特征库的组织 dpi.class的内容和解释 :name指定类的名字,为设备内部使用的,alias为该类的别名,展示给人看的。类型均为设备内置,此文件的作用仅仅是在初始化时给类一个别名。[class]name=net-proto,alias=网络协议[class]name=http,alias=web2.0[class]name=mail,alias=邮件[class]name=im,alias=聊天[class]name=file-transfer,alias=文件传输[class]name=download,alias=非p2p下载class]name=p2p-stream,alias=p2p流量[class]name=http-stream,alias=http流媒体[class]name=game,alias=游戏[class]name=finance,alias=财经股票[class]name=office,alias=办公软件[class]name=remote-control,alias=远程控制[class]name=proxy,alias=代理[class]name=trojan,alias=木马[class]name=software-update,alias=软件更新[class]name=e-bank,alias=电子银行[class]name=net-meeting,alias=视频会议[class]name=mobile-tool,alias=移动工具[class]name=mobile-social,alias=移动社交
  • 15. 特征库的组织 dpi.hostgroup:在我们需要使用一个新的域名或ip来作为特征时,我们首先得添加一个hostgroup,其格式如下: [hostgroup]name=baiduyingyin01 name指定这个hostgroup的名字。 dpi.domain:在我们需要使用一个新的域名作为特征时,创建一个hostgroup之后,我们需要指定其所拥有的域名,其格式如下: [domain]host=tmedia.p2sp.baidu.com,hostgroup=baiduyingyin01 host为新的域名,hostgroup指定它所属的hostgroup。 dpi.ip:在我们需要使用一个新的的ip做为特征时,创建一个hostgroup之后,我们需要指定其所拥有的ip,其格式如下: [ip]address=123.125.113.30,hostgroup=baiduyingyin01 address为新的ip,hostgroup指定它所属的hostgroup。 多个domain和ip可以同时属于一个hostgroup,不同的hostgroup所拥有的domain和ip不能冲突,因为每次安装ip时,如果已经存在会重置hostgroup。
  • 16. dpi.proto:当我们需要指定一个新的应用时,我们需要创建一条proto记录,其格式如下: [proto]name=baiduyingyin,alias=百度影音,class=p2p-stream,pri=high name指定该应用的内部名字,alas指定该应用的别名,class指定该应用所属的大类,pri指定该应用的优先级,可以是high、low、mid,在一个连接如果匹配到多个proto时,优先级高的会生效。特征库的组织
  • 17. 特征库的组织 dpi.feature:通常一个应用有多个特征,对于每一个特征,我们需要创建一个feature,feature分为4大种,分别为port、str或hex、http-*、sp-*,分别对应之前的讲的4种识别方式,即五元组信息识别、特殊字符串识别、http头域字段识别、连接的流特征识别,其格式如下:[feature]type=port,name=baiduyingyin001,hostgroup=baiduyingyin01,host-dir=request,pattern-dir=request,l4=tcp,port=8000[feature]type=string,name=fetion003,hostgroup=n/a,host-dir=n/a,pattern-dir=request,l4=tcp,sport=0,dport=8000,value=fetion.com.cn,offset=0,nocase=1,depth=128[feature]type=hex,name=qqgame037,hostgroup=n/a,host-dir=n/a,pattern-dir=request,l4=tcp,sport=0,dport=80,value=06-48,offset=2,nocase=1,depth=4[feature]type=http-host,name=sjsanguosha001,hostgroup=n/a,host-dir=n/a,pattern-dir=request,value=mobile.bianfeng.com,offset=0,nocase=1,depth=0[feature]type=sp-len,name=qvod009,hostgroup=n/a,host-dir=n/a,pattern-dir=request,l4=tcp,sport=0,dport=0,cond=eq,value=88[feature]type=sp-w-vs-w,name=qq008,hostgroup=n/a,host-dir=n/a,pattern-dir=request,l4=udp,sport=0,dport=0,offset1=0,bytewidth1=1b,cond1=eq,value1=2,offset2=-1,bytewidth2=1b,cond2=eq,value2=3[feature]type=sp-w-vs-len,name=qqkart012,hostgroup=n/a,host-dir=n/a,pattern-dir=reply,l4=tcp,sport=0,dport=0,offset=0,bytewidth=be4b,op=del,value=5
  • 18. 特征库的组织type指定featufe的类型,port、str或hex、http-*、sp-*name指定feature的名字,名字必须是唯一的。hostgroup指定与featufe绑定的hostgroup,n/a为不绑定,hostgroup的匹配在连接新建过程完成。host-dir为request时,必须是正向五元组中目的ip与hostgroup中的ip匹配, 为reply时,必须是反向五元组的目的ip与hostgroup中的ip匹配, 为n/a不关心方向,host-dir的匹配也是连接新建过程完成。 不论feature为何种类型,type,name,hostgroup,host-dir都有,并且意义相同:注:正向五元组和反向五元组的概念-->正向五元组为触发会话新建的报文的原始五元组,反向五元组为原始五元组的反转。
  • 19. 除了通用字段,其它类型的feature有自己的私有字段 port类型的私有字段: pattern-dir:指定port是哪个方向的目的端口号,n/a为不不关心方向,request指正向五元组的目的ip,reply指反向五元组的目的ip。 l4:指定传输层协议,可为tcp或udp port:指定目的端口号,0为不关心端口号 string类型的私有字段: pattern-dir:指定是哪个方向的报文,n/a为不关心方向,request指请求报文,reply指响应报文。 l4:指定传输层协议,可为tcp或udp sport:指定源端口号,0为不关心端口号 dport:指定目的端口号,0为不关心端口号 value:字符串的值,一般字符串为0-9a-zA-Z offset:限定value指定的字符串出现的起始位置,0为不限定 nocase:指定是否区分大小写,0区分,1为不区分 depth:限定value指定的字符串出现的结束位置,0为不限定 hex类型的私有字段: 与string类型的唯一区别是value的值使用字ascii码的十六进制值表示,一般字符串中含有非0-9a-zA-Z时使用hex类型。特征库的组织
  • 20. 特征库的组织http类型有多个子类型,分别为http-host、http-post、http-get、http-referer、http-content-type、http-user-agent、http-cache-control、http-pragma、http-accept、http-cookie、http-server、http-proxy-connection,对应的私有字段如下: pattern-dir:指定是哪个方向的报文,n/a为不关心方向,request指请求报文,reply指响应报文。 value:type指定的头域字段值 offset:限定value指定的字符串出现的起始位置,0为不限定 nocase:指定是否区分大小写,0区分,1为不区分 depth:限定value指定的字符串出现的结束位置,0为不限定 sp-len类型的特征私有字段如下: pattern-dir:指定是哪个方向的报文,n/a为不关心方向,request指请求报文,reply指响应报文。 l4:指定传输层协议,可为tcp或udp sport:指定源端口号,0为不关心端口号 dport:指定目的端口号,0为不关心端口号 cond:可以为eq、less、more,分别指等于、小于、大于 value:为一个数字,一般是载荷长度
  • 21. 特征库的组织sp-w-vs-w类型的特征私有字段如下: pattern-dir:指定是哪个方向的报文,n/a为不关心方向,request指请求报文,reply指响应报文。 l4:指定传输层协议,可为tcp或udp sport:指定源端口号,0为不关心端口号 dport:指定目的端口号,0为不关心端口号 offset1:指定第一个字符的起始位置 bytewidth1:指定第一个字符的长度和大小端,可为1b、le2b、le4b、be2b、be4b cond1:指定第一个字符的值与报文中的值比较关系,为eq、less、more value1:指定第一个字符的值 offset2:指定第二个字符的起始位置 bytewidth2:指定第二个字符的长度和大小端,可为1b、le2b、le4b、be2b、be4b cond2:指定第二个字符的值与报文中的值比较关系,为eq、less、more value2:指定第二个字符的值
  • 22. sp-w-vs-len类型的私有字段: pattern-dir:指定是哪个方向的报文,n/a为不关心方向,request指请求报文,reply指响应报文。 l4:指定传输层协议,可为tcp或udp sport:指定源端口号,0为不关心端口号 dport:指定目的端口号,0为不关心端口号 offset:指定字符的起始位置 bytewidth:指定第字符的长度和大小端,可为1b、le2b、le4b、be2b、be4b op:指定字符的值与value的关系,可为add、del、and、or value:指定一个长度,通常为载荷长度 特征库的组织
  • 23. 特征库的组织 dpi.rule:每一条记录指定一条规则,一条规则包含一个或多个feature,最多10个,规则决定了如何识别一个应用、类、封装类型。 type指定规则的类型,type为proto时,target指定识别的应用名字,type为class时,指定识别的类的名字,type为encap时,指定封装类型,封装类型包括http、sock4、sock5。 peer-learn默认为n/a,只有在type为proto时,并且与该规则匹配的是P2P模型中的打洞报文时,才会使用该字段,置为reply时,学习打洞报文的反向向五元组中的目的ip端口对,置为request时,学习正向五元组中的目的ip端口对。 rule指定feature的组合顺序。这个顺序很重要,因为连接匹配到的feature顺序必须与rule中feature的组合顺序一致才算是匹配上rule。 [rule]type=proto,target=baiduvideo-series,peer-learn=reply,rule=baiduyingyin001>baiduyingyin002[rule]type=class,target=web-video,peer-learn=n/a,rule=f0011[rule]type=encap,target=http,peer-learn=n/a,rule=http001
  • 24. 特征的匹配顺序 关于连接匹配feature的顺序问题: 连接新建过程中完成的工作: 1.对于udp并且端口号为53的报文,直接识别为DNS协议。 2.取得源ip端口对和目的ip端口对进行peer匹配,匹配上peer的话,直接识别出应用,并且优先级为高,直接完成dpi识别。 3.对于没有匹配上peer的连接,进行hostgroup匹配,分别取得源目ip去ip hash中查找,若匹配上,则标记上匹配的hostgroup和host_dir。 4.使用hostgroup和host_dir以及五元组中的端口号,进行port类型的feature匹配。 连接新建完成后的工作,对于每一个有载荷的报文会进入以下流程,最多会有5个有载荷的报文会进入该流程,直到匹配上一个rule,若经过5个之后依然没有匹配上任何rule,则意味着没有识别出来。 1.对于新建过程中识别为DNS协议的报文,如果其域名在dpi.domain中存在,则需要将DNS进行解析,把domain对应的ip地址安装到ip hash链表中。 2.对于有载荷的tcp或udp报文,首先进行strhex类型的feature匹配。 3.进行sp特征匹配。 4.对于http封装的报文,会进行http类型的feature匹配。
  • 25. 特征的匹配顺序 由此匹配顺序可见,如果我们在一个报文中提取了多个特征,并且特征类型不同的情况下,必须关注feature的匹配顺序,从而决定rule文件中多个feature的顺序: 1.通常port类型的feature不需要与其它类型的feature组合,如果真的需要组合,很明显,port类型的feature必须放在最前面,因为只有连接新建的时候才会进行port类型匹配。 2.通常http类型的feature不需要与其它类型的feature组合。http类型的feature通常只与http类型的feature结合,比如,http-get和http-host,此时我们只需根据各个头域字段在报文中出现的先后顺序来组织feature即可。在少数情况下http类型的feature会和strhex型组合,此时,strhex类型的特征必须放在http类型的前面。 3.strhex类型的feature自身组合时,多个feature的顺序与其在报文中出现的顺序保持一致即可。 4.strhex类型的feature与sp类型的feature组合式,strhex类型的feature必须放在sp类型的前面。 5.sp类型的特征自身组合时,多个sp类型的特征必须与feature文件出现的顺序保持一致。 以上顺序讲解的是同一个报文中提取多个特征时的组合顺序,对于同一个连接上的多个报文来讲,从后续报文中提取的feature必须放在前一个报文之后。
  • 26. 分析过程和思路抓包,在抓包之前,杀死其它不相关但可能产生流量的进程,确保环境是干净的,使用ipconfig /flushdns清理dns缓存。开始抓包后,打开需要测试的应用,产生相关的业务流量,保存成pcap文件。 得到pcap文件之后,我们首先分析业务流量主要的分布情况,比如HTTP、TCP、UDP的比重,通常我们先从流量比重最大的部分开始分析,但是也不能放过一些流量较小,但是比较关键的连接,有时能从这些连接获取到关键信息,比如某个连接本身是用来获取资源地址列表的,后续的连接则只与资源列表相关。 对于HTTP部分,我们优先分析其头域各字段是否含有特殊的值来与该应用关联,比如get字段,host字段,referer字段,user-agent等。如果通过头域无法识别,我们可以进一步分析其5元组信息是否能通过别的连接关联上。 对于UDP部分,我们可以判断是否符合P2P模型,如果符合,分析出打洞服务器的ip和端口号。如果不符合,则分析是否能通过5元组信息识别,是否有特殊字符串,以及流的特征。 对于非HTTP的tcp部分,优先分析目的ip是否是通过某个域名解析出来的ip,是否含有特殊字符串,以及是否存在流的特征。