Postfix Konfiguration · 6 min read · Oct 07, 2025

Virtuelle Benutzer und Domains mit Postfix, Courier und MySQL (Debian Etch) - Seite 2

4 Erstellen Sie die MySQL-Datenbank für Postfix/Courier

Standardmäßig wird MySQL ohne ein Root-Passwort installiert, das wir sofort ändern (ersetzen Sie yourrootsqlpassword mit dem Passwort, das Sie verwenden möchten):

mysqladmin -u root password yourrootsqlpassword

Jetzt erstellen wir eine Datenbank namens mail:

mysqladmin -u root -p create mail

Als Nächstes gehen wir zur MySQL-Shell:

mysql -u root -p

In der MySQL-Shell erstellen wir den Benutzer mail_admin mit dem Passwort mail_admin_password (ersetzen Sie es durch Ihr eigenes Passwort), der SELECT, INSERT, UPDATE, DELETE-Berechtigungen auf der mail-Datenbank hat. Dieser Benutzer wird von Postfix und Courier verwendet, um sich mit der Mail-Datenbank zu verbinden:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
 GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
 FLUSH PRIVILEGES;

Immer noch in der MySQL-Shell erstellen wir die Tabellen, die Postfix und Courier benötigen:

USE mail;
CREATE TABLE domains (  
 domain varchar(50) NOT NULL,  
 PRIMARY KEY (domain) )  
 TYPE=MyISAM;
CREATE TABLE forwardings (  
 source varchar(80) NOT NULL,  
 destination TEXT NOT NULL,  
 PRIMARY KEY (source) )  
 TYPE=MyISAM;
CREATE TABLE users (  
 email varchar(80) NOT NULL,  
 password varchar(20) NOT NULL,  
 quota INT(10) DEFAULT '10485760',  
 PRIMARY KEY (email)  
 ) TYPE=MyISAM;
CREATE TABLE transport (  
 domain varchar(128) NOT NULL default '',  
 transport varchar(128) NOT NULL default '',  
 UNIQUE KEY domain (domain)  
 ) TYPE=MyISAM;
quit;

Wie Sie vielleicht bemerkt haben, haben wir mit dem Befehl quit; die MySQL-Shell verlassen und sind zurück in der Linux-Shell.

Die domains-Tabelle speichert jede virtuelle Domain, für die Postfix E-Mails empfangen soll (z.B. example.com).

domain
example.com

Die forwardings-Tabelle dient dazu, eine E-Mail-Adresse auf eine andere zu aliasieren, z.B. E-Mails für [email protected] an [email protected] weiterzuleiten.

sourcedestination
[email protected][email protected]

Die users-Tabelle speichert alle virtuellen Benutzer (d.h. E-Mail-Adressen, da die E-Mail-Adresse und der Benutzername identisch sind) und Passwörter (in verschlüsselter Form!) sowie einen Quota-Wert für jedes Postfach (in diesem Beispiel beträgt der Standardwert 10485760 Bytes, was 10 MB entspricht).

emailpasswordquota
[email protected]No9.E4skNvGa. (“secret” in verschlüsselter Form)10485760

Die transport-Tabelle ist optional und dient fortgeschrittenen Benutzern. Sie ermöglicht es, E-Mails für einzelne Benutzer, ganze Domains oder alle E-Mails an einen anderen Server weiterzuleiten. Zum Beispiel,

domaintransport
example.comsmtp:[1.2.3.4]

würde alle E-Mails für example.com über das SMTP-Protokoll an den Server mit der IP-Adresse 1.2.3.4 weiterleiten (die eckigen Klammern [] bedeuten “keine Suche nach dem MX-DNS-Eintrag durchführen” (was für IP-Adressen sinnvoll ist…). Wenn Sie stattdessen einen vollqualifizierten Domainnamen (FQDN) verwenden, würden Sie die eckigen Klammern nicht verwenden.).

Übrigens, (ich gehe davon aus, dass die IP-Adresse Ihres Mailserver-Systems 192.168.0.100 ist) können Sie phpMyAdmin über http://192.168.0.100/phpmyadmin/ in einem Browser aufrufen und sich als mail_admin anmelden. Dann können Sie sich die Datenbank ansehen. Später können Sie phpMyAdmin verwenden, um Ihren Mailserver zu verwalten.

5 Konfigurieren Sie Postfix

Jetzt müssen wir Postfix mitteilen, wo es alle Informationen in der Datenbank finden kann. Dazu müssen wir sechs Textdateien erstellen. Sie werden feststellen, dass ich Postfix anweise, sich über die IP-Adresse 127.0.0.1 an MySQL zu verbinden, anstatt localhost. Dies liegt daran, dass Postfix in einem Chroot-Jail läuft und keinen Zugriff auf den MySQL-Socket hat, auf den es zuzugreifen versuchen würde, wenn ich Postfix anweisen würde, localhost zu verwenden. Wenn ich 127.0.0.1 verwende, verwendet Postfix TCP-Netzwerke, um sich mit MySQL zu verbinden, was auch in einem Chroot-Jail kein Problem darstellt (die Alternative wäre, den MySQL-Socket in das Chroot-Jail zu verschieben, was einige andere Probleme verursacht).

