Riprendendo il discorso gia’ iniziato sullo spam che cerca di raggiungere utenti inesistenti, dopo l’uso di dkimproxy, ho pensato di fare un ulteriore passo in avanti (o indietro…domani vedremo).
Nella catena di ricezione delle email postfix:25(DNSBL) -> postgrey:60000 … postfix:25 -> amavis:10024 -> postfix:10025, ho pensato che forse sprecare tutta questa CPU e memoria per gestire un 80% di email destinata a utenti inesistenti e’ un grosso peccato, per cui, perche’ non creare una lista di destinatari esistenti e relativi alias, direttamente al primo postfix ? Si risponderebbe (o anche no, vedete voi) che l’utente non esiste e fine, senza passare per tutti gli step.
Visto che gli utenti nel mio caso sono in un db MySQL, ho fatto quindi un paio di modifiche a postfix aggiungendo (anche se in realta’ l’opzione era gia’ presente ma lo dico per completezza) le seguenti impostazioni nel main.cf:
smtpd_recipient_restrictions =
…
check_recipient_access hash:/etc/postfix/recipient_access,
…
A questo punto, tramite un banale script, genero il file recipient_access:
#!/bin/sh
# Sostiture xxx con la password di accesso a mysql, se necessaria,
cat /dev/null > /etc/postfix/recipient_access
for user in `mysql -N -pxxx –batch -e ‘select username from mailbox order by domain’ postfix`
do
echo $user’ FILTER smtp-amavis:[localhost]:10024′ >> /etc/postfix/recipient_access
done
for user in `mysql -N -pxxx –batch -e ‘select address from alias where address <> goto order by domain’ postfix`
do
echo $user’ FILTER smtp-amavis:[localhost]:10024′ >> /etc/postfix/recipient_access
done
for domain in `mysql -N -pxxx –batch -e ‘select domain from domain order by domain’ postfix`
do
echo $domain’ 550 Illegal user.’ >> /etc/postfix/recipient_access
done
cd /etc/postfix
postmap recipient_access > /dev/null 2>&1
postfix reload > /dev/null 2>&1
Cosa otteniamo ? Il seguente file recipient_access:
esiste1@dominio.tld FILTER smtp-amavis:[localhost]:10024
esiste2@dominio.tld FILTER smtp-amavis:[localhost]:10024
…
dominio.tld 550 Illegal user.
Con questa piccola modifica, le email per utenti inesistenti saranno bloccate al loro primo contatto e non intaseranno piu’ il server nel passaggio dei filtri successivi.
Funziona ? Non funziona ? Da una prima analisi mi parrebbe di si’, vediamo domani cosa succede.
Update: Ecco alcuni numeri il giorno dopo:
Mail lecite:
grep ‘delivered’ /var/log/syslog.0 | wc
2531 32931 370647
grep ‘Illegal user’ /var/log/syslog.0 | wc
48161 1011383 13132925
Mi sembra un buon risultato.