Dovecot Config · 4 min read · Sep 22, 2025
Migliora la protezione contro l'abuso di spam in dovecot limitando l'accesso agli account di posta per indirizzo IP (ad es. con ISPConfig 3)
Cosa faremo
Questo howto ti mostrerà come aggiungere restrizioni ip a singoli account di posta quando utilizzi dovecot con MySQL.
Questo è particolarmente utile se hai bisogno di accedere a un account di posta da un solo ip o da pochi ip o se desideri bloccare indirizzi ip specifici dall’accesso all’account di posta (ad es. a causa di abusi di spam).
Requisiti
- un’installazione di dovecot funzionante con utenti virtuali tramite MySQL (preferibilmente gestita da ISPConfig 3)
Se non utilizzi ISPConfig 3, potresti dover modificare i nomi delle tabelle e/o delle colonne nel database nelle query.
Modifiche al tuo sistema
Prima dobbiamo creare una nuova tabella nel database sul tuo server di posta. In questo howto la aggiungeremo al database ISPConfig dbispconfig.
Apri la console MySQL:
mysql -u root -D dbispconfig -p
Quando sei loggato, crea la nuova tabella di restrizione ip con questa query:
CREATE TABLE mail_user_ip_restriction (
restriction_id INT(11) UNSIGNED NOT NULL auto_increment,
mailuser_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
ip VARCHAR(50) NOT NULL DEFAULT '',
mode ENUM('w','b') NOT NULL DEFAULT 'w',
service VARCHAR(10) NOT NULL DEFAULT '',
PRIMARY KEY (`restriction_id`),
KEY `ident` (`mailuser_id`, `mode`, `service`, `ip`)
) ENGINE=MyISAM;Ora devi modificare la configurazione sql di dovecot. Sulle installazioni di ISPConfig 3 (ad es. Debian/Ubuntu) dovrebbe trovarsi in /etc/dovecot/dovecot-sql.conf
Modifica queste righe:
password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n'
user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n'(se non stai utilizzando l’ultima versione di ISPConfig 3, le righe nella tua configurazione potrebbero differire leggermente)
in:
password_query = SELECT m.password FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULL
user_query = SELECT m.email as user, m.maildir as home, CONCAT('maildir:', m.maildir, '/Maildir') as mail, m.uid, m.gid, CONCAT('*:storage=', m.quota, 'B') AS quota_rule, CONCAT(m.maildir, '/.sieve') as sieve FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULLOra riavvia dovecot:
service dovecot restart (o /etc/init.d/dovecot restart, a seconda del tuo sistema)
Tieni d’occhio il log della posta e/o di sistema ora! Se vedi errori dal tuo dovecot, allora qualcosa è andato storto e dovresti controllare le tue modifiche o ripristinarle.
Se tutto funziona come prima, allora sei pronto per partire.
Come limitare l’accesso
Hai diverse possibilità per limitare l’accesso a una casella di posta ora. Ti mostrerò il modo di farlo con query SQL sulla console mysql, ma puoi usare anche phpMyAdmin, ovviamente.
Blocca ip
Per bloccare un singolo ip dall’accesso a un account di posta, devi aggiungerlo alla tabella di restrizione con modalità ‘b’:
Prima hai bisogno dell’id dell’utente di posta per il tuo account di posta (ad es. [email protected]). Questa è una semplice query SQL:
SELECT mailuser_id FROM mail_user WHERE email = ‘ [email protected] ‘;
Questo restituirà un numero (id) come 12345. Ora aggiungi l’entry di restrizione per questo id:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘’);
Questa entry bloccherà l’ip 123.234.123.234 dall’accesso a tutti i servizi (pop3, imap, smtp) dell’account di posta 12345.
Se desideri che l’ip possa accedere a pop e imap ma impedirgli di utilizzare smtp (inviare email), puoi aggiungere invece questa entry:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘smtp’);
Puoi aggiungere più servizi in questo modo, un’entry per ciascuno. Ma tieni presente che l’entry ‘’ blocca tutti i servizi.
Limita a ip specifici
Come puoi bloccare, puoi anche limitare l’uso degli account di posta a singoli ip. Questo significa che NESSUN altro ip oltre a quelli specificati può accedere all’account. Devi semplicemente creare un’entry con modalità ‘w’ invece di ‘b’:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘w’, ‘pop3’);
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.235’, ‘w’, ‘smtp’);
Questa entry fa quanto segue:
- tutti gli ip possono utilizzare imap dell’account 12345 ( [email protected])
- solo l’ip 123.234.123.234 può utilizzare pop3 per questo account - tutti gli altri ip no!
- solo l’ip 123.234.123.235 può utilizzare smtp per questo account - tutti gli altri ip no!
Certo, puoi combinare tutte le funzionalità e creare più entry ip per modalità e servizi diversi.
Caso d’uso
Ok, ora alcune cose della vita reale. Immagina di avere un indirizzo email utilizzato dal tuo negozio online per inviare email. Nessun altro dovrebbe inviare email con questo account, ma vorresti controllare se qualcuno risponde alle email del tuo negozio. Questo, di nuovo, dovrebbe essere fatto solo tramite imap, non tramite pop3.
Queste sono le entry che creeresti in questo caso, dove 10.0.0.101 è l’ip del server web con il tuo negozio e 12345 è l’id dell’utente di posta del tuo account di posta.
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘10.0.0.101’, ‘w’, ‘smtp’);
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘none’, ‘w’, ‘pop3’);
Nessun altro ip oltre a 10.0.0.101 può accedere a smtp di questo specifico account di posta e nessuno può accedere a pop3 per esso. Imap è disponibile per tutti gli ip.
Non dimenticare l’IPv6! Se il tuo server o il client che vuoi specificare ha un indirizzo ipv4 e un indirizzo ipv6, devi aggiungere entrambi!
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.