Send a link

Mailserver

__ Mailserver gehören im allgemein zu den lästigsten Pflichten eines sysadmins - Man ist einfach froh, wenn er läuft und man möglichst nichts daran herum schrauben muss.

Wie auch immer, wir werden hier einen Hosting-Tauglichen Mailserver mit postfix, dovecot, mysql, amavisd-new, clamav und spamassassin auf der Basis von CentOS/RHEL aufsetzen.

Als Sahnehäubchen werden wir zuletzt noch mailgraph installieren um eine Grafische Auswertung über die versendeten mails zu bekommen. __

Vorwort


Meine ersten versuche mit Linux Mailservern hatte ich so anno 2005 gemacht, damals noch mit qmail, welches aber heute hoffnungslos veraltet und auch sehr mühsam zu erweitern ist.

Also stiess ich wenig später zu exim, da dieser auf meinem damals eingesetzten Debian-Server sehr verbreitet war - Die Konfiguration war dann aber doch sehr unübersichtlich, ich traute mich praktisch nichts daran an zufassen. So lief dann der exim Server mal recht mal schlecht, ganz zufrieden war ich jedoch nicht.

Dann arbeitete ich über zwei Jahre unter anderem als Postmaster für eine postfix-Installation, erst unter gentoo mit courier, dann unter CentOS mit Dovecot - Und dies entsprach mir dann voll und ganz! -Endlich ein Mailserver, der übersichtlich aufgebaut ist und einem die noch immer mühsame Administration zumindest erleichtert.
Und mittlerweile ist postfix ja auch klar die Nr.1 unter den Mailservern, wohingegen exim immer mehr ein Schattendasein fristet.

Schließen
warning Achtung
Das Tutorial ist so aufgebaut, dass die Konfiguration erst läuft, wenn das ganze tutorial beendet ist!



Installation

Schließen
note Hinweis für CentOS 5
Leider hat das postfix-Paket im CentOS 5 Standard Repository die mysql-Unterstützung nicht einkompiliert, welche wir dringend brauchen. Wie dies auf einem CentOS 5 Mailserver aufgesetzt wird, habe ich in der kb:CentOS 5: postfix mit mysql Unterstützung beschrieben.

Die eigentliche Installation kann beginnen

Nach diesen kleinen Ausflug wollen wir nun alle benötigten Pakete installieren:
rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
yum install yum-priorities yum-security man expat rsync wget vixie-cron crontabs ntp slocate which sudo
yum install postfix dovecot amavisd-new spamassassin clamav mysql mysql-server telnet mailgraph


Nun legen wir den Benutzer für die virtuellen Mail-Konten (vmail) an:
adduser -r -m -g mail vmail


Merkt euch nun die UID vom user vmail, so wie die GID der Gruppe: mail.
Bei mir entspricht zum Beispiel vmail:mail immer 90:12 - Bitte beachten, dass ihr diese immer mit euren Werten ersetzt! (Tip: Ist unter /etc/passwd die UID 90, bzw. unter /etc/group die GID 12 noch frei, setze diese am besten auf diese Werte um Tippfehler beim copy&pasten zu vermeiden... ;-) )

Und natürlich musst du "deinedomain.tld" jeweils mit dem (Haupt-)Domainnamen deines Mailservers ersetzen.


Konfiguration

postfix


Bei den beiden postfix-Konfigurationsdateien "/etc/postfix/main.cf" und "/etc/postfix/master.cf" kann das meiste beim Standard belassen werden, folgende Zeilen müssen jedoch ersetzt/geändert werden:

/etc/postfix/main.cf

Die Direktiven home_mailbox und mailbox_command jeweils wie folgt setzen:
inet_interfaces = all
mynetworks = <IP adresse deines Mailservers, so wie dein lokales Netzwerk Eintragen>
home_mailbox = Maildir/
mailbox_transport = dovecot
mailbox_command = /usr/lib/dovecot/deliver


