はじめに
このドキュメントでは、Eメールセキュリティアプライアンス(ESA)でメールループを特定する方法について説明します。
背景説明
メールループは、同じメッセージIDを持つメッセージが3回以上挿入されたことによって示される場合があります。メールループは、CPU高使用率、配信速度の低下、全体的なパフォーマンスの問題の症状を引き起こす可能性があります。通常、メッセージIDを複数回挿入するとループを示しますが、問題が原因で複数回挿入されたり、同じメッセージIDを持つ同じスパムメッセージを繰り返し挿入し続けるスパマーである可能性があります。
メールループの典型的な原因は、同じメッセージまたは一連のメッセージがネットワーク上を無限に飛び交うメールサーバ間で無限に送信されるEメールインフラストラクチャの問題です。 これらのメッセージは非常に長い間このような方法で維持できますが、ネットワーク帯域幅や発生したESAの処理コストにとって望ましいことではありません。
解決方法
メールループを特定することは、問題の可能性があると思われる場合は、通常は非常に簡単です。ただし、注意して確認する必要があります。
システムのコマンドラインインターフェイス(CLI)にログインし、次のコマンドのいずれか、または両方を実行すると、最適な結果が得られます。
grep "Subject" mail_logs
grep "Message-ID" mail_logs
特にメッセージIDの検索では、まったく同じIDの繰り返しインスタンスが見つかった場合、メールループが発生していることがわかります。 しかし、同じメッセージを呼び戻すメールサーバの1つがMessage-IDヘッダーを効果的に変更または削除している可能性があるため、これでは不十分な場合があります。 メッセージIDチェックで何も識別できない場合は、件名チェックを試してください。
メッセージ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または別のデバイスへの新しいネットワーキングの変更が、そのトラフィックにどのように影響するかを理解することが重要です。電子メールのランナウェイループの一般的な原因の1つは、受信ヘッダーの削除です。 ESAでは、メッセージに100 Receivedヘッダーが含まれていると、メールループを自動的に検出して停止しますが、このヘッダーを削除することはESAによって可能であり、多くの場合、メールループの原因となります。 正当な理由がない限り、Receivedヘッダーをオフにしたり、削除したりしないでください。
メールループを防止または修正するのに役立つフィルタの例を次に示します。
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"); }