Bitte stellen Sie sicher, dass /etc/mysql/my.cnf die folgende Zeile enthält:

vi /etc/mysql/my.cnf

| [...] bind-address = 127.0.0.1 [...] |

Wenn Sie /etc/mysql/my.cnf ändern mussten, starten Sie MySQL jetzt neu:

/etc/init.d/mysql restart

Führen Sie

netstat -tap

aus, um sicherzustellen, dass MySQL auf 127.0.0.1 (localhost.localdomain) hört:

server1:/usr/src# netstat -tap  
 Aktive Internetverbindungen (Server und etabliert)  
 Proto Recv-Q Send-Q Lokale Adresse           Fremde Adresse         Zustand       PID/Programmname  
 tcp        0      0 localhost.localdo:mysql *:*                     LISTEN     3003/mysqld  
 tcp        0      0 *:sunrpc                *:*                     LISTEN     1684/portmap  
 tcp        0      0 *:auth                  *:*                     LISTEN     2036/inetd  
 tcp        0      0 *:1522                  *:*                     LISTEN     2077/rpc.statd  
 tcp        0      0 *:smtp                  *:*                     LISTEN     12053/master  
 tcp6       0      0 *:imaps                 *:*                     LISTEN     3839/couriertcpd  
 tcp6       0      0 *:pop3s                 *:*                     LISTEN     3629/couriertcpd  
 tcp6       0      0 *:pop3                  *:*                     LISTEN     3572/couriertcpd  
 tcp6       0      0 *:imap2                 *:*                     LISTEN     3792/couriertcpd  
 tcp6       0      0 *:www                   *:*                     LISTEN     3712/apache2  
 tcp6       0      0 *:ssh                   *:*                     LISTEN     2058/sshd  
 tcp6       0    148 server1.example.com:ssh ::ffff:192.168.0.2:4515 ESTABLISHED2139/0

Jetzt erstellen wir unsere sechs Textdateien.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

Ändern Sie dann die Berechtigungen und die Gruppe dieser Dateien:

chmod o= /etc/postfix/mysql-virtual_*.cf  
 chgrp postfix /etc/postfix/mysql-virtual_*.cf

Jetzt erstellen wir einen Benutzer und eine Gruppe namens vmail mit dem Home-Verzeichnis /home/vmail. Hier werden alle Postfächer gespeichert.

groupadd -g 5000 vmail  
 useradd -g vmail -u 5000 vmail -d /home/vmail -m

Als Nächstes nehmen wir einige Postfix-Konfigurationen vor. Stellen Sie sicher, dass Sie server1.example.com durch einen gültigen FQDN ersetzen, andernfalls funktioniert Ihr Postfix möglicherweise nicht richtig!

postconf -e 'myhostname = server1.example.com'  
 postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
 postconf -e 'mynetworks = 127.0.0.0/8'  
 postconf -e 'virtual_alias_domains ='  
 postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
 postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
 postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
 postconf -e 'virtual_mailbox_base = /home/vmail'  
 postconf -e 'virtual_uid_maps = static:5000'  
 postconf -e 'virtual_gid_maps = static:5000'  
 postconf -e 'smtpd_sasl_auth_enable = yes'  
 postconf -e 'broken_sasl_auth_clients = yes'  
 postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
 postconf -e 'smtpd_use_tls = yes'  
 postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
 postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
 postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
 postconf -e 'virtual_create_maildirsize = yes'  
 postconf -e 'virtual_maildir_extended = yes'  
 postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
 postconf -e 'virtual_mailbox_limit_override = yes'  
 postconf -e 'virtual_maildir_limit_message = "Der Benutzer, den Sie zu erreichen versuchen, hat das Quota überschritten."'  
 postconf -e 'virtual_overquota_bounce = yes'  
 postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'

Anschließend erstellen wir das SSL-Zertifikat, das für TLS benötigt wird:

cd /etc/postfix  
 openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
<-- Geben Sie Ihren Ländernamen ein (z.B. "DE").  
<-- Geben Sie Ihren Bundesland- oder Provinznamen ein.  
<-- Geben Sie Ihre Stadt ein.  
<-- Geben Sie Ihren Organisationsnamen ein (z.B. den Namen Ihres Unternehmens).  
<-- Geben Sie Ihren Namen der organisatorischen Einheit ein (z.B. "IT-Abteilung").  
<-- Geben Sie den vollqualifizierten Domainnamen des Systems ein (z.B. "server1.example.com").  
<-- Geben Sie Ihre E-Mail-Adresse ein.

Ändern Sie dann die Berechtigungen der smtpd.key:

chmod o= /etc/postfix/smtpd.key
Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.