folgendes musst du nur ändern, wenn du den Hostnamen deines mailservers später ebenfalls als virtueller Mail-Account anlegen willst:
mydestination = localhost.$mydomain, localhost


Kleiner Exkurs- Der Parameter myhostname
Übrigens: Den Parameter myhostname musst du nicht unbedingt setzen; wird er nicht gesetzt nimmt postfix einfach den Hostnamen der auf dem System konfiguriert ist.
Korrekterweise müsste dieser derselbe sein auf welcher der reverse-Eintrag der IP des Servers sich auflöst.
D.h. wenn der reverse-Eintrag der IP deines Servers: "mail.deinedomain.tld" sagt, dein Server aber den Hostnamen: "mailserver01.deinedomain.de" hat, so müsstest du:
myhostname = mail.deinedomain.tld
eintragen.

Den reverse-Namen deiner IP findest du mit:
nslookup DEINE_IP
raus. - Hast du einen rootserver gemietet, so müsste sich dieser im Konfigurations-Panel des Providers ändern lassen.

postfix nimmt standardmässig den Wert aus $myhostname, um lokale Adressen zu vervollständigen.
D.h. wenn nun ein lokaler dienst eine mail an z.B. "root" sendet, so macht der mailserver dann: "root@mail.deinedomain.tld" draus. - Möchtest du lieber, dass daraus weiterhin "root@mailserver01.deinedomain.tld" wird (wie es am korrektesten wäre), dann möchtest du vielleicht die $myorigin Variable setzen:
myorigin = mailserver01.$mydomain

- Natürlich kannst du auch "myorigin = $mydomain" setzen, dann würde z.B. aus root: "root@deinedomain.tld".

Schließen
warning Auf jeden Fall
musst du darauf schauen, dass du diesen Hostnamen aus myorigin (mailserver01.deinedomain.tld, oder mail.deinedomain.tld, oder deinedomain.tld) auch im postfixadmin anlegst; denn sonst funktioniert das lokale mail-system deines Servers nicht mehr!


Abschlusskonfiguration

Und ans ende der Datei fügst du dann noch folgende Zeilen an:
# TLS parameters
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_key_file = /etc/ssl/private/mail.key
smtpd_tls_cert_file = /etc/ssl/certs/mail.crt
smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom


# VIRTUAL DOMAINS
#
# This configures the virtual domain names

# get password from dovecot
smtpd_sasl_local_domain =
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =  permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients = yes

# virtual mailbox settings
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
# change uid to postfix uid
virtual_minimum_uid = 90
virtual_uid_maps = static:90
# change gid to postfix gid
virtual_gid_maps = static:12
virtual_mailbox_base = /home/vmail

# Enable this to use proxymap instead of direct mysql connection
#proxy_read_maps = $local_recipient_maps $virtual_mailbox_domains $virtual_alias_maps $virtual_mailbox_maps $virtual_mailbox_limit_maps

virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_domains_maps.cf
virtual_alias_maps =
   mysql:/etc/postfix/mysql/virtual_alias_maps.cf,
   mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf,
   mysql:/etc/postfix/mysql/virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
   mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf,
   mysql:/etc/postfix/mysql/virtual_alias_domain_mailbox_maps.cf

# Additional for quota support
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes

# SPAM FILTERING
#
# Configures amavisd-new for spam/virus filtering
content_filter=smtp-amavis:[127.0.0.1]:10024

/etc/postfix/master.cf

Nun fügen wir unter: "Interfaces to non-Postfix software" folgende Zeilen dazu:
# Dovecot LDA
dovecot   unix  -       n       n      -       -       pipe
  flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d ${recipient}
#
# amavis
smtp-amavis unix -       -       n        -      2     smtp
     -o smtp_data_done_timeout=1200
     -o smtp_send_xforward_command=yes
     -o disable_dns_lookups=yes
     -o max_use=20
