Suricata文檔——第七章性能

7.1. Runmodes

Suricata由多個稱為線程,線程模塊和隊列的“構建塊”組成。 線程就像一個在計算機上運行的進程。 Suricata是多線程的,所以多個線程一次處于活動狀態(tài)。
線程模塊是功能的一部分。 一個模塊用于解碼數(shù)據(jù)包,另一個模塊是檢測模塊,另一個模塊是輸出模塊。 一個數(shù)據(jù)包可以被多個線程處理。 數(shù)據(jù)包將通過隊列傳遞到下一個線程。 數(shù)據(jù)包一次只能由一個線程處理,但是引擎一次可以處理多個數(shù)據(jù)包。 (請參閱Max-pending-packets)一個線程可以有一個或多個線程模塊。 如果他們有更多的模塊,他們只能一次活動。 線程,模塊和隊列排列在一起的方式稱為Runmode。

7.1.1不同的Runmodes

您可以從幾個預定義的運行模式中選擇一個運行模式。 命令行選項-list-runmodes顯示所有可用的運行模式。 所有運行模式都有一個名稱:auto,single,autofp。 最重要的任務是檢測; 一個數(shù)據(jù)包將被檢查數(shù)千個簽名。
默認運行模式的示例:


默認運行模式

在pfring模式下,每個流程在運行模式中遵循其自己的固定路線。


pfring 模式

有關與runmode有關的命令行選項的更多信息,請參閱命令行選項。

7.2 抓包

7.2.1負載均衡

為了獲得最佳表現(xiàn),Suricata將需要以“worker”模式運行。這實際上意味著有多個線程,每個線程運行一個完整的數(shù)據(jù)包管道,每個線程都從捕獲方法接收數(shù)據(jù)包。這意味著我們依靠捕獲方法來將數(shù)據(jù)包分發(fā)到各個線程上。其中一個關鍵的方面就是Suricata需要以正確的順序在同一個線程中獲取流程的兩個方面。

AF_PACKET和PF_RING捕獲方法都有選擇“集群類型”的選項。這些默認為'cluster_flow',它指示捕獲方法按流(5元組)進行散列。這個散列是對稱的。
Netmap沒有內(nèi)置的cluster_flow模式??梢允褂谩發(fā)b”工具單獨添加:https://github.com/luigirizzo/netmap/tree/master/apps/lb

警告最近的AF_PACKET變化已經(jīng)“broken”:https://redmine.openinfosecfoundation.org/issues/1777這種對稱性。目前正在進行“解決這個問題”的工作:https://redmine.openinfosecfoundation.org/issues/1777#note-7,但現(xiàn)在停留在內(nèi)核<= 4.2或更新到4.4.16+,4.6.5+或4.7+。

在幾乎所有現(xiàn)代NIC的多隊列NIC上,都需要考慮RSS設置。

7.2.2. RSS

接收端縮放(RSS)是網(wǎng)卡使用的一種技術,用于將傳入流量分配到網(wǎng)卡上的各個隊列中。 這是為了提高性能,但重要的是要認識到它是為正常流量設計的,而不是針對IDS數(shù)據(jù)包捕獲的情況。 RSS使用哈希算法來將傳入流量分配到各個隊列中。 這個散列通常不是對稱的。 這意味著當接收到一個流的雙方時,每一方都可能以不同的隊列結束。 可悲的是,在部署Suricata時,這是使用跨度端口或水龍頭(Trap)時的常見情況。

這里的問題是,通過使流量的兩端處于不同的隊列中,分組處理的順序變得不可預知。 網(wǎng)卡,驅(qū)動程序,內(nèi)核和Suricata上的時間差異將導致數(shù)據(jù)包進入的順序高于網(wǎng)絡。 這具體是關于兩個交通方向之間的不匹配。 例如,Suricata跟蹤TCP 3次握手。 由于這個時間問題,在客戶端到服務器端已經(jīng)開始發(fā)送數(shù)據(jù)之后,SYN / ACK只能被Suricata接收。 Suricata會將此流量視為無效。
AF_PACKET,PF_RING或NETMAP等支持的捕獲方法都不能解決這個問題。 這將需要緩沖和分組重新排序,這是昂貴的。

要查看配置了多少個隊列:

$ ethtool -l ens2f1
Channel parameters for ens2f1:
Pre-set maximums:
RX: 0
TX: 0
Other: 1
Combined: 64
Current hardware settings:
RX: 0
TX: 0
Other: 1
Combined: 8

有些網(wǎng)卡允許您將其設置為對稱模式。 英特爾X(L)710卡在理論上可以做到這一點,但是驅(qū)動程序還沒有能力做到這一點(工作正在努力解決這個問題)。 另一個解決的方法是設置一個特殊的“隨機密鑰”,使RSS對稱。 見http://www.ndsl.kaist.edu/~kyoungsoo/papers/TR-symRSS.pdf(PDF)。

然而,在大多數(shù)情況下,最佳解決方案是將RSS隊列的數(shù)量減少到1:
例:

Intel X710 with i40e driver:

ethtool -L $DEV combined 1

有些驅(qū)動程序不支持通過ethtool設置隊列的數(shù)量。 在某些情況下,有一個模塊加載時間選項。 閱讀驅(qū)動程序文檔的具體信息。

7.2.3 卸載

網(wǎng)卡,驅(qū)動程序和內(nèi)核本身有各種技術來加速數(shù)據(jù)包的處理。 通常這些都將被禁用。
LRO / GRO導致將各種較小的數(shù)據(jù)包合并為大“超級數(shù)據(jù)包”。 這些將需要被禁用,因為他們打破了dsize關鍵字以及TCP狀態(tài)跟蹤。
可以在AF_PACKET和PF_RING上啟用校驗和卸載,但需要在PCAP,NETMAP等上禁用。

7.2.4 建議

閱讀你的驅(qū)動文檔! 例如。 對于i40e,RSS隊列的ethtool更改可能會導致內(nèi)核恐慌,如果做錯了。

通用:將RSS隊列設置為1或確保RSS散列是對稱的。 禁用NIC卸載。

AF_PACKET:1個RSS隊列并停留在內(nèi)核<= 4.2或者確保你有> = 4.4.16,> = 4.6.5或> = 4.7。
例外:如果RSS是對稱群集類型,可以使用“cluster_qm”將Suricata綁定到RSS隊列。 禁用除rx / tx csum之外的NIC卸載。

PF_RING:1個RSS隊列并使用群集類型“cluster_flow”。 禁用除rx / tx csum之外的NIC卸載。

NETMAP:1個RSS隊列。 沒有內(nèi)置的基于流量的負載平衡,但'lb'工具可以有幫助。 另一個選擇是使用'autofp'runmode。
例外:如果RSS是對稱的,則負載平衡基于RSS哈希,并且可以使用多個RSS隊列。 禁用所有NIC卸載。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容