소개
이 문서에서는 ESA(Email Security Appliance)에서 메일 루프를 식별하는 방법에 대해 설명합니다.
배경 정보
메일 루프는 3번 이상 삽입된 동일한 Message-ID의 메시지로 나타낼 수 있습니다. 메일 루프는 CPU가 높고 전달 속도가 느리며 전반적인 성능 문제가 발생할 수 있습니다. 일반적으로 두 번 이상 삽입된 메시지 ID는 반복을 나타내지만, 경우에 따라 문제 때문에 두 번 이상 삽입되거나, 동일한 메시지 ID로 동일한 스팸 메시지를 계속 삽입하는 허술한 스패머일 수 있습니다.
더 일반적으로 메일 루프는 동일한 메시지 또는 메시지 집합을 메일 서버에서 메일 서버로 끊임없이 이동하는 이메일 인프라 문제로 인해 발생합니다. 이러한 메시지는 오랫동안 이러한 방식으로 엔터테인먼트를 유지할 수 있지만, 네트워크 대역폭이나 ESA 처리 비용 발생에는 좋지 않습니다.
솔루션
메일 루프를 식별하는 것은, 문제가 될 수 있다고 의심하는 경우, 대개 매우 쉽지만 눈여겨볼 필요가 있습니다.
시스템의 CLI(Command Line Interface)에 로그인하고 다음 명령 중 하나를 실행하거나, 다음 두 명령 중 하나를 실행하면 가장 좋은 혜택을 얻을 수 있습니다.
grep "Subject" mail_logs
grep "Message-ID" mail_logs
특히 Message-ID에 대한 검색에서 정확히 동일한 ID의 반복 인스턴스가 표시되면 메일 루프가 있음을 알 수 있습니다. 그러나 같은 메시지를 다시 모으는 메일 서버 중 하나가 Message-ID 헤더를 적절하게 변경하거나 제거할 수 있으므로 이 방법으로는 충분하지 않을 수 있습니다. 따라서 메시지 ID로 식별 가능한 항목을 얻지 못한 경우 Subject(제목) 확인을 시도하십시오.
Message-ID를 사용하여 루핑 메시지를 찾을 수 있다고 가정할 때 메시지와 해당 상위 연결(ICID)에 대한 다른 정보도 확인할 수 있습니다. 메시지 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 또는 다른 디바이스로의 새로운 네트워킹 변경이 해당 트래픽에 어떤 영향을 미치는지 파악하는 것이 매우 어려울 수 있습니다. 런어웨이 메일 루프의 일반적인 원인 중 하나는 Received 헤더가 제거되었기 때문입니다. ESA는 메시지에서 100개의 Received 헤더를 볼 때 메일 루프를 자동으로 탐지하고 중지하지만, 이 헤더를 제거하도록 허용하므로 메일 루프가 잘못된 경우가 많습니다. *정말* 특별한 이유가 없는 한, Received 헤더를 끄지 마십시오. 그렇지 않으면 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"); }