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