Suricata中对纯ip的加载是单独作为一个模块的,称之为IpOnly规则。
那么,本文将以三个方面来介绍如何对程序进行优化。
IpOnly规则在规则解析后,由SignatureIsPDOnly函数进行判断, 不满足IpOnly的规则大致可分为以下情况:
IpOnly规则比较特殊,一般认为命中源和目的ip地址,再校验以下其他头部信息,就可以认为该报文 可以命中这条规则。那么我们的重点就放在了如何组织ipv4,ipv6地址,并高效的进行匹配。
这里面suricata借鉴了BSD操作系统中路由表查找算法-Radix Tree,路由表查找本质就是对目的ip进行 最长掩码匹配,而索引到路由表中的下一跳。那么,我们先看看radix tree的基本思想。
Radix Tree本质是一个二叉树,由内部节点和外部节点,内部节点用于指示需要进行bit test的位置,并根据测试结果决定查找方向,外部节点则用于存储键值。
Suricata具体实现在IPOnlyPrepare中,它分别建立了4个Radix Tree,代表源ipv4/6,目的ipv4/6。
精确IP添加的步骤:
插入前:
插入后:
网段IP添加的步骤:
匹配在函数SCRadixFindKeyIPV4BestMatch及SCRadixFindKeyIPV6BestMatch中。 查找步骤可分为3步,寻叶-》辩重-》回溯:
//查掩码链表
SCRadixPrefixContainNetmaskAndSetUserData(node->prefix, netmask_node->netmasks[j], 0, user_data_result))
//精确匹配
SCRadixPrefixContainNetmaskAndSetUserData(node->prefix, key_bitlen, 1, user_data_result)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。