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中的該單元標誌爲空閒。配置