Postfix Tutorial · 7 min read · Oct 14, 2025
Virtuelle Benutzer und Domains mit Postfix, Courier, MySQL und SquirrelMail (Debian Wheezy)
Dieses Tutorial ist Copyright (c) 2013 von Falko Timme. Es basiert auf einem Tutorial von Christoph Haas, das Sie unter http://workaround.org finden können. Sie dürfen dieses Tutorial unter der Creative Commons Lizenz 2.5 oder einer späteren Version verwenden.
Dieses Dokument beschreibt, wie man einen Postfix-Mailserver installiert, der auf virtuellen Benutzern und Domains basiert, d.h. Benutzern und Domains, die sich in einer MySQL-Datenbank befinden. Ich werde auch die Installation und Konfiguration von Courier (Courier-POP3, Courier-IMAP) demonstrieren, damit Courier gegen die gleiche MySQL-Datenbank authentifizieren kann, die Postfix verwendet.
Der resultierende Postfix-Server ist in der Lage, SMTP-AUTH und TLS und Quota zu unterstützen (Quota ist standardmäßig nicht in Postfix integriert, ich werde zeigen, wie man Postfix entsprechend patcht). Passwörter werden in verschlüsselter Form in der Datenbank gespeichert (die meisten Dokumente, die ich gefunden habe, behandelten Klartextpasswörter, was ein Sicherheitsrisiko darstellt). Zusätzlich behandelt dieses Tutorial die Installation von Amavisd, SpamAssassin und ClamAV, damit E-Mails auf Spam und Viren gescannt werden. Ich werde auch zeigen, wie man SquirrelMail als Webmail-Schnittstelle installiert, damit Benutzer E-Mails lesen und senden sowie ihre Passwörter ändern können.
Der Vorteil eines solchen “virtuellen” Setups (virtuelle Benutzer und Domains in einer MySQL-Datenbank) ist, dass es weitaus leistungsfähiger ist als ein Setup, das auf “realen” Systembenutzern basiert. Mit diesem virtuellen Setup kann Ihr Mailserver Tausende von Domains und Benutzern verwalten. Außerdem ist es einfacher zu verwalten, da Sie nur mit der MySQL-Datenbank zu tun haben, wenn Sie neue Benutzer/Domains hinzufügen oder bestehende bearbeiten. Keine weiteren postmap-Befehle zum Erstellen von db-Dateien, kein erneutes Laden von Postfix usw. Für die Verwaltung der MySQL-Datenbank können Sie webbasierte Tools wie phpMyAdmin verwenden, das ebenfalls in diesem Howto installiert wird. Der dritte Vorteil ist, dass Benutzer eine E-Mail-Adresse als Benutzernamen haben (anstatt eines Benutzernamens + einer E-Mail-Adresse), was einfacher zu verstehen und sich zu merken ist.
Dieses Howto ist als praktische Anleitung gedacht; es behandelt nicht die theoretischen Hintergründe. Diese werden in vielen anderen Dokumenten im Web behandelt.
Dieses Dokument kommt ohne jegliche Gewährleistung! Ich möchte sagen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten, dieses Ziel zu erreichen, aber dies ist der Weg, den ich wähle. Ich gebe keine Garantie, dass dies für Sie funktioniert!
1 Vorbemerkung
Dieses Tutorial basiert auf Debian Wheezy, daher sollten Sie eine grundlegende Debian Wheezy-Serverinstallation einrichten, bevor Sie mit diesem Tutorial fortfahren. Das System sollte eine statische IP-Adresse haben. Ich verwende 192.168.0.100 als meine IP-Adresse in diesem Tutorial und server1.example.com als den Hostnamen.
Es ist sehr wichtig, dass Sie /bin/sh als Symlink zu /bin/bash machen…
dpkg-reconfigure dashVerwenden Sie dash als Standard-System-Shell (/bin/sh)? <– Nein
… und dass Sie AppArmor deaktivieren:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils2 Installieren Sie Postfix, Courier, Saslauthd, MySQL, phpMyAdmin
Um Postfix, Courier, Saslauthd, MySQL und phpMyAdmin zu installieren, führen wir einfach aus
apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpassSie werden ein paar Fragen gestellt:
Allgemeiner Typ der Mailkonfiguration: <– Internet Site
System-Mail-Name: <– server1.example.com
Neues Passwort für den MySQL “root”-Benutzer: <– yourrootsqlpassword
Wiederholen Sie das Passwort für den MySQL “root”-Benutzer: <– yourrootsqlpassword
Verzeichnisse für die webbasierte Verwaltung erstellen? <– Nein
SSL-Zertifikat erforderlich <– Ok
Webserver automatisch neu konfigurieren: <– apache2
Datenbank für phpmyadmin mit dbconfig-common konfigurieren? <– Nein
3 Wenden Sie den Quota-Patch auf Postfix an
Wir müssen die Postfix-Quellen abrufen, sie mit dem Quota-Patch patchen, neue Postfix.deb-Pakete erstellen und diese .deb-Pakete installieren:
apt-get build-dep postfixcd /usr/src
apt-get source postfix(Stellen Sie sicher, dass Sie die richtige Postfix-Version in den folgenden Befehlen verwenden. Ich habe Postfix 2.9.6 installiert. Sie können Ihre Postfix-Version herausfinden, indem Sie ausführen
postconf -d | grep mail_versionDie Ausgabe sollte so aussehen:
root@server1:/usr/src# postconf -d | grep mail_version
mail_version = 2.9.6
milter_macro_v = $mail_name $mail_version
root@server1:/usr/src#)
wget http://vda.sourceforge.net/VDA/postfix-vda-v11-2.9.6.patch
cd postfix-2.9.6
patch -p1 < ../postfix-vda-v11-2.9.6.patchÖffnen Sie als Nächstes debian/rules und ändern Sie DEB_BUILD_HARDENING von 1 auf 0:
vi debian/rules| [...] export DEB_BUILD_HARDENING=0 [...] |
Wenn Sie dies nicht tun, schlägt Ihr Build mit den folgenden Fehlermeldungen fehl:
maildir.c: In function âdeliver_maildirâ:
maildir.c:974:17: error: format not a string literal and no format arguments [-Werror=format-security]
maildir.c:977:17: error: format not a string literal and no format arguments [-Werror=format-security]
maildir.c:983:17: error: format not a string literal and no format arguments [-Werror=format-security]
maildir.c:986:17: error: format not a string literal and no format arguments [-Werror=format-security]
maildir.c: In function âsql2fileâ:
maildir.c:404:25: warning: ignoring return value of âreadâ, declared with attribute warn_unused_result [-Wunused-result]
maildir.c:417:26: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result [-Wunused-result]
cc1: some warnings being treated as errors
make: * [maildir.o] Error 1
make: Leaving directory `/usr/src/postfix-2.9.3/src/virtual'
make[1]: * [update] Error 1
make[1]: Leaving directory `/usr/src/postfix-2.9.3'
make: *** [build] Error 2
dpkg-buildpackage: error: debian/rules build gave error exit status 2
root@server1:/usr/src/postfix-2.9.3#Jetzt können wir die neuen Postfix.deb-Pakete erstellen:
dpkg-buildpackageJetzt gehen wir ein Verzeichnis nach oben, dort wurden die neuen .deb-Pakete erstellt:
cd ..Der Befehl
ls -lzeigt Ihnen die verfügbaren Pakete:
root@server1:/usr/src# ls -l
total 8400
drwxr-xr-x 4 root root 4096 May 7 01:24 linux-headers-3.2.0-4-amd64
drwxr-xr-x 4 root root 4096 May 7 01:24 linux-headers-3.2.0-4-common
lrwxrwxrwx 1 root root 23 Jun 24 2012 linux-kbuild-3.2 -> ../lib/linux-kbuild-3.2
drwxr-xr-x 18 root root 4096 Jul 1 21:13 postfix-2.9.6
-rw-r--r-- 1 root root 3561 Jul 1 21:13 postfix_2.9.6-2_amd64.changes
-rw-r--r-- 1 root root 1529980 Jul 1 21:13 postfix_2.9.6-2_amd64.deb
-rw-r--r-- 1 root root 254432 Jul 1 21:12 postfix_2.9.6-2.diff.gz
-rw-r--r-- 1 root root 1492 Jul 1 21:12 postfix_2.9.6-2.dsc
-rw-r--r-- 1 root root 3767309 Mar 11 15:03 postfix_2.9.6.orig.tar.gz
-rw-r--r-- 1 root root 255470 Jul 1 21:13 postfix-cdb_2.9.6-2_amd64.deb
-rw-r--r-- 1 root root 367774 Jul 1 21:13 postfix-dev_2.9.6-2_all.deb
-rw-r--r-- 1 root root 1294258 Jul 1 21:13 postfix-doc_2.9.6-2_all.deb
-rw-r--r-- 1 root root 264196 Jul 1 21:13 postfix-ldap_2.9.6-2_amd64.deb
-rw-r--r-- 1 root root 257322 Jul 1 21:13 postfix-mysql_2.9.6-2_amd64.deb
-rw-r--r-- 1 root root 257376 Jul 1 21:13 postfix-pcre_2.9.6-2_amd64.deb
-rw-r--r-- 1 root root 257476 Jul 1 21:13 postfix-pgsql_2.9.6-2_amd64.deb
-rw-r--r-- 1 root root 55009 May 7 08:47 postfix-vda-v11-2.9.6.patch
drwxr-xr-x 7 root root 4096 May 7 01:24 virtualbox-guest-4.1.18
root@server1:/usr/src#Wählen Sie die Pakete postfix und postfix-mysql aus und installieren Sie sie wie folgt:
dpkg -i postfix_2.9.6-2_amd64.deb postfix-mysql_2.9.6-2_amd64.deb4 Erstellen Sie die MySQL-Datenbank für Postfix/Courier
Jetzt erstellen wir eine Datenbank namens mail:
mysqladmin -u root -p create mailAls Nächstes gehen wir in die MySQL-Shell:
mysql -u root -pIn 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 von Postfix und Courier benötigt werden:
USE mail;CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
ENGINE=MyISAM;CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
ENGINE=MyISAM;CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) ENGINE=MyISAM;CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) ENGINE=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 verweisen, z.B. E-Mails für [email protected] an [email protected] weiterzuleiten.
| source | destination |
| [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 ist der Standardwert 10485760 Bytes, was 10 MB entspricht).
| password | quota | |
| [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,
| domain | transport |
| example.com | smtp:[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.
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.