snort在2.9版本加入了daq,同时引入了afpacket。afpacket是linux2.6开始引入的报文获取接口。其最大的特色是打破以往复制报文传递给用户的方式,而是采用了共享内存的交互方式。而且利用环形缓冲区使用户能够无锁处理。linux
snort使用afpacket能够实现inline模式, 即IPS,不一样于IDS的被动防护模式, IPS能够主动阻断。spa
snort首先会将配置的接口两两配对,这里以ETH0和ETH1为例.接口
而后使用afpacket的相关接口(具体可在内核中查找关键字)为每一个接口分别创建两个环形缓冲区,队列
RX为输入缓冲区, TX为输出缓冲区。缓冲区是一块内核和用户共享的内存空间。内存
缓冲区的处理原理是循环队列,以输入缓冲区为例; 当内核发现RX有空位时就将报文放入空位中并打上可用标志,用户发现有标注可用的单元时就能够对其处理,使用完成后为该单元标注空闲标志内核又可继续利用。由于单消费者和生产者状况因此该队列可以无锁处理。原理
从ETH0进入的报文如红线所示,内核将报文放入RX中,snort获取该报文并进行匹配后返回经过和丢弃两种结果。若是是经过,则将该数据拷贝进ETH1的发送缓冲区TX并将在ETH0的RX中的该单元标志位空闲,不然不进行拷贝直接将ETH0的RX中的该单元标志为空闲。配置