Introdução
Este documento descreve como identificar um loop de correio no Email Security Appliance (ESA).
Informações de Apoio
Os loops de correio podem ser identificados por mensagens que apresentam a mesma ID de mensagem mais de 3 vezes. Esses loops geram sintomas como alta utilização da CPU, entrega lenta e outros problemas de desempenho. Normalmente, IDs de mensagem inseridas mais de uma vez já indicariam loop, mas há casos em que as IDs aparecem mais de uma vez devido a problemas ou por descuido de um remetente de spam que envia mensagens com a mesma ID.
O mais comum é que um loop de correio seja gerado por um problema na infraestrutura de e-mail que envia a mesma mensagem ou conjunto de mensagens na rede, de servidor de e-mail a servidor de e-mail, ininterruptamente. Mesmo sendo possível que as mensagens mantenham-se entretidas nessa função por um bom tempo, esse problema não é positivo para a largura de banda da rede nem para o custo de processamento dispendido pelo ESA.
Solução
Em geral, não é difícil identificar um loop de correio, mas é preciso estar atento aos indícios.
Acesse a interface de linha de comando (CLI) do sistema e insira um dos seguintes comandos (ou ambos, se julgar necessário):
grep "Subject" mail_logs
grep "Message-ID" mail_logs
Especificamente em pesquisas por IDs de mensagem, um mail loop pode ser identificado se forem localizadas instâncias recorrentes da mesma ID. Às vezes, contudo, isso não é suficiente, pois, ao reagrupar a mesma mensagem, um dos servidores de e-mail pode estar tentando ajudar alterando ou removendo o cabeçalho da ID de mensagem. Portanto, se não houver indícios substanciais com a verificação das IDs de mensagem, tente a verificação de Assunto.
Se você conseguiu localizar a mensagem em loop pela ID da mensagem, é necessário coletar outras informações sobre a mensagem e sua conexão de entrada (ICID). Com a ID de mensagem e um MID na mesma linha de log, é possível executar:
grep -e "MessageID_I_found" -e "MID 123456" mail_logs
Com o resultado de saída obtido, é possível identificar o ICID e o DCID relevantes e executar:
grep -e "MessageID_I_found" -e "MID 123456" -e "ICID 1234567" -e "DCID 2345767" mail_logs
Agora, você dispõe da transação completa entre conexão e mensagem e pode identificar de onde a mensagem veio e onde foi entregue (se isso já ocorreu). Uma vez identificada a mensagem em loop, a próxima etapa é verificar a mensagem para corrigir o problema. Se a causa do loop não for corrigida, é provável que essa e outras mensagens continuem em loop ou que o problema volte a ocorrer em breve.
Crie um filtro de mensagem semelhante a este:
loganddrop_looper:
if(header("Message-ID") == "MessageID_I_found") {
archive("looper");
drop();
}
Agora, confirme a alteração e digite o comando a seguir para verificar a mensagem:
tail looper
Com as informações obtidas sobre o sistema remoto ao verificar os logs de correio, juntamente com as outras informações obtidas ao verificar a mensagem, é possível determinar onde está o problema.
Como evitar que loops de correio ocorram?
Em ambientes complexos isto pode ser difícil. É essencial compreender como funciona o fluxo de correio em seu ambiente e como uma nova alteração à rede afetará o tráfego, seja no ESA ou em outro dispositivo. Uma das causas comuns de loops de correio não identificados é a remoção do cabeçalho de recebimento. O ESA detectará e impedirá automaticamente um loop de correio ao identificar 100 cabeçalhos de recebimento em uma mensagem, mas o ESA permite a remoção desse encabeçamento, o que frequentemente gera um loop de correio grave. A menos que haja um bom motivo, não desative ou provoque a remoção do cabeçalho de recebimento.
Abaixo, segue um exemplo de filtro que pode ajudar a prevenir ou corrigir um loop de correio:
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"); }