Mail Server · 3 min read · Oct 06, 2025

Vollständige Mail-Server-Lösung mit virtuellen Domains & Benutzern (Debian Etch, Postfix, Mysql, Dovecot, DSpam, ClamAV, Postgrey, RBL) - Seite 4

B. Einrichtung von Postfix für virtuelle Benutzer & Domains

Obwohl die Mail-Exchanger keine Mails an die virtuellen Benutzer und Domains zustellen, werden sie basierend auf gültigen/ungültigen Zielen ablehnen. Daher müssen die MX-Server in der Lage sein, sich mit dem SQL-Server zu verbinden, um die Ziele zu überprüfen. Gehen Sie voran und geben Sie die Informationen in postconf ein:

# postconf -e 'virtual_alias_domains ='
# postconf -e 'virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf'
# postconf -e 'virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf'
# postconf -e 'virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf'
# postconf -e 'virtual_mailbox_base = /vmail'
# postconf -e 'virtual_minimum_uid = 150'
# postconf -e 'virtual_uid_maps = static:150'
# postconf -e 'virtual_gid_maps = static:8'
# postconf -e 'virtual_create_maildirsize = yes'
# postconf -e 'virtual_mailbox_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 erreichen möchten, hat sein Kontingent überschritten."
# postconf -e 'virtual_overquota_bounce = yes'
# postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transports.cf'

Es gibt hier mehrere “Fallen”. Diese Konfiguration wird die virtuellen Benutzerpostfächer in /vmail hosten. Falls Sie Ihre Postfächer an einem anderen Ort speichern müssen, ändern Sie die Zeile virtual_mailbox_base entsprechend.

Die virtual_minimum_uid und virtual_uid_maps verweisen auf die Benutzer-ID 150. Diese Benutzer-ID ist für einen speziell erstellten “Virtuellen Mail”-Benutzer. Er verwendet die Standardgruppe “mail” mit der Standard-GID (Debian) von 8. Sie können den Benutzer und das Verzeichnis wie folgt erstellen:

# useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Virtuelles Postfach" vmail
# mkdir /var/vmail
# chmod 770 /var/vmail/
# chown vmail:mail /var/vmail/

Jetzt müssen wir die NFS-Client-Tools installieren:

# apt-get install nfs-common portmap

Das Verzeichnis muss dann mit dem NFS-Share verbunden werden. Um einen einfachen Test durchzuführen, führen Sie Folgendes aus:

# mount files-1.internal.example.com:/vmail /vmail

Sie sollten jetzt Zugriff auf das /vmail-Share von files-1 haben. Versuchen Sie, eine Datei zu schreiben (es sollte nicht funktionieren!):

# cd /vmail
# touch tmp

HINWEIS: Sie sollten einen Fehler wegen schreibgeschütztem Zugriff erhalten!

Vorausgesetzt, alles funktioniert, gehen Sie voran und trennen Sie das NFS:

# cd /
umount /vmail

Und machen Sie die Einbindung dauerhaft, indem Sie Folgendes in Ihre /etc/fstab einfügen:

[...]  
files-1.internal.example.com:/vmail /vmail nfs ro,rsize=4096,hard,intr,tcp,noatime,nodev,async 0 0

Gehen Sie voran und binden Sie das Dateisystem ein letztes Mal:

# mount /vmail

… und Sie sind bereit!

C. Postfix MySQL-Konfiguration

Postfix wurde mit MySQL-Unterstützung installiert, aber das bedeutet nicht, dass es bereits weiß, wie es unsere Datenbank verwenden kann. Es muss mit verschiedenen SQL-Abfrageinformationen für jeden Tabellentyp in unserer Datenbank versorgt werden. Diese Informationen sind in den MySQL-Dateien gespeichert, die in der main.cf-Datei definiert sind. Beachten Sie, dass in den folgenden Dateien die letzte Zeile einen einzelnen Kommentar (vorgestellt durch #) mit der vollständigen Abfrage enthält. Neuere Versionen von Postfix können dies anstelle der anderen Anweisungen verwenden. Wenn Sie eine neuere Version verwenden, kommentieren Sie einfach alle anderen Zeilen aus und heben Sie die Kommentierung der Abfrageanweisung auf.

/etc/postfix/mysql_virtual_alias_maps.cf
user = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
/etc/postfix/mysql_virtual_domains_maps.cf
user = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
/etc/postfix/mysql_virtual_mailbox_maps.cf
user = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
/etc/postfix/mysql_virtual_transports.cf
user = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = domain
select_field = transport
where_field = domain
additional_conditions = and active = '1'
#query = SELECT transport FROM domain WHERE domain='%s' AND active = '1'
Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.