내 EXIM 서버에 대한 공격이 계속되고 있습니다. 다음 acl을 사용하여 시도를 지연시키려고 합니다.
deny condition = ${if and {\
{>{$rcpt_count}{10}}\
{<{$recipients_count}{${eval:$rcpt_count/2}}} }}
delay = 5s
message = Rejected for too many bad recipients
logwrite = REJECT [$sender_host_address]: bad recipient count high [${eval:$rcpt_count-$recipients_count}]
.endif
처음 10번의 시도 후에는 한 번 지연됩니다.
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:34 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Unrouteable address
2023-09-10 12:14:39 REJECT [212.164.218.15]: bad recipient count high [11]
2023-09-10 12:14:39 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Rejected for too many bad recipients
2023-09-10 12:14:39 REJECT [212.164.218.15]: bad recipient count high [12]
2023-09-10 12:14:39 H=([212.164.218.15]) [212.164.218.15] F=<[email protected]> rejected RCPT <[email protected]>: Rejected for too many bad recipients
대신 각 후속 시도를 지연시키고 싶습니다. 어떻게 이를 달성할 수 있나요?
답변1
동일한 문제/질문이 발생하여 몇 가지 조사와 테스트를 수행했습니다.
가장 먼저 알아야 할 것은 SMTP는 원래 엄격하게 명령-응답 기반이라는 것입니다. 즉, 클라이언트는 정확히 하나의 명령을 서버에 보낼 수 있으며 다음 명령을 보내기 전에 응답을 기다려야 합니다. 앞뒤로 이동할 때마다 약간의 대기 시간이 발생하여 대기 시간이 발생하기 때문에RFC 2920나중에 "SMTP 파이프라이닝"을 도입했습니다. 이를 통해 클라이언트는 여러 명령을 일괄적으로 서버에 보낼 수 있으며, 서버는 이를 처리하고 응답을 다시 보냅니다. 예를 들어 "SMTP 파이프라이닝"의 가용성은 pipelining_advertise_hosts
기본적으로 모든 사람에게 허용되는 옵션으로 제어할 수 있습니다. 나는 이것이 귀하의 구성에도 해당된다고 가정합니다.
귀하의 경우에 발생한 것으로 생각되는 것은 귀하의 exim 서버에 연결된 클라이언트(일명 스패머)가 "SMTP 파이프라이닝"을 지원한다는 말을 듣고 100개의 일괄 RCPT TO:
명령을 보내는 것입니다. 귀하의 서버는 이를 수신하고 acl_smtp_rcpt
각 수신자에 대해 acl 을 통해 실행하면서 처리를 시작했습니다 . 처음 10개 명령은 550 Unrouteable address
각각 응답 을 반환 550
했습니다 .RFC5321 오류 코드의미 Requested action not taken
뒤에는 사람이 읽을 수 있는 이유가 옵니다. 그 이유는 지시문을 사용하여 exim에서 설정할 수 message
있으며 콜론 뒤에 로그에도 인쇄됩니다. 클라이언트는 아마도 이를 무시했을 것입니다. 결국 유효한 수신자를 찾고 있습니다.
11번째 명령/수신자를 처리할 때 규칙 조건은 deny
true로 평가되고 exim은 5초 동안 지연(휴면)됩니다. 이것이 당신이 보는 지연입니다. 그 후 550 Rejected for too many bad recipients
클라이언트에 응답을 보냅니다 . 포함된(잘 알려진) 이유 때문에 클라이언트는 선을 넘었다는 것을 감지하고 더 이상 유효한 수신자를 찾을 기회가 없습니다. 다음 명령도 모두 거부됩니다. 더 이상 기대하거나 얻을 만한 가치가 없기 때문에 나머지 응답을 기다리지 않고 연결을 종료합니다(그리고 아마도 즉시 다음 희생자로 전환합니다). 서버가 이를 인식하는 동안(TCP가 사용되기 때문에) 여전히 명령 배치를 계속 처리합니다. 그러나 클라이언트에 대한 SMTP 연결은 이미 종료되었으므로 더 이상 지체할 이유가 없습니다. 지연되는 유일한 사람은 그 자체입니다. 따라서 지연은 무시되고 전체 배치가 완료될 때까지 서버는 명령을 통해 실행됩니다.
클라이언트가 연결을 종료하지 않으면 예상한 대로 작동합니다. 10일 이후 각 수신자에게 5초 지연이 적용됩니다.
위의 내용이 맞다고 가정할 때 제가 생각해 낼 수 있는 최선의 해결책은 기본 이유/메시지를 제거하는 것입니다. 서버가 계속해서 와 같은 응답을 하면 550 Unrouteable address
클라이언트는 서버가 선을 넘었고 구제할 수 없다는 것을 알 수 없습니다. 클라이언트의 작동 방식에 따라 기본값과 다른 것으로 변경/변경하는 것만으로도 충분할 수 있으므로 특별히 처리되지 않습니다.
또는 위에서 언급한 옵션을 사용하여 서버에서 "SMTP 파이프라이닝"을 비활성화할 수 있습니다. 클라이언트는 숨길 수 없는 이유가 있는 11번째 답변을 본 후에도 계속 중단될 것이며 서버는 여전히 한 번만 지연되지만 최소한 로그에 실패한 다른 89명의 수신자는 표시되지 않습니다. 명백한 단점은 모든 클라이언트를 "느리게" 한다는 것입니다. 그러나 선택한 "정상적으로 알려진" 클라이언트에 대해서만 "SMTP 파이프라이닝"을 활성화하면 속도가 다소 향상될 수 있습니다.
참고로 지연은 정적 값일 필요는 없으며 표현식일 수도 있습니다. 이를 통해 잘못된 수신자가 추가될 때마다 시간이 더 길어지는 점진적인 지연을 구현할 수 있습니다. 우수한메일 교환기를 위한 스팸 필터링HowTo에는 이에 대한 예가 있습니다.