#
127.0.0.1:10025 inet n    -       n       -       -     smtpd
     -o content_filter=
     -o smtpd_delay_reject=no
     -o smtpd_client_restrictions=permit_mynetworks,reject
     -o smtpd_helo_restrictions=
     -o smtpd_sender_restrictions=
     -o smtpd_recipient_restrictions=permit_mynetworks,reject
     -o smtpd_data_restrictions=reject_unauth_pipelining
     -o smtpd_end_of_data_restrictions=
     -o smtpd_restriction_classes=
     -o mynetworks=127.0.0.0/8
     -o smtpd_error_sleep_time=0
     -o smtpd_soft_error_limit=1001
     -o smtpd_hard_error_limit=1000
     -o smtpd_client_connection_count_limit=0
     -o smtpd_client_connection_rate_limit=0
     -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
     -o local_header_rewrite_clients=
#



SSL-Zertifikate

Nun erstellen wir noch die benötigten SSL-Zertifikate:
mkdir -pv /etc/ssl/{certs,private}
touch smtpd.key
chmod -v 600 smtpd.key
openssl genrsa 1024 > smtpd.key
openssl req -new -key smtpd.key -x509 -days 3650 -out smtpd.crt
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem \
-out cacert.pem -days 3650
mv -v smtpd.key /etc/ssl/private/
mv -v smtpd.crt /etc/ssl/certs/
mv -v cakey.pem /etc/ssl/private/
mv -v cacert.pem /etc/ssl/certs/



Datenbank und postfixadmin

Nun werden wir die Datenbank für postfixadmin erstellen und dieses Konfigurieren.

Falls der mysql-server gerade neu installiert wurde, müssen wir noch ein Passwort setzen:
mysqladmin password DEIN_PASSWORT

Sollte es sich um einen bereits laufenden mysql-server halten, nimm einfach das passwort, dass du bereits konfiguriert hast. ;-)

Aufsetzen der Datenbank:
mysql -u root -p
mysql >
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'mailuserpassword'
CREATE DATABASE postfix;
GRANT ALL PRIVILEGES ON postfix.* TO postfix@localhost
IDENTIFIED BY 'mailuserpassword';

- Für "mailuserpassword" setzt du natürlich ein eigenes Passwort ein und "postfix" ist einfach der mysql-user mit dem auf die Datenbank postfix zugegriffen wird.

Nun installierst du postfixadmin und konfigurierst die Werte in: postfixadmin/config.inc.php so, dass sie auf dein setup passen. - Zu letzt noch: "$CONF'configured' = true;" setzen und du müsstest über postfixadmin bereits deine Mail- Domains, Konten, Aliase, usw. anlegen können.

Schließen
warning Wichtig
Lege auf jeden Fall den Hostnamen deines Server (z.B. mailserver01.deinedomain.tld) im postfixadmin an und setze im DNS-Server einen mx-record darauf. Auf diesen solltest du dann _mindestens_ die aliase aus der Datei /etc/aliases anlegen (aber mach am besten einen catch-all darauf); denn sonst funktioniert das lokale mail-system deines Servers nicht mehr!


Virtuelle E-Mail Konten vorbereiten

Als erstes erstellst du nun einen Ordner, wo zukünftig sämtliche mails deiner virtuellen Konten gespeichert werden, in diesem Tutorial ist das: "/home/vmail"

mkdir -pv /home/vmail
chown -vR vmail:mail /home/vmail
chmod - vR 775 /home/vmail


Nun müssen noch die mysql-Abfragen für postfix erstellt werden; dabei handelt es sich um einzelne files, die wir bereits in /etc/postfix/main.cf definiert hatten und eifach nur eine SQL-Abfrage enthalten.

Erst erstellen wir dafür ein Verzeichnis:
mkdir -pv /etc/postfix/mysql


Und erstellen dann darin die folgenden Dateien:
(Die Werte user, password und dbname müssen natürlich angepasst werden!)
/etc/postfix/mysql/virtual_alias_maps.cf:
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
#expansion_limit = 100


