Il greylisting è un metodo per difendere le e-mail degli utenti dallo spam. Un mail transfer agent (MTA) che usa il greylisting rigetterà temporaneamente ogni mail da un mittente sconosciuto. Se la mail è legittima, il server di origine della mail ritenterà l'invio dopo un certo tempo, e se è trascorso un intervallo di tempo sufficiente, la mail verrà accettata.
Benchè il greylisting non sia effeicace come in passato, contribuisce sempre a eliminare una certa frazione dello spam totale.
Changelog
- Mar 17, 2025
- aggiunta una patch al plugin greylisting perqmail-spp
per risolvere un problema di compilazione su rocky 8 (grazie a Shailendra Shukla) - 18 aprile 2023
- Bai Borko ha suggerito un approccio differente per quanto riguarda la pulizia del databasejgreylist
e ha postato il suo script qui. Sostanzialmente, invece di eliminare i record più vecchi, il suo script lascia i record di IP affidabili negli ultimi 30 giorni, basandosi sul log di qmail-smtpd.
qmail-spp greylisting
plugin
Introduciamo qui come implementare il greylisting
su qmail
attraverso un altro pluginqmail-spp, che salva i dati su MySQL
. Avere i dati su MySQL
è utile per misurare quanto spam è stato bloccato dal greylisting
.
- Maggiori informazioni qui
- Autore: Manuel Mausz
Scarichiamo il programma
cd /usr/local/src wget https://manuel.mausz.at/coding/qmail-spp/greylisting/greylisting-0.5.tgz wget https://notes.sagredo.eu/files/qmail/patches/greylisting_DEFAULT_SOURCE.patch tar xzf greylisting-0.5.tgz cd greylisting-0.5 patch < ../greylisting_DEFAULT_SOURCE.patch
Abbiamo applicato una patch per risolvere un problema nella compilazione su rocky 8 (grazie a Shailendra Shukla). Compile and installare:
cc -std=c99 -o /var/qmail/plugins/greylisting greylisting.c -I/usr/include -I/usr/include/mysql -I/usr/local/include/mysql -L/usr/lib/mysql -L/usr/lib64/mysql -L/usr/local/lib/mysql -L/usr/local/lib64/mysql -lmysqlclient strip /var/qmail/plugins/greylisting
Installiamo i file di configurazione
cp mysql.cnf /var/qmail/control chown vpopmail:vchkpw /var/qmail/control/mysql.cnf chmod 600 /var/qmail/control/mysql.cnf cp greylisting.config /var/qmail/control/greylisting chown root:root /var/qmail/control/greylisting chmod 644 /var/qmail/control/greylisting
Prepariamo il database mysql e creiamo l'utente mysql
> mysql -u root -p CREATE USER 'greylisting'@'localhost' IDENTIFIED BY '***'; GRANT USAGE ON *.* TO 'greylisting'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; CREATE DATABASE IF NOT EXISTS greylisting; GRANT ALL PRIVILEGES ON greylisting.* TO 'greylisting'@'localhost';
Ora installiamo lo schema del database dal file greylisting.sql (notare che nello stesso file si trovano degli esempi per le query di tipo whitelist e blacklist):
mysql < greylisting.sql -D greylisting -u greylisting -p
Copiare le proprie credenziali mysql in mysql.cnf file. Per esempio:
cat > /var/qmail/control/mysql.cnf << __EOF__ [client] #socket=/run/mysqld/mysqld.sock #host=10.1.2.3 user=greylisting password=secret database=greylisting __EOF__
La connessione può essere fatta su un host mysql
locale, oppure attraverso un socket mysql. Se, come nel mio caso, mysql
è installato in un host differente, decommentare la riga "host".
Ora definire la "greylist" nel file smtpplugin:
# smtpplugins sample file # other lines here [rcpt] plugins/ifauthskip plugins/greylisting
Per abilitare il greylisting
è necessario esportare questa variabile nel proprio ambiente tcpserver. Ad esempio si può aggiungerla nel proprio fil qmail-smtpd/run
export GREYLISTING=""
o abilitare una tcprule in tcp.smtp
, per esempio:
:allow,GREYLISTING=""
Notare che il greylisting
non è mai abilitato per i RELAYCLIENTS
.
Infine modificare i parametri nel file /var/qmail/control/greylisting
cat > /var/qmail/control/greylisting << __EOF__ mysql_default_file=control/mysql.cnf block_expire=2 record_expire=2000 record_expire_good=36 loglevel=4 __EOF__
block_expire=2
indica che l'IP verrà bloccato per 2 minuti, mentre record_expire=2000
significa che dopo 2000 minuti sarà nuovamente posto in greylist.
Ora installare in un cronjob il programma che ripulirà il database:
cp greylisting_cleanup.sh /usr/local/sbin/greylisting_cleanup.sh chmod +x /usr/local/sbin/greylisting_cleanup.sh
Ecco un esempio di crontab
# greylisting 0 2 * * * /usr/local/sbin/greylisting_cleanup.sh >> /var/log/cron
Se si vuole usare il greylisting anche nella porta submission, sarebbe bene disabilitarlo quando l'utente ha superato l'autenticazione. Per fare questo installiamo il plugin "ifauthskip" dello stesso autore
wget https://notes.sagredo.eu/files/qmail/patches/qmail-spp/plugins/ifauthskip.c cc -o /var/qmail/plugins/ifauthskip ifauthskip.c
e inseriamolo prima del greylisting in control/smtpplugin
[rcpt] plugins/ifauthskip plugins/greylisting
jgreylist
This is a greylist program by John Simpson. It is very good and I honestly I don't know if suggest this one or the previous one. It stores the data on files (have a look to the page of the author for details). He ships both a Perl and a C version of the program.
Here is how to install anche configure the C program:
cd /usr/local/src wget https://notes.sagredo.eu/files/qmail/patches/greylisting/jms/jgreylist.c wget https://notes.sagredo.eu/files/qmail/patches/greylisting/jms/jgreylist-clean
Compile and install
cc -o /var/qmail/bin/jgreylist jgreylist.c chmod 0750 /var/qmail/bin/jgreylist cp jgreylist-clean /usr/local/sbin/jgreylist-clean chmod +x /usr/local/sbin/jgreylist-clean chown root:root /usr/local/sbin/jgreylist-clean
Define your jgreylist
directory (where the data will be saved) and let qmail-smtpd
to write into it
mkdir -m 0700 /var/qmail/jgreylist
chown vpopmail:vchkpw /var/qmail/jgreylist
add these variables to your qmail-smtpd
run file
export JGREYLIST_DIR="/var/qmail/jgreylist" export JGREYLIST_LOG_SMTP=1
finally execute jgrelist
before qmail-smtpd
, for example
exec /usr/local/bin/softlimit -m "$SOFTLIMIT" \ /usr/local/bin/tcpserver -4 -v -R -l "$LOCAL" \ -x /home/vpopmail/etc/tcp.smtp.cdb -c "$MAXSMTPD" \ -u "$QMAILDUID" -g "$NOFILESGID" 0 25 \ /var/qmail/bin/jgreylist \ /var/qmail/bin/qmail-smtpd 2>&1
Install the "clean" program in your cronjob
# jgreylist 0 2 * * * /usr/local/sbin/jgreylist-clean >> /var/log/cron
Now restart qmail
.
Bai Borko ha suggerito un approccio differente per quanto riguarda la pulizia del database jgreylist
e ha postato il suo script qui. Sostanzialmente, invece di eliminare i record più vecchi, il suo script lascia i record di IP affidabili negli ultimi 30 giorni, basandosi sul log di qmail-smtpd.