- 论坛徽章:
- 0
|
这是我的snort与netfilter的两个方案,不知道行不行。
方案一
通过第三章对snort、snort_inline、netlink和netfilter的比较分析,我们知道snort_inline工作在用户态,netfilter工作在内核态,因此会很自然地提出这样一种方案,如图所示,我们在netfilter的filter表的钩子点NF_IP_FORWARD以及NF_IP_LOCAL_IN上把经过的数据包交给内核的ip_queue模块,ip_queue模块利用Netlink机制再把该数据包传递到用户态的snort_inline,snort_inline对该数据包进行规则检测,如果匹配且匹配结果是snort_inline新增的三个动作(即drop/sdrop/reject),那么snort_inline通过ipq_set_verdict函数(定义在<libipq.h>中,man 3 ipt_set_verdict)将匹配结果和修改后的数据包(如果数据包没有在snort_inline修改,则不须传回)传回netfilter,netfilter根据匹配结果进行相应处理。我们可以用一个式子来表示这种方案:网桥+防火墙+snort_inline+ip_queue。
这种方案最大的优点是原理比较清晰简单,可操作性强,但也存在如下一些问题:
制约snort的各种问题都有可能成为这种方案的问题。例如尽管Snort检测规则库包含的检测类型比较齐全,但其中依然有很多规则因为各种因素设计不合理(如冗余、冲突等等),有的甚至是错误的,这主要是snort本身存在的问题,因此规则库的优化是一个研究的话题。
大量数据包在内核空间和用户空间往返处理,势必会导致时空开销增加。
因为这种方案以桥模式串接在网络中,很容易导致网络瓶颈。我们可以利用零拷贝技术和硬件加速技术等来改善这个不足。
方案二
针对第一种方案的不足,我们可以把入侵检测的大部分功能(因为入侵检测规则并不能一一转化到iptables规则)有效地融合到Netfilter框架中,使防火墙具备入侵检测的功能。通过深入研究iptables表、链、规则的相互关系,我们可以新建一些自定义链,如FWSNORT_INPUT FWSNORT_OUTPUT FWSNORT_FORWARD,在这个链中可以添加经过fwsnort转换成的iptables规则,然后在INPUT、OUTPUT、FORWARD链中的一开始的位置建立跳转规则,将所有数据包分别发送至相应的FWSNORT链。当需要开启防火墙的入侵检测功能时,只需运行fwsnort.sh这样一个脚本,它就可以把经过INPUT、OUTPUT、FORWARD的数据包发送到相应的FWSNORT链。 |
|