簡介
本文說明如何識別郵件安全裝置(ESA)上的郵件循環。
背景資訊
郵件循環可以通過注入3次以上的具有相同郵件ID的郵件指示。郵件環路可導致CPU使用率高、交付緩慢和整體效能問題等症狀。通常,多次注入的郵件ID表示循環,但有時由於問題被多次注入,或者可能是垃圾郵件傳送者不斷注入具有相同郵件ID的垃圾郵件。
更常見的情況是,郵件環路是由電子郵件基礎架構問題導致的,此問題將同一封或一組郵件從郵件伺服器無休止地在您的網路上不斷湧現,並傳送到郵件伺服器。 雖然這些消息可以在很長一段時間內保持自己的娛樂狀態,但這對您的網路頻寬或ESA處理成本來說都不是好事。
解決方案
識別郵件循環,如果您懷疑這可能是問題,通常是非常容易的,儘管您需要仔細觀察它。
登入到系統的命令列介面(CLI),然後發出以下命令之一,或同時發出兩者,因為您發現以下優點最佳:
grep "Subject" mail_logs
grep "Message-ID" mail_logs
特別是在Message-ID搜尋中,如果您看到完全相同ID的重複例項,則您會知道存在郵件循環。 但是,有時這還不夠,因為收集相同郵件的其中一個郵件伺服器可能有助於更改或刪除郵件ID標頭。 因此,如果您沒有通過Message-ID檢查獲得可識別的任何內容,請繼續並嘗試Subject檢查。
假設您通過郵件ID找到循環郵件,您還需要找到有關郵件及其父連線(ICID)的其他資訊。 給定同一日誌行中的Message-ID和MID,您可以執行以下操作:
grep -e "MessageID_I_found" -e "MID 123456" mail_logs
根據得到的輸出,您可以找到相關的ICID和DCID並執行:
grep -e "MessageID_I_found" -e "MID 123456" -e "ICID 1234567" -e "DCID 2345767" mail_logs
現在,您應該具有完整的連線 — 郵件事務,並且可以看到該事務來自何處,送達何處(如果已經發生)。 識別出循環消息後,下一步是檢視該消息,以便解決問題。 如果不修復導致環路的原因,則此消息和其他消息很可能會繼續環路,或者問題將很快再次出現。
建立類似以下內容的郵件過濾器:
loganddrop_looper:
if(header("Message-ID") == "MessageID_I_found") {
archive("looper");
drop();
}
現在,提交該更改,並發出以下命令以簽出消息:
tail looper
藉助檢視郵件日誌可以獲得的有關遠端系統的資訊,以及檢視郵件本身可以獲得的其他資訊,您應該能夠確定問題所在。
如何防止出現郵件循環?
在複雜的環境中,這很難做到 — 關鍵是要瞭解郵件在您的環境中如何流動,以及新的網路變化(無論是在ESA上還是移動到其他裝置)將如何影響該流量。導致郵件循環逃逸的一個常見原因是刪除了接收信頭。 ESA在郵件中看到100個已接收報頭時,會自動檢測並暫停郵件循環,但ESA確實允許移除此報頭,這通常會導致郵件循環錯誤。 除非有*真的*個很好的理由,否則請不要關閉「已接收」標頭,或將其刪除。
以下是有助於防止或修復郵件循環的過濾器示例:
External_Loop_Count:
if (header("X-ExtLoop1")) {
if (header("X-ExtLoopCount2")) {
if (header("X-ExtLoopCount3")) {
if (header("X-ExtLoopCount4")) {
if (header("X-ExtLoopCount5")) {
if (header("X-ExtLoopCount6")) {
if (header("X-ExtLoopCount7")) {
if (header("X-ExtLoopCount8")) {
if (header("X-ExtLoopCount9")) {
notify ('joe@example.com');
drop();
}
else {insert-header("X-ExtLoopCount9", "from
$RemoteIP");}}
else {insert-header("X-ExtLoopCount8", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount7", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount6", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount5", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount4", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount3", "from $RemoteIP");}}
else {insert-header("X-ExtLoopCount2", "from $RemoteIP");}}
else {insert-header("X-ExtLoop1", "1"); }