Dovecot Konfiguration · 4 min read · Sep 22, 2025
Verbessern Sie den Schutz vor Spam-Missbrauch in Dovecot, indem Sie den Zugriff auf Mailkonten nach IP-Adresse einschränken (z. B. mit ISPConfig 3)
Was wir tun werden
Dieses Howto zeigt Ihnen, wie Sie IP-Beschränkungen für einzelne Mailkonten hinzufügen, wenn Sie Dovecot mit MySQL verwenden.
Dies ist besonders nützlich, wenn Sie auf ein Mailkonto nur von einer einzigen IP oder wenigen IPs zugreifen müssen oder wenn Sie bestimmte IP-Adressen vom Zugriff auf das Mailkonto blockieren möchten (z. B. aufgrund von Spam-Missbrauch).
Voraussetzungen
- eine funktionierende Dovecot-Installation mit virtuellen Benutzern über MySQL (vorzugsweise von ISPConfig 3 verwaltet)
Wenn Sie ISPConfig 3 nicht verwenden, müssen Sie möglicherweise die Datenbanktabellen und/oder Spaltennamen in den Abfragen ändern.
Änderungen an Ihrem System
Zuerst müssen wir eine neue Datenbanktabelle auf Ihrem Mailserver erstellen. In diesem Howto fügen wir sie zur ISPConfig-Datenbank dbispconfig hinzu.
Öffnen Sie die MySQL-Konsole:
mysql -u root -D dbispconfig -p
Wenn Sie eingeloggt sind, erstellen Sie die neue IP-Beschränkungstabelle mit dieser Abfrage:
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;Jetzt müssen Sie die Dovecot-SQL-Konfiguration ändern. Bei ISPConfig 3-Installationen (z. B. Debian/Ubuntu) sollte sie sich in /etc/dovecot/dovecot-sql.conf befinden.
Ändern Sie diese Zeilen:
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'(Wenn Sie nicht die neueste Version von ISPConfig 3 verwenden, können die Zeilen in Ihrer Konfiguration leicht abweichen)
zu:
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 NULLJetzt starten Sie Dovecot neu:
service dovecot restart (oder /etc/init.d/dovecot restart, je nach Ihrem System)
Behalten Sie jetzt das Mail- und/oder Systemprotokoll im Auge! Wenn Sie Fehler von Ihrem Dovecot sehen, ist etwas schiefgelaufen und Sie sollten Ihre Änderungen überprüfen oder rückgängig machen.
Wenn alles wie zuvor läuft, sind Sie bereit.
Wie man den Zugriff einschränkt
Sie haben jetzt verschiedene Möglichkeiten, den Zugriff auf ein Postfach einzuschränken. Ich werde Ihnen zeigen, wie Sie dies mit SQL-Abfragen in der MySQL-Konsole tun, aber Sie können natürlich auch phpMyAdmin verwenden.
IP blockieren
Um eine einzelne IP vom Zugriff auf ein Mailkonto zu blockieren, müssen Sie sie mit dem Modus ‘b’ zur Einschränkungstabelle hinzufügen:
Zuerst benötigen Sie die mailuser_id für Ihr Mailkonto (z. B. [email protected]). Dies ist eine einfache SQL-Abfrage:
SELECT mailuser_id FROM mail_user WHERE email = ‘ [email protected] ‘;
Dies gibt eine Zahl (ID) wie 12345 zurück. Jetzt fügen Sie den Einschränkungseintrag für diese ID hinzu:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘’);
Dieser Eintrag blockiert die IP 123.234.123.234 vom Zugriff auf alle Dienste (POP3, IMAP, SMTP) des Mailkontos 12345.
Wenn Sie möchten, dass die IP auf POP und IMAP zugreifen kann, sie jedoch daran hindern möchten, SMTP (E-Mails senden) zu verwenden, können Sie stattdessen diesen Eintrag hinzufügen:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘smtp’);
Sie können mehrere Dienste auf diese Weise hinzufügen, einen Eintrag für jeden. Aber denken Sie daran, dass der Eintrag ‘’ alle Dienste blockiert.
Auf bestimmte IPs beschränken
Wie Sie blockieren können, können Sie auch die Nutzung von Mailkonten auf einzelne IPs beschränken. Das bedeutet, dass KEINE andere IP als die angegebenen auf das Konto zugreifen kann. Sie müssen einfach einen Eintrag mit dem Modus ‘w’ anstelle von ‘b’ erstellen:
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’);
Dieser Eintrag bewirkt Folgendes:
- alle IPs können IMAP des Kontos 12345 ( [email protected]) verwenden
- nur die IP 123.234.123.234 kann POP3 für dieses Konto verwenden - alle anderen IPs nicht!
- nur die IP 123.234.123.235 kann SMTP für dieses Konto verwenden - alle anderen IPs nicht!
Natürlich können Sie alle Funktionen kombinieren und mehrere IP-Einträge für verschiedene Modi und Dienste erstellen.
Anwendungsfall
Ok, jetzt etwas aus dem echten Leben. Stellen Sie sich vor, Sie haben eine Mailadresse, die von Ihrem Online-Shop zum Versenden von E-Mails verwendet wird. Niemand sonst sollte mit diesem Konto E-Mails senden, aber Sie möchten überprüfen, ob jemand auf Ihre Shop-E-Mails antwortet. Dies soll wiederum nur über IMAP und nicht über POP3 erfolgen.
Dies sind die Einträge, die Sie in diesem Fall erstellen würden, wobei 10.0.0.101 die IP des Webservers mit Ihrem Shop ist und 12345 die mailuser_id Ihres Mailkontos ist.
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’);
Keine andere IP als 10.0.0.101 kann auf SMTP von diesem spezifischen Mailkonto zugreifen und niemand kann auf POP3 dafür zugreifen. IMAP ist für alle IPs verfügbar.
Vergessen Sie nicht IPv6! Wenn Ihr Server oder der Client, den Sie angeben möchten, eine IPv4- und eine IPv6-Adresse hat, müssen Sie beide hinzufügen!
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.