Sécurité Email · 5 min read · Sep 22, 2025

Améliorer la protection contre les abus de spam dans dovecot en restreignant l'accès aux comptes de messagerie par adresse IP (par exemple avec ISPConfig 3)

Ce que nous allons faire

Ce guide vous montrera comment ajouter des restrictions IP à des comptes de messagerie uniques lors de l’utilisation de dovecot avec MySQL.

C’est particulièrement utile si vous devez accéder à un compte de messagerie depuis une seule adresse IP ou quelques adresses IP, ou si vous souhaitez bloquer des adresses IP spécifiques d’accéder au compte de messagerie (par exemple, en raison d’abus de spam).

Prérequis

  • une installation dovecot fonctionnelle avec des utilisateurs virtuels via MySQL (de préférence gérée par ISPConfig 3)

Si vous n’utilisez pas ISPConfig 3, vous devrez peut-être modifier les noms de table et/ou de colonne dans les requêtes.

Modifications de votre système

Tout d’abord, nous devons créer une nouvelle table de base de données sur votre serveur de messagerie. Dans ce guide, nous l’ajouterons à la base de données ISPConfig dbispconfig.

Ouvrez la console MySQL :
mysql -u root -D dbispconfig -p

Une fois connecté, créez la nouvelle table de restriction IP avec cette requête :

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;

Maintenant, vous devez modifier la configuration SQL de dovecot. Sur les installations ISPConfig 3 (par exemple, Debian/Ubuntu), elle devrait se trouver dans /etc/dovecot/dovecot-sql.conf

Modifiez ces lignes :

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'

(si vous n’utilisez pas la dernière version d’ISPConfig 3, les lignes de votre configuration peuvent légèrement différer)

à :

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 NULL

Maintenant, redémarrez dovecot :
service dovecot restart (ou /etc/init.d/dovecot restart, selon votre système)

Gardez un œil sur le journal des mails et/ou du système maintenant ! Si vous voyez des erreurs de votre dovecot, alors quelque chose s’est mal passé et vous devriez vérifier vos modifications ou les annuler.
Si tout fonctionne comme avant, alors vous êtes prêt à partir.

Comment restreindre l’accès

Vous avez différentes possibilités pour restreindre l’accès à une boîte aux lettres maintenant. Je vais vous montrer comment le faire avec des requêtes SQL sur la console mysql, mais vous pouvez bien sûr utiliser phpMyAdmin.

Bloquer une IP

Pour bloquer une seule IP d’accéder à un compte de messagerie, vous devez l’ajouter à la table de restriction avec le mode ‘b’ :

Tout d’abord, vous avez besoin de l’identifiant mailuser_id pour votre compte de messagerie (par exemple, [email protected]). C’est une simple requête SQL :

SELECT mailuser_id FROM mail_user WHERE email = ‘ [email protected] ‘;

Cela renverra un numéro (id) comme 12345. Maintenant, ajoutez l’entrée de restriction pour cet id :

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘’);

Cette entrée bloquera l’IP 123.234.123.234 d’accéder à tous les services (pop3, imap, smtp) du compte de messagerie 12345.

Si vous souhaitez que l’IP puisse accéder à pop et imap mais l’empêcher d’utiliser smtp (envoyer des mails), vous pouvez ajouter cette entrée à la place :

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘smtp’);

Vous pouvez ajouter plusieurs services de cette manière, une entrée pour chacun. Mais gardez à l’esprit que l’entrée ‘’ bloque tous les services.

Restreindre à des IP spécifiques

Comme vous pouvez bloquer, vous pouvez même restreindre l’utilisation des comptes de messagerie à des IP uniques. Cela signifie AUCUNE autre IP que celles spécifiées ne peut accéder au compte. Vous devez simplement créer une entrée avec le mode ‘w’ au lieu de ‘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’);

Cette entrée fait ce qui suit :

  • toutes les IP peuvent utiliser imap du compte 12345 ( [email protected])
  • seule l’IP 123.234.123.234 peut utiliser pop3 pour ce compte - toutes les autres IP ne le peuvent pas !
  • seule l’IP 123.234.123.235 peut utiliser smtp pour ce compte - toutes les autres IP ne le peuvent pas !

Bien sûr, vous pouvez combiner toutes les fonctionnalités et créer plusieurs entrées IP pour différents modes et services.

Cas d’utilisation

D’accord, quelques choses de la vie réelle maintenant. Imaginez que vous avez une adresse mail utilisée par votre boutique en ligne pour envoyer des mails. Personne d’autre ne devrait envoyer des mails avec ce compte, mais vous aimeriez vérifier si quelqu’un répond à vos mails de boutique. Cela, encore une fois, ne doit se faire que par imap, pas par pop3.

Voici les entrées que vous créeriez dans ce cas, où 10.0.0.101 est l’IP du serveur web avec votre boutique et 12345 est le mailuser_id de votre compte de messagerie.

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’);

Aucune autre IP que 10.0.0.101 ne peut accéder à smtp de ce compte de messagerie spécifique et personne ne peut accéder à pop3 pour celui-ci. Imap est disponible pour toutes les IP.

N’oubliez pas IPv6 ! Si votre serveur ou le client que vous souhaitez spécifier a une adresse ipv4 et une adresse ipv6, vous devez ajouter les deux !

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.