Table of Contents

Greylistd, un demone per gestire le greylist con Exim4

Greylistd e` un semplice demone che permette, interrogato da Exim via socket, di gestire il greylisting delle mail in arrivo. In Debian e` presente come pacchetto, e per installarlo e` sufficiente usare il comando

apt install greylistd

Se usate la configurazione standard debian di Exim, troverete una pagina di help che spiega cosa fare per attivarlo come ultimo passo della procedura di installazione. Se invece usate una configurazione personalizzata di Exim dovrete fare da soli. In questa pagina spiego come Greylistd interagisce con la configurazione di Exim che e` descritta qui: Exim4-Dovecot

Configurazione di Greylistd

La configurazione di Greylistd e` in /etc/greylistd/config ed e` semplice ma non totalmente documentata. Il file config contiene la configurazione minimale. Quella che sto usando io e` quella di default di Debian, con tre modifiche:

retryMin = 30
singlecheck = true
singleupdate = true

Modificata la configurazione, riavviare greylistd con il solito /etc/init.d/greylistd restart

NOTA BENE: Il file /etc/greylistd/whitelist-hosts non viene usato in questa configurazione.

Configurazione di Exim4

Se avete installato la configurazione che trovate in Exim4-Dovecot allora non dovete fare altro che abilitare l'uso delle greylist come indicato in Exim4-Dovecot.

Se state configurando il vostro Exim per i cavoli vostri, questo e` un esempio di ACL che usa greylistd, da mettere nella vostra configurazione di Exim, nel gruppo delle ACL che fanno il check dell' RCPT (acl_smtp_rcpt). Questa acl considera le subnet /24 e non i singoli host, per evitare di greylistare enne volte quelle mail che vengono da sistemi grandi che hanno piu` server smtp che ci contattano a rotazione per mandarci la stessa mail. E` ovvio che non e` una soluzione che funziona al 100%, ma e` meglio che niente.

Per evitare di avere ritardi mostruosi nelle email che vengono da sistemi che hanno centinaia di server SMTP (o per altri motivi) è possibile inserire degli indirizzi (anche con netmask) dentro al file definito nella variabile NOGREYLIST. Dentro questo file si possono inserire solo indirizzi ip (v4 e v6) con o senza una netmask; per esempio "192.168.0.0/24", uno per riga.

  # Variabili che uso nella ACL
  # Se non volete usarle, potete semplicemente togliere le relative condition dalla ACL:
  GREYLISTING=enabled
  NOGREYLIST=/etc/exim4/nogrey.list
  # implementazione delle greylist a mezzo del demone greylistd.
  # Se la mail non e` stata rifiutata prima, arriva qui e viene verificata la greylist prima
  # di venire eventualmente accettata dalle ACL che seguono.
  # notare che non considero il singolo host, ma la net /24 a cui esso appartiene.
  # questo e` un rilassamento del controllo per evitare di ritardare all'infinito mail che vengono
  # da sistemi che hanno diversi server smtp che lavorano in parallelo.
  # Se l'host si trova nella lista NOGREYLIST allora il controllo viene saltato e la mail accettata
  # immediatamente. 
  defer  message        = Sender is greylisted. Please try again later.
         !authenticated = *
         condition      = ${if eq {GREYLISTING} {enabled} {true}{false}}
         !hosts         = ${if exists{NOGREYLIST}{net-iplsearch;NOGREYLIST}{}}
         condition      = ${if eq {grey}\
                          {${readsocket{/var/run/greylistd/socket}\
                               {${mask:$sender_host_address/24} \
                               $sender_address \
                               $local_part@$domain}\
                               {5s}{}{} }}\
                          {true}{false}}
         log_message    = Greylisted $sender_host_address $sender_address $local_part@$domain

Se preferite considerare ogni host singolarmente e non accettare mail da tutta la /24 relativa, la acl diventa:

  # implementazione delle greylist a mezzo del demone greylistd.
  defer  message        = Sender is greylisted. Please try again later.
         !authenticated = *
         condition      = ${if eq {GREYLISTING} {enabled} {true}{false}}
         !hosts         = ${if exists{NOGREYLIST}{net-iplsearch;NOGREYLIST}{}}
         condition     = ${if eq {grey}\
                          {${readsocket{/var/run/greylistd/socket}\
                                        $sender_host_address \
                                        $sender_address \
                                        $local_part@$domain}\
                                       {5s}{}{} }}\
                          {true}{false}}
         log_message    = Greylisted $sender_host_address $sender_address $local_part@$domain

Gestione di greylistd

Potete "fare cose" a greylistd mentre gira con il comando greylist

Per esempio ecco alcuni comandi:

Script per aiutarsi a generare whitelist

Volendo, come descritto prima, inserire per esempio tutti gli host SMTP di Google o quelli di Office365 dentro il file NOGREYLIST, possiamo usare uno script come questo: https://github.com/equk/spf_list/

Trovate una copia degli script anche qui: spf_list-master.zip nel caso in cui quel repo un giorno venga cancellato. Lo script che ci interessa è spf_list.sh e possiamo usarlo per esempio come segue:

bash spf_list.sh google.com | tail -n +3 >> nogrey.list
bash spf_list.sh outlook.com | tail -n +3 >> nogrey.list

Consigli vari

Se avete piu` di un MX (avete un secondario) vi consiglio di mettere il secondario in whitelist sul primario in qualche modo in modo che il suo traffico verso il primario non sia greylistato, e inoltre DOVETE abilitare il greylisting, e in generale le stesse ACL antispam che adottate sul primario anche sul secondario. Se non lo fate, la mail che sarebbe stata bloccata vi arrivera` tutta lo stesso, a mezzo del vostro secondario che è più permissivo del primario.