/etc/postfix/mysql/virtual_alias_domain_maps.cf:
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'


/etc/postfix/mysql/virtual_alias_domain_catchall_maps.cf:
# handles catch-all settings of target-domain
user = postfix
password = password
hosts = localhost
dbname = postfix
query  = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'


/etc/postfix/mysql/virtual_domains_maps.cf:
user = postfix
password = password
hosts = localhost
dbname = postfix
query          = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
#query          = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
#query           = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
#expansion_limit = 100


/etc/postfix/mysql/virtual_mailbox_maps.cf:
user = postfix
password = password
hosts = localhost
dbname = postfix
query           = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
#expansion_limit = 100


/etc/postfix/mysql/virtual_alias_domain_mailbox_maps.cf:
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'


/etc/postfix/mysql/virtual-mailbox-limit-maps.cf:
# For quota support
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'


Schließen
note Hinweis
Im Prinzip könnte man hier auch ein anderes Datenbank-Schema verwenden; es ist jedoch am einfachsten gleich das Schema zu verwenden, welches postfixadmin benutzt, da man ansonsten die Einträge mühsam von Hand in die Datenbank eintragen müsste.



mysql mit proxymap

Die obige Konfiguration öffnet nun für jedes Mail mehrere mysql-Verbindungen, was irgendwann zur Überlastung des mysql-Servers führen könnte.

Deshalb kann man dafür proxymap benutzen. Proxymap bündelt mehrere mysql-Abfragen und führt diese Kompakt in einer Verbindung durch. So können enorm Ressourcen gespart werden.

Folgende Änderungen sind dazu nötig:

Das Verzeichnis: /etc/postfix/mysql und alle Dateien darin müssen für den user Postfix lesbar sein:
chown -vR postfix:postfix /etc/postfix/mysql
chmod -v 500 /etc/postfix/mysql
chmod -vR 400 /etc/postfix/mysql/*


Nun müssen in /etc/postfix/main.cf alle maps die wir mit mysql-Abfragen, im Parameter "proxy_read_maps" definiert werden; zudem braucht es noch $local_recipient_maps darin.
Diesen Parameter fügen wir am besten vor die erste "mysql:"-Abfrage ein:
proxy_read_maps = $local_recipient_maps $virtual_mailbox_domains $virtual_alias_maps $virtual_mailbox_maps $virtual_mailbox_limit_maps


Nun muss nur noch jedes:
mysql:
mit:
proxy:mysql:
ersetzt werden; d.H. einfach immer ein "proxy:" davor schreiben. Beispiel:
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/virtual_domains_maps.cf


Danach kann die funktionalität mit:
postmap -q "VIRTUELLE_DOMAIN.TLD" proxy:mysql:/etc/postfix/mysql/virtual_domains_maps.cf
überprüft werden.

Dovecot

Nun gehts ans Einrichten von Dovecot, welches nun schnell geht.

Es müssen nur noch die folgende drei files geändert/erstellt werden:

/etc/dovecot/dovecot.conf
base_dir = /var/run/dovecot/
protocols = imap imaps pop3 pop3s
listen = [::]
first_valid_uid = 90
mail_location = maildir:/home/vmail/%d/%n/Maildir
login_process_size = 64
auth_verbose = yes
disable_plaintext_auth = no
verbose_proctitle = yes
maildir_copy_with_hardlinks=yes
maildir_copy_preserve_filename=yes
ssl_cert_file = /etc/ssl/certs/smtpd.crt
ssl_key_file =  /etc/ssl/private/smtpd.key
auth default {
  mechanisms = plain login
  socket listen {
    master {
      path = /var/run/dovecot/auth-master
      mode = 0660
      user = vmail
      group = mail
    }
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }
  userdb sql {
    args = /etc/dovecot/sql.conf
  }
  passdb sql {
    args = /etc/dovecot/sql.conf
  }
  user = root
  count = 1
}
namespace private {
  separator = .
  prefix = INBOX.
  inbox = yes
}
protocol lda {
  postmaster_address = postmaster@deinedomain.tld
  mail_plugins = quota
  log_path =
  info_log_path =
}
protocol imap {
  mail_plugins = quota imap_quota
}
protocol pop3 {
  pop3_lock_session=yes
  pop3_uidl_format=%v-%u
  mail_plugins=quota
}
dict {
  quotadict = mysql:/etc/dovecot/dict-quota.conf
}
plugin {
  quota = dict:storage=0:messages=0 proxy::quotadict
}



/etc/dovecot/sql.conf
driver = mysql
connect = host=localhost port=3306 user=vmail password=DEIN_DBUSER_PASSWORT dbname=postfix
default_pass_scheme = MD5-CRYPT
password_query = SELECT username as user, password, concat('/home/vmail/', maildir) as userdb_home, concat('maildir:/home/vmail/', maildir) as userdb_mail, 90 as userdb_uid, 12 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/vmail/', maildir) as home, concat('maildir:/home/vmail/',maildir) as mail, 90 AS uid, 12 AS gid FROM mailbox WHERE username = '%u' AND active='1'


/etc/dovecot/dict-quota.conf
connect = host=localhost port=3306 user=vmail password=DEIN_DBUSER_PASSWORT dbname=postfix
default_pass_scheme = MD5-CRYPT
table = quota
select_field = current
where_field = path
username_field = username



Das finale

Nun nur noch alles aktivieren, starten und testen:
chkconfig dovecot on
chkconfig postfix on
chkconfig amavisd on
chkconfig clamd.amavisd on
chkconfig spamassassin on
chkconfig mailgraph on
chkconfig mysql-server on
chkconfig httpd on

/etc/init.d/postfix start
/etc/init.d/dovecot start
/etc/init.d/amavisd start
/etc/init.d/clamd.amavisd start
/etc/init.d/spamassassin start
/etc/init.d/mailgraph start
/etc/init.d/mysqld start
/etc/init.d/httpd start



Troubleshooting

Falls noch nicht alles so funktioniert, wie es soll, liefert dir das maillog sehr hilfreiche Informationen:
tail -f /var/log/maillog


Auch solltest du sicherstellen, dass du dich lokal per telnet mit folgenden ports Verbinden kannst: 25, 110, 143, 993, 995, 783, 10024, 10025

Und diese Ports musst du per Telnet auch von aussen aus erreichen können: 25, 110, 143, 993, 995

Link Beschreibung
qmailrocks.org (external link) Die Seite bietet umfangreiche QMail-Tutorials zu fast allen Linux Distributionen
Setting up a Virtual Mail System using Postfix, MySQL, SpamAssassin, (ClamAV,) Amavis, Sieve, Roundc (external link) Zwar nicht ganz vollständiges, aber doch sehr nützliches tutorial
Dovecot-Wiki (external link) Dovecot: Endlich eine Dokumentation, die den Namen auch Wert ist!
postfix-mysql unter CentOS (external link) Ein notwendiger workarround um postfix mit mysql auf CentOS zum laufen zu kriegen - Und was passieren kann wenn man einen Tippfehler macht... ;-)
Postfix SMTP Authentication and Dovecot SASL (external link) Perfekt in Verbindung mit dem Tutorial: "Setting up a Virtual Mail System using Postfix, MySQL, SpamAssassin, (ClamAV,) Amavis, Sieve, Roundcube, Dovecot and Mailman"
mailgraph (external link) Nettes kleines CGI-Script um aus den postfix logfiles übersichtliche Grafiken zu erstellen

File Beschreibung
postfixadmin (external link) Ein schönes Frontend um die virtuellen Mailkonten zu verwalten


Neuen Kommentar posten

Anti-Bot Prüf-Code: Zufälliges Bild
Neuen Kommentar posten
Schließen
note Hinweis
Your comment will have to be approved by the moderator before it is displayed.