免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lujian19861986

多条iptables规则,netfilter的连接跟踪(ip_conntack)加速应用程序的识别 [复制链接]

论坛徽章:
0
发表于 2011-10-24 09:17 |显示全部楼层
你需要一种all in one的算法,例如AC多模匹备,或者是将所有l7filter的正则表达式做到一个DFA

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2011-10-24 10:01 |显示全部楼层
回复 10# kwest
直接限制session方法可行,但是非常不准确。尤其是现在的很多应用的session都非常多。比如360、skype等。

论坛徽章:
0
发表于 2011-10-25 10:06 |显示全部楼层
回复 11# 独孤九贱


    能说具体点吗? 怎么样all in one?谢谢

论坛徽章:
0
发表于 2011-10-25 10:13 |显示全部楼层
回复 12# 瀚海书香


    嗯嗯,在内网单个pc对外网短时间同时产生多个session都属于p2p软件,360杀毒软件好像也被做成了一个p2p端,更新病毒库的同时也上传。

论坛徽章:
0
发表于 2011-10-25 10:28 |显示全部楼层
回复 9# godbach


    普通 http 下载,有些User-Agent、Host栏位的具体公司的特征;
也emule协议特征比较多,除了加密的(流量不大)简单识别;
bt种子不一样,根据特征阻挡效果就不一样,可能漏掉一些p2p软件共有特征。
通过抓包发现相关的特征,分析没特征的包比较困难,基于DFI(Deep/Dynamic Flow Inspection,深度/动态流检测),只能针对p2p整体的软件吧。

论坛徽章:
0
发表于 2011-10-25 10:35 |显示全部楼层
回复 11# 独孤九贱

DFI(Deep/Dynamic Flow Inspection,深度/动态流检测) 它与DPI(Deep Packet Inspection,深度包检测)进行应用层的载荷匹配不同,采用的是一种基于流量行为的应用识别技术,即不同的应用类型体现在会话连接或数据流上的状态各有不同。
    由于DPI采用逐包分析、模式匹配技术,因此,可以对流量中的具体应用类型和协议做到比较准确的识别;而DFI仅对流量行为分析,因此只能对应用类型进行笼统分类,如对满足P2P流量模型的应用统一识别为P2P流量。如果数据包是经过加密传输的,则采用DPI方式的流控技术则不能识别其具体应用,而DFI方式的流控技术则不受影响,因为应用流的状态行为特征不会因加密而根本改变。
   抓包时,如何确认迅雷(或者bitcomet等)是否使用加密技术?
DPI与DFI使用区别.jpg

论坛徽章:
0
发表于 2011-10-25 11:57 |显示全部楼层
回复  独孤九贱

DFI(Deep/Dynamic Flow Inspection,深度/动态流检测) 它与DPI(Deep Packet Inspect ...
lujian19861986 发表于 2011-10-25 10:35



  我说的是算法本身,不是你说这个。

论坛徽章:
0
发表于 2011-10-26 10:40 |显示全部楼层
回复 17# 独孤九贱

=======================================================
简单解释:

trie图:trie树改造成的有向图。目的是为了活用trie树这个简单而又NB的数据结构。

AC自动机:即trie图的一种活用,利用kmp思想添加了fail指针。能进行高效多模匹配。

=======================================================

========================================
AC自动机算法(Aho-Corasick Algorithm)
以hdu 2222 Keywords Search 为例:

功能:多模式匹配(动态结构)

使用说明:
1.trie_insert 构建以root为根的tire树(即keyword tree),执行一次加入一个模式串。
2.construct_ac_automaton(root) 构建以root为根的trie树的fail指针。
3.query(str, root) 查询以root为根的trie树(模式串集合)中,有多少个模式串在文本串str中。


代码如下:

const int MAXN = 1000001; //文本串的最大长度MAXN - 1
const int MAXM = 51; //单词(模式串)的最大长度为MAXM - 1
const int KEYSIZE = 26; //26个小写字母

struct Node
{
      Node *fail;  //失败指针
      Node *next[KEYSIZE]; //儿子结点个数
      int count; //单词个数
      Node()
          {
            fail = NULL;
            count = 0;
            memset(next, 0, sizeof(next));
      }
      /*
      ~Node() {
        delete next;
      } 貌似没用,在hoj加了这个内存不见减少*/
}*q[MAXN / 2];//??????MAXM*单词个数

char keyword[MAXM]; //单词(模式串 Pattern String)
char str[MAXN]; //文本串

//trie==keyword tree==a set of patterns
void trie_insert(char *str, Node *root)
{
      Node *p = root;
      int i = 0;
      while(str) {
              int index = str - 'a';
              if(p -> next[index] == NULL)
                  p -> next[index] = new Node();
              p = p -> next[index];
              i ++;
      }
      p -> count ++; //在单词的最后一个结点count + 1,代表一个单词,允许有重复的单词
}
void construct_ac_automaton(Node *root)
{
      int head, tail;
      head = tail = 0;
      q[tail ++] = root;
      root -> fail = NULL;
      while(head < tail)
      {
            Node *now = q[head ++];
            for(int i = 0; i < KEYSIZE; i ++) if(now -> next != NULL)
            {
                  q[tail ++] = now -> next;//加入head能走的节点
                  if(now == root){//如果当前节点是root,则fail指针指向自己。
                        now -> next -> fail = root;
                        continue;
                  }
                  Node *p = now -> fail;
                  while(p != NULL) {
                        if(p -> next != NULL) {
                              now -> next -> fail = p -> next;
                              break;
                        }
                        p = p -> fail;
                        //不断转移到下一个fail节点,直到形成如'h'->'h'->....->'h'->root的链
                        //且每个'h'之后的字母都不同于 i+'a'
                  }
                  if(p == NULL) now -> next -> fail = root;
            }
      }
}
int query(char *str, Node *root)
{
      int i = 0, cnt = 0;
      Node *p = root;//表示当前节点
      while(str) {
            int index = str - 'a';
            while(p -> next[index] == NULL && p != root) p = p -> fail;
            //直到p存在字母为str的儿子
            p = p -> next[index];
            p = (p == NULL) ? root : p;
            Node *temp = p;
            //不管当前节点p是否为一个单词的某位尾,把fail链上的节点都标记为已访问
            //统计链上count=1的节点数,且访问完一个节点就把该节点的count置-1
            while(temp != root && temp -> count != -1) {
                  cnt += temp -> count;
                  temp -> count = -1;
                  temp = temp -> fail;
            }
            i ++;
      }
      return cnt;
}

void run_AC()
{
        int n, cas;
        Node *root;
        scanf("%d", &cas);
        while(cas --)
        {
                scanf("%d", &n);
                root = new Node();
                while(n --) {
                        scanf("%s", keyword);
                        trie_insert(keyword, root);
                }
                construct_ac_automaton(root);
                scanf("%s", str);
                printf("%d\n", query(str, root));
        }
}

论坛徽章:
0
发表于 2011-10-26 10:44 |显示全部楼层
回复 12# 瀚海书香


    skype也是p2p软件,DFI只能对p2p这样流行为的应用程序,统一识别,阻挡的话会全部挡了,做qos比较有用吧

论坛徽章:
0
发表于 2011-10-26 10:53 |显示全部楼层
回复 17# 独孤九贱


    独孤九贱兄,识别过程求详解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP