2.5 Snort 性能分析
Snort可以提供有關規則和預處理器性能的統計信息。每個都只需要snort.conf中一個簡單的config選項即可,Snort會在退出時輸出性能最差(或全部)的統計信息。在profile_rules或profile_preprocs中提供文件名時,統計信息將保存在這些文件中。如果未指定append,則每次運行Snort都會創建一個新文件。文件名將附加時間戳。這些文件可在日志目錄中找到。
要使用此功能,必須 在configure腳本中使用-enable-perfprofiling選項構建snort 。
2.5.1 規則分析
2.5.1.1 格式
config profile_rules:
print [all | <num>],
sort <sort_option>
[,filename <filename> [append]]
<num>是要打印的規則數<sort_option>是以下之一:checks matches nomatches avg_ticks avg_ticks_per_match avg_ticks_per_nomatch total_ticks<filename>是輸出文件名[append]指示每次輸出都將轉到同一個文件(可選)
2.5.1.2 例子
- 打印所有規則,按avg_ticks排序(如果打開了選項,則為默認配置)
config profile_rules - 打印所有規則,按avg_ticks排序,然后附加到文件
rules_stats.txt配置profile_rules:文件名rules_stats.txt append - 根據最高平均時間
配置profile_rules打印前10條規則:打印10,對avg_ticks排序 - 打印所有規則,按檢查次數排序
config profile_rules:全部打印,檢查排序 - 根據總時間
配置profile_rules打印前100條規則:打印100,對total_ticks進行排序 - 使用默認選項打印,每次
配置profile_rules時將結果保存到performance.txt:文件名performance.txt附加 - 打印前20條規則,將結果保存到文件名
配置profile_rules中的時間戳記下的perf.txt中:打印20條,文件名perf.txt
2.5.1.3 輸出
Snort將在出口處打印一個類似于以下內容的表格。

用于打印上表的配置行:
config profile_rules:print 4,sort total_ticks
這些列代表:
- 編號(等級)
- 簽名ID
- 發電機ID
- 檢查(在端口組或任意規則中的快速模式匹配后評估規則的次數)
- 匹配(所有規則選項匹配的次數,對于沒有選項的規則將很高)
- 警報(此規則生成的警報數量)
- CPU Ticks
- Avg Ticks per Check
- Avg Ticks per Match
- Avg Ticks per Nonmatch
解釋此信息是關鍵。“微秒”(或“刻度”)列很重要,因為這是評估給定規則所花費的總時間。但是,如果該規則引起警報,則不理會它是有道理的。
較高的平均/檢查是一個效果較差的規則,很可能包含PCRE。高檢查次數和低平均檢查次數通常是任意規則,幾乎沒有規則選項,也沒有內容。快速檢查,幾個選項可能匹配,也可能不匹配。我們正在考慮將其中一些移入代碼,尤其是那些SID較低的代碼。
默認情況下,Snort退出時,此信息將打印到控制臺。您可以在snort.conf中使用“文件名”選項來指定將要寫入該文件的文件。如果未指定“ append”,則每次運行Snort都會創建一個新文件。文件名將附加時間戳。這些文件可在日志目錄中找到。
2.5.2 預處理程序分析
2.5.2.1 格式
config profile_preprocs: \
print [all | <num>], \
sort <sort_option> \
[, filename <filename> [append]]
<num>是要打印的預處理器數<sort_option>是以下之一:檢查avg_ticks ``total_ticks<filename>是輸出文件名[append]指示每次輸出都將轉到同一個文件(可選)
2.5.2.2 例子
- 打印所有預處理程序,按avg_ticks排序(如果打開了選項,則為默認配置)
config profile_preprocs - 打印所有預處理器,按avg_ticks排序,然后附加到文件
preprocs_stats.txt配置profile_preprocs:文件名 preprocs_stats.txt 附加 - 根據最高平均時間
配置profile_preprocs,輸出前10個預處理器:打印10,對avg_ticks進行排序 - 打印所有預處理程序,按檢查次數排序
config profile_preprocs:全部打印,排序檢查
2.5.2.3 輸出
Snort將在出口處打印一個類似于以下內容的表格。

用于打印上表的配置行:
config profile_preprocs:
print 10, sort total_ticks
這些列代表:
- 數字(等級)-每層縮進數字。第1層預處理器在其各自的調用方下列出(并進行類似排序)。
- 預處理器名稱
- 層-當打印特定數量的預處理器時,將為每個第0層預處理器狀態打印特定預處理器的所有子任務信息。
- 檢查(預處理器決定查看數據包的次數,匹配的端口,應用程序層標頭正確等)
- 出口(相應出口的數量-僅在總是匹配檢查的情況下驗證代碼是否正確檢測,除非捕獲到異常)
- CPU Ticks
- Avg Ticks per Check
- 調用者百分比-對于非第0層預處理器,即預處理器中的子例程,這標識了為此子任務花費的調用者報價的百分比。
由于任務交換,非工具代碼和其他因素,“調用方的百分比”字段將不占調用方時間的100%。它確實給出了每個子任務中花費了多少相對時間的合理指示。
默認情況下,Snort退出時,此信息將打印到控制臺。您可以在snort.conf中使用“文件名”選項來指定將要寫入該文件的文件。如果未指定“ append”,則每次運行Snort都會創建一個新文件。文件名將附加時間戳。這些文件可在日志目錄中找到。
2.5.3 數據包性能監控(PPM)
PPM提供了閾值機制,可用于為snort提供基本級別的延遲控制。它不能提供硬性和快速的延遲保證,但實際上應該提供良好的平均延遲控制。可以檢查規則和數據包的延遲。在檢測到過度等待時間時采取的措施是可配置的。以下各節描述了配置,示例輸出以及一些值得注意的實現細節。
要使用PPM,必須使用-enable-ppm或-enable-sourcefire選項進行構建以進行配置。
PPM的配置如下:
# Packet configuration:
config ppm: max-pkt-time <micro-secs>, \
fastpath-expensive-packets, \
pkt-log, \
debug-pkts
# Rule configuration:
config ppm: max-rule-time <micro-secs>, \
threshold count, \
suspend-expensive-rules, \
suspend-timeout <seconds>, \
rule-log [log] [alert]
數據包和規則可以如上所述單獨配置,也可以僅在一個配置ppm語句中一起配置。數據包和規則監視是獨立的,因此可以啟用一個或兩個或兩個都不啟用。
2.5.3.1 配置
數據包配置選項
max-pkt-time <micro-secs>
- 啟用以“微秒”為限制的數據包延遲閾值。
- 默認值為0(禁用分組延遲閾值)
- 合理的初始默認值:1G / 100M / 5M網的100/250/1000
fastpath-expensive-packets
- 如果超過了最大時間,則可以停止進一步檢查數據包
- 默認為關閉
pkt-log
- 如果數據包超過最大時間,則啟用記錄數據包事件
- 默認為不記錄
- 如果沒有為“ pkt-log”提供選項,則意味著“ pkt-log log”
- log選項根據snort配置啟用輸出到syslog或控制臺
debug-pkts
- 必須使用-enable-debug選項進行構建以進行配置
- 使每個數據包計時統計信息在每個數據包之后打印
- 默認為關閉
規則配置選項
最大規則時間<micro-secs>
- 啟用以“微秒”為限制的規則延遲閾值。
- 默認值為0(禁用規則延遲閾值)
- 合理的初始默認值:1G / 100M / 5M網的100/250/1000
threshold <count>
- 設置在禁用規則之前累積的規則時間超出次數
- 默認是5
suspend-expensive-rules
- 如果超過了最大規則時間,則啟用暫停規則檢查
- 默認為關閉
suspend-timeout <seconds>
- 規則暫停時間(以秒為單位)
- 默認是60秒
- 設置為零以永久禁用昂貴的規則
rule-log [log] [alert]
- 啟用規則的事件記錄輸出
- 默認為不記錄
- 選項“ log”和“ alert”中的一個或兩個必須與“ rule-log”一起使用
- log選項根據snort配置啟用輸出到syslog或控制臺
2.5.3.2 例子
示例1:以下啟用數據包跟蹤:
config ppm: max-pkt-time 100
以下啟用規則跟蹤:
config ppm: max-rule-time 50, threshold 5
如果未使用fastpath-expensive-packets或suspend-expensive-rules,則除了增加應進行快速路徑處理或應暫停的規則的數據包計數以外,不采取任何其他措施。snort退出時,將打印出此信息的摘要。
范例2:
以下內容將暫停規則并中止數據包檢查。這些規則用于生成隨后的示例輸出。
config ppm: \
max-pkt-time 50, fastpath-expensive-packets, \
pkt-log, debug-pkts
config ppm: \
max-rule-time 50, threshold 5, suspend-expensive-rules, \
suspend-timeout 300, rule-log log alert
2.5.3.3 采樣Snort輸出
采樣Snort啟動輸出
Packet Performance Monitor Config:
ticks per usec : 1600 ticks
max packet time : 50 usecs
packet action : fastpath-expensive-packets
packet logging : log
debug-pkts : disabled
Rule Performance Monitor Config:
ticks per usec : 1600 ticks
max rule time : 50 usecs
rule action : suspend-expensive-rules
rule threshold : 5
suspend timeout : 300 secs
rule logging : alert log
采樣Snort運行時輸出
...
PPM: Process-BeginPkt[61] caplen=60
PPM: Pkt[61] Used= 8.15385 usecs
PPM: Process-EndPkt[61]
PPM: Process-BeginPkt[62] caplen=342
PPM: Pkt[62] Used= 65.3659 usecs
PPM: Process-EndPkt[62]
PPM: Pkt-Event Pkt[63] used=56.0438 usecs, 0 rules, 1 nc-rules tested, packet fastpathed
(10.4.12.224:0 -> 10.4.14.108:54321).
PPM: Process-BeginPkt[63] caplen=60
PPM: Pkt[63] Used= 8.394 usecs
PPM: Process-EndPkt[63]
PPM: Process-BeginPkt[64] caplen=60
PPM: Pkt[64] Used= 8.21764 usecs
PPM: Process-EndPkt[64]
...
樣品Snort退出輸出
Packet Performance Summary:
max packet time : 50 usecs
packet events : 1
avg pkt time : 0.633125 usecs
Rule Performance Summary:
max rule time : 50 usecs
rule events : 0
avg nc-rule time : 0.2675 usecs
2.5.3.4 實施細節
- 處理每個規則后,將執行數據包和規則處理時間。每個預處理器之后都不執行延遲控制。
- 此實現是基于軟件的,并且不使用中斷驅動的時序機制,因此需要遵守基于軟件的時序測試的粒度。由于時序測量的粒度,任何單獨的數據包都可能超過用戶指定的數據包或規則處理時間限制。因此,該實現無法通過嚴格的時序保證來實現精確的等待時間保證。因此,這被認為是盡力而為方法的原因。
- 由于此實現取決于基于硬件的高性能頻率計數器,因此延遲閾值目前僅在Intel和PPC平臺上可用。
- 時間檢查是基于總系統時間而不是Snort的處理器使用情況進行的。這是一個有意識的設計決策,因為在加載系統時,數據包的等待時間基于系統總時間,而不僅僅是Snort應用程序收到的處理器時間。因此,建議您調整閾值以在系統負載時最佳運行。
Snort安裝使用中文手冊
推薦文章: