Estou respondendo a minha própria pergunta agora que tenho uma solução que eu gosto de mim mesmo.
O greylisting propriamente dito pode ser implementado apenas com as listas de controle de acesso do Exim, ou um auxiliar de lista cinza externo pode ser conectado às ACLs. Existem várias abordagens para isso, documentadas em outro lugar.
A lista cinza é normalmente implementada em listas de controle de acesso e, portanto, é fácil adicionar alguma pesquisa de endereço IP externo na ACL para controlar o comportamento de lista cinza (por exemplo, para ignorar lista cinza de acordo com uma pesquisa de código de país).
Existem várias alternativas para obter o código do país:
- Pesquisa DNSBL usando, por exemplo, o link (como na resposta do mailq).
- Importe algum banco de dados GeoIP em um banco de dados SQL e faça uma consulta SQL a partir da ACL.
- Implemente a pesquisa do GeoIP usando um dos vários módulos GeoIP perl e conecte-o à ACL do Exim com a interface perl.
- Use uma biblioteca
dlfunc
que implementa a pesquisa do GeoIP na ACL.
Eu pessoalmente escolhi a última opção, pois é mais eficiente e não depende de recursos externos. Implementei uma nova biblioteca dlfunc
para essa finalidade, já que nenhuma das várias existentes tinha suporte a IPv6. Minha implementação com exemplos simples está disponível em: link . Ao implementar isso, aprendi sobre as ACLs do Exim e descobri que elas são extremamente eficientes para implementar qualquer tipo de política de aceitação de e-mail.
Agora é fácil pular a lista cinza para determinados países adicionando uma regra ACL antes das regras de lista cinza:
warn set acl_c_geoip_country_code = \
${dlfunc{/usr/local/lib/exim4/exim-geoipv6-dlfunc.so}\
{geoip_country_code}{$sender_host_address}}
accept condition = ${if inlist{$acl_c_geoip_country_code}{FI:SE:EE}}
As versões do Exim anteriores à 4.77 não possuem a sintaxe inlist{
. O mesmo pode ser alcançado alterando a segunda regra da seguinte forma:
accept condition = ${if forany{FI:SE:EE}{eq{$item}{$acl_c_geoip_country_code}}}