Ubuntu (6.06) Mailserver mit Postfix, Dovecot und Getmail

[UPDATE]Eine neue Version dieses Tutorials für Ubuntu Hardy Heron (8.04) findet sich hier[/UPDATE]

Und weiter gehts mit dem Linux-Server-Tutorial. Heute: "Der feuchte Traum" eines jeden Linux-Newbies...Der eigene Mailserver.

Realisieren werden wir das ganze mit Hilfe von Postfix, Dovecot und getmail.

Postfix ist in diesem Fall der  sogenannte MTA, der die Mails nach draußen schickt, aber auch intern die Arbeit des Verteilers übernimmt. Dovecot werden wir verwenden um den Clients, wie Outlook oder Thunderbird, den Zugang per IMAP oder POP3 zu ermöglichen. Da wir unseren Server ja zu Hause stehen haben, und man dort nur selten unter einer festen IP-Adresse erreichbar ist, werden Mails zunächst von unserem bisherigen Mail-Server bei GMX, Web.de, Gmail usw. empfangen und anschließend vom Server zu Hause abgeholt. Dafür zeichnet sich getmail zuständig.

Bevor es mit Installieren und Konfigurieren los geht, müssen noch ein paar Dinge geklärt werden:

1. Die meisten Freemail-Anbieter erlauben es nicht E-Mails von beliebigen Adressen weiterzuleiten. Das heißt ich kann über GMX keine Mails verschicken, die den Absender zeroathome@freemailanbieter.de tragen. Da Arcor solche Beschränkungen zur Zeit nicht hat, bietet es sich an die Arcor-Freemail-Mailserver als Relay zu verwenden. Genaueres dazu gibt es hier. In dieser Anleitung wird diese Methode ebenfalls verwendet.

2. Ein Mailserver ist kein Spielzeug. Falsch konfiguriert kann er schnell als Spam-Schleuder enden. Also: Nachdenken und mit gesundem Menschenverstand handeln. Will sagen: Nicht gleich draufloshacken, sondern erst lesen und verstehen. Richtet diesen Mailserver erst einmal testweise ein und spielt ein wenig damit herum, bevor ihr ihn produktiv einsetzt.

Postfix

sudo apt-get install postfix

Während der Installation werden einige Einstellungen abgefragt:

Allgemeine Art der Konfiguration Internet mit Smarthost
System-Email-Name server.local.home
SMTP-Relay-Host mail.arcor.de
Empfänger von Root-E-Mails Euer admin-Benutzer
Empfang für welche Domains server.local.home, localhost.localdomain, localhost
Synchrone Aktualisierung... Nein
Lokale Netze 127.0.0.0/8
Maximale Postfachgröße nach Belieben, '0' für kein Limit
Zeichen für lokale Adress... +
Internet Protokolle alle

Einrichten der Anmeldung am SMTP-Server per SASL

Die Konfiguration von Postfix erledigen wir nicht direkt in der Datei '/etc/postfix/main.cf', sondern benutzen dazu das Kommando 'postconf', das erspart das herumsuchen in der Datei, da 'postconf' die Optionen selbsttätig in die Datei einträgt bzw. ändert oder löscht. Dazu ist es allerdings sinnvoll als Benutzer 'root' zu arbeiten, was wir mit dem Befehl
sudo -s erledigen. Danach sollte die Befehlszeile so aussehen: root@server:~#

postconf -e 'smtpd_sasl_local_domain ='
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'smtpd_sasl_security_options = noanonymous'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'
postconf -e 'inet_interfaces = all'
echo 'pwcheck_method: saslauthd' >> /etc/postfix/sasl/smtpd.conf
echo 'mech_list: plain login' >> /etc/postfix/sasl/smtpd.conf

Wer das nicht alles abtippen möchte kann sich auch gerne die Zeilen in eine Datei kopieren und als Skript verwenden 😉
Um uns verschlüsselt am SMTP-Server anmelden zu können brauchen wir noch ein Zertifikat:
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.pem
Hier ist im Grunde genommen wieder fast alles egal, bis auf die Angabe 'Common Name', hier solltet ihr euren lokalen Hostnamen angeben, den ihr auch bei der Postfix-Konfiguration verwendet habt!
Anschließend noch unberechtigten die Leserechte am Key-File nehmen: chmod o= /etc/ssl/private/postfix.pem

Nun noch mal mit 'postconf' an die Arbeit:

postconf -e 'smtpd_tls_auth_only = yes'
postconf -e 'smtp_use_tls = yes'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtp_tls_note_starttls_offer = yes'
postconf -e 'smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem'
postconf -e 'smtpd_tls_key_file=/etc/ssl/private/postfix.pem'
postconf -e 'smtpd_tls_loglevel = 1'
postconf -e 'smtpd_tls_received_header = yes'
postconf -e 'smtpd_tls_session_cache_timeout = 3600s'
postconf -e 'tls_random_source = dev:/dev/urandom'
postconf -e 'myhostname = server.local.home'

Konfiguration beendet, nur noch Postfix testen und dann neu starten:
/etc/init.d/postfix check, falls hier keine Fehler auftreten unten weiter, falls doch müsst ihr wohl nochmal ran!
/etc/init.d/postfix force-reload
Nun noch ein exit um aus dem root-Modus wieder rauszukommen

Allerdings wars das noch nicht ganz, darum ein wenig Nacharbeit rund um SASL:
Erstmal installiern...
sudo apt-get install libsasl2 sasl2-bin
Da Postfix in einem sogenannten chroot läuft, muss SASL ein wenig umkonfiguriert werden:
mkdir -p /var/spool/postfix/var/run/saslauthd
rm -rf /var/run/saslauthd

Fast fertig, nur noch die Konfigurationsdatei ein wenig bearbeiten, sollte danach so aussehen:
# This needs to be uncommented before saslauthd will be run
# automatically
START=yes

PWDIR="/var/spool/postfix/var/run/saslauthd"
PARAMS="-m ${PWDIR}"
PIDFILE="${PWDIR}/saslauthd.pid"

# You must specify the authentication mechanisms you wish to use.
# This defaults to "pam" for PAM support, but may also include
# "shadow" or "sasldb", like this:
# MECHANISMS="pam shadow"

MECHANISMS="pam"
Damit das ganze funktioniert fehlt noch eine Befehl:
dpkg-statoverride --force --update --add root sasl 755 /var/spool/postfix/var/run/saslauthd
dann können wir den ersten Test starten:

sudo /etc/init.d/saslauthd start
telnet localhost 25
Darauf sollte der Server so antworten:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 server.local.home ESMTP Postfix (Ubuntu)

Kurz "Hallo" sagen:

ehlo server.local.home
Daraufhin redet der Server wieder ein wenig, in der Antwort sollte diese Zeile zu finden sein:
250-STARTTLS
Wenn das der Fall ist: Glückwunsch, you have a runnning Postfix with Verschlüsselung!

Aber ein Problem wäre dann doch noch...wenn ich über meinen fix und fertig konfigurierten Postfix eine E-Mail verschicken möchte, muss die ja auch noch irgendwie nach draussen ins Internet, hier kommt dann der angesprochene Arcor-Account zum Spiel hinzu. Um das Versenden einzurichten müssen wir wohl nochmal ran:


postconf -e 'smtp_sasl_auth_enable = yes'
postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth'
postconf -e 'smtp_sasl_security_options = noanonymous'
postconf -e 'relayhost = mail.arcor.de'

Dann die Datei anlegen mit dem Benutzernamen und dem Passwort:
sudo nano /etc/postfix/smtp_auth
Da muss dann folgende Zeile drinstehen:
mail.arcor.de benutzer:passwort
Nachdem die Datei gespeichert wurde fehlt noch ein
postmap /etc/postfix/smtp_auth
dann sollte es laufen.

Dovecot

Installation:

sudo apt-get install dovecot-imapd dovecot-pop3d

Und natürlich bleibt auch hier die Konfiguration nicht aus:
Im oberen Teil der Datei '/etc/dovecot/doveot.conf' können die verschiedenen Zugangsarten festgelegt werden. Es besteht die Auswahl zwischen vier Möglichkeiten: pop3, pop3s, imap, imaps; wobei die jeweiligen Varianten mit dem 's' am Schluß verschlüsselt sind, und genau die würde ich hier auch verwenden. Ob pop3s, oder imaps, oder beide bleibt dem jeweiligen Geschmack überlassen.
protocols = pop3s imaps sollte die Zeile lauten für sicheren POP3 und IMAP-Zugang.
Um Problemen mit Outlook beim POP3-Empfang aus dem Weg zu gehen suchen wir die Zeile (ich empfehle die Such-Funktion eures Editors):
#pop3_uidl_format =
und ändern diese zu:
pop3_uidl_format = %08Xu%08Xv

Nun gilt es wieder einmal eine Entscheidung zu treffen. Und zwar ob die E-Mails auf der Platte in ein Verzeichnis, oder alle in eine Datei gelegt werden, also Maildir oder mbox-Format. Hier sei eine deutliche Empfehlung zum Maildir Format gegeben, finde ich irgendwie übersichtlicher! Das sollten wir auch Dovecot mitteilen und suchen die Zeile
#default_mail_env =
und ändern diese in:
default_mail_env = maildir:~/mail, damit landen die E-Mails im Verzeichnis 'mail' in den jeweiligen Benutzerverzeichnissen.

Die nächsten Zeilen sind für die Verschlüsselung nötig, wir benutzen hier der Einfachheit halber wieder das Zertifikat, das wir für den Postfix generiert haben:
ssl_cert_file = /etc/ssl/certs/postfix.pem
ssl_key_file = /etc/ssl/private/postfix.pem
ssl_disable = no
disable_plaintext_auth = yes

Was jetzt noch fehlt, ist das die Post die reinkommt auch auf die Benutzer verteilt wird, um den Aufwand gering zu halten, überlassen wir das auch Dovecot. Dazu müssen wir zunächst die Zugriffsrechte auf die Konfiguration anpassen:
chmod 644 /etc/dovecot/dovecot.conf

Anschließend suchen wir in der Datei den folgenden Abschnitt:

protocol lda {
# If you wish to use plugins you need to specify plugin directory
# For example quota enforcing is implemented by plugin
#module_dir = /usr/local/lib/dovecot/lda

# Address from LDA should send MDNs like out of quota
postmaster_address = admin@server.local.home

# If there is no user-specific Sieve-script, global Sieve script is
# executed if set.
#global_script_path =

# UNIX socket path to master authentication server to find users.
#auth_socket_path = /var/run/dovecot-auth-master
}

Der Ausschnitt hier zeigt wie es aussehen muss, damit es funktioniert. Die 'postmaster_address' ist die einzige Option die aktiviert werden muss, und sollte auf euren Admin-Benutzer zeigen.

Nun müssen wir nur noch Postfix sagen das es die ankommenden Mails an den LDA von Docecot weiterreicht:
sudo postconf -e 'mailbox_command = /usr/lib/dovecot/deliver'

Damit ist die Konfiguration von Dovecot abgeschlossen und es können sowohl lokal (benutzer@server.local.home), als auch nach draußen (zero@zeroathome.de) E-Mails versendet werden. Aber wir ihr vielleicht schon merkt, fehlt natürlich noch etwas: Wie kommen die Mails von außen auf den Server?
Antwort: Mit Getmail!

Getmail

Installation:
sudo apt-get install getmail4

Konfiguration:
Es muss für jeden Benutzer im Home-Verzeichnis ein neuer Ordner erstellt werden, der '.getmail' heißt, also versteckt ist. In diesem wird dann die eigentliche Konfigurationsdatei 'getmailrc'. Theoretisch geht es auch anders, aber das machen wir dann falls Bedarf besteht nochmal separat.

Um die Post per POP3 abzuholen, sollten die Dateien wiefolgt aufgebaut sein:

[retriever]
type = SimplePOP3Retriever (falls das nicht funktioniert: BrokenUIDLPOP3Retriever)
server = pop.webmailer.de
username = username@webmailer.de
password = geheim


[destination]
type = Maildir
path = /home/benutzer/mail/
user = benutzer


[options]
delete = true
message_log = /home/benutzer/.getmail/log

Das sorgt dafür das die Mails vom Provider abgeholt, in die entsprechenden Benutzer-Verzeichnisse verschoben, und anschließend beim Provider gelöscht werden. Der ganze Vorgang wird pro Benutzer in die Datei '/home/benutzer/.getmail/log' gelogt, falls es also Probleme gibt lohnt ein Blick hierhinein.
Da die Datei das Passwort des jeweiligen Benutzers enthält sollte auch nur dieser Zugriff auf die Datei haben:

sudo chown benutzer:benutzer /home/benutzer/.getmail/getmailrc
sudo chmod 600 /home/benutzer/.getmail/getmailrc

Um jetzt die Post von allen Benutzern abzuholen erstellen wir ein kleines Skript und tragen dieses in die crontab ein:

Skript getthemail.sh

#!/bin/bash
for getfile in $( find /home -name getmailrc -print )
do
#echo $getfile
/usr/bin/getmail --rcfile $getfile
done
exit 0

Dieses machen wir ausführbar und kopieren wir nach '/usr/local/bin':
sudo chmod +x getthemail.sh
sudo cp
sudo crontab -e
*/2 * * * * /usr/local/bin/getthemail.sh

Das sorgt dafür das E-Mails alle 2 Minuten abgeholt und auf die Benutzer verteilt werden.

Fertig

Soo, das sollte es gewesen sein. Falls irgendwo Probleme auftreten, schaut euch zuerst die Log-Dateien an (/var/log/mail.*) und schaut ob ihr eventuell irgendwo einen Fehler in der Konfiguration gemacht habt.

Zu guter Letzt muss ich noch sagen, dass ich diese Konfiguration zwar getestet und auch bei mir im Einsatz habe, aber keine Garantie geben kann, dass sich nicht doch irgendwo Fehler eingeschlichen haben. Falls irgendetwas unklar oder schlicht falsch sein sollte, wäre ich über eine kurze Benachrichtigung sehr dankbar!

Teil 1:

Installation des Grundsystems mit grafischer Oberfläche - Xubuntu 6.06

Teil 2:

Grundeinrichtung des Systems - Netzwerk, Updates, Midnight Commander, SSH-Server

Teil 3:

Samba - Dateiserver unter Linux

Teil 4:

LAMP - Linux-Apach-MySQL-PHP

Teil 5:

Web-Anwendungen für den Server - Jinzora und Torrentflux-b4rt

Teil 6:

FTP und WebDAV für euren Ubuntu-Server

Teil 7:

Mailserver mit Postfix, Dovecot und Getmail

Bild: flickr

21 Gedanken zu „Ubuntu (6.06) Mailserver mit Postfix, Dovecot und Getmail

  1. Dr. Azrael Tod

    schon sehr schön..
    auch wenn ich zugeben muss dass ich selber nur die billig-version ohne eigenen Server und über google-apps für g33ky.de genommen hab, irgendwie war mir der Mangel an Stabilität und an einem Mietserver (mit meinem zuhause wollte ich das dann doch nicht anstellen, dazu schraub ich zu oft dran rum) doch ein Dorn im Auge.

  2. zero

    Naja, im Grunde ist das Setup ja so gestaltet das der Server selbst gar keine Mails annimmt, sondern nur von diversen Servern einsammelt und auch über ein Relay sendet. Also eigentlich dazu gedacht zu Hause zu stehen. Privat nutze ich auch nur Gmail zum emailern, auf dieser Domain sind fast nur Weiterleitungen eingerichtet und mit Gmail geht das ja recht komfortabel. Der Server ist hauptsächlich als Backup gedacht, falls bei Google mal die Lichter ausgehen 😉

  3. Oliver

    Hi, echt cooles Tutorial, versuche das gerade unter Hardy nachzubilden, aber ich hänge immer beim Postfix und dem versenden. Mein Thunderbird fragt immer nach einem Passwort und in den Logs steht das die SASL Authentication nicht funktioniert, aber was habe ich falsch gemacht?

    Jul 13 13:19:35 server-ok postfix/smtpd[5462]: warning: SASL authentication fai$
    Jul 13 13:19:35 server-ok postfix/smtpd[5462]: warning: SASL authentication fai$
    Jul 13 13:19:35 server-ok postfix/smtpd[5462]: warning: unknown[192.168.77.10]:$

  4. zero

    mmh, ich hab leider im moment zu wenig zeit um das ganze mal unter hardy zu testen, ist aber fürs nächste wochenende fest eingeplant und kommt dann auch in den neuen Ubuntu 8.04 Server Guide

  5. Oliver

    Hoffnungsvoll habe ich heute auf Deiner Seite nach dem Mailserver Guide für Hardy gesucht, hast es aber wohl noch nicht geschafft. 🙂

  6. zero

    ja, sorry, wenn man schonmal Versprechungen macht…sagen wir mal halb hab ichs geschafft, dann hat mich der Alltag eingeholt 😉
    Ich versuchs dann nochmal für nächstes Wochende…we’ll see…

  7. Cass

    Hallo,

    habe alles nach Anleitung zum laufen bekommen, habe aber trotzdem ein problem mit dem Abruf von den verschiedenen Usern.
    Auf dem Server gibt es 4 User
    1 User der bei der Installation eingerichtet wurde (cass)
    3 User, die ich über Gnome als ‚unprivileged‘ User (user1-3) eingerichtet habe.

    E-Mails werden korrekt bei /home/cass/Maildir abgelegt.

    Probleme habe ich beim Abruf der Mails für die anderen user1-3 über gethemail.sh .
    Ich bekomme die Fehlermeldung:

    Copyright (C) 1998-2007 Charles Cazabon. Licensed under the GNU GPL version 2.
    SimpleIMAPRetriever:user1@domain.de@imap.provider.de:143:
    getmailrc: error resolving name ((-2, ‚Name or service not known‘))
    0 messages (0 bytes) retrieved, 0 skipped
    root@Server:/usr/local/bin# getmailrc
    bash: getmailrc: command not found

    Bei der Namesauflösung ist es so, dass die e-mailaddi des users zugleich der Anmeldenamen beim Provider ist.
    Kann mir jemand weiterhelfen?

  8. Cass

    Problem gelöst!!!

    Es war ein Schreibfehler in der Datei getmailrc.

    Tx

  9. Cass

    Hallo nochmal,

    jetzt habe ich als Anfänger folgendes Problem:

    Sofern ich über die Konsole: sudo getthemail.sh eingeben, funktioniert die Auslieferung der Mails an die verschiedenen User.

    crontab wird auch alle 2 minuten von root ausgeführt, aber es erfolgt keine Auslieferung der Mails.

    Kann mir jdn helfen?

  10. zero

    @ Cass:
    Schau doch mal bitte in die Logfiles (unter /home/benutzer/logs/)und poste die evtl mal hier wenn du daraus nicht schlau wirst!

  11. Cassandrea

    Habe kein Verzeichnis /home/benutzer/logs (Ubuntu Server 08-04).
    Mir ist unter Gnome aufgefallen, dass mit jedem zugriff auf getthemail.sh postfix als root versucht an den User1 eine Mail zu schicken und sie dann wieder löscht.
    *rätsel‘ ich habe entweder postfix oder dovecot falsch konfiguriert. Als Myhoste habe ich einfach angegeben den Servernamen. Bsp Zeus 🙂 Als System-E-Mailname einfach nur Zeus.local.host.
    Ich bin mir ziemlich sicher, dass ich einfach einen Anfängerfehler gemacht habe.

  12. zero

    Sorry, die Logs liegen (wenn getmail nach diesem Tutorial eingerichtet wurde) unter /home/benutzer/.getmail/log

  13. Cassandrea

    Sorry, war im Urlaub…

    CronDämon schreibt mir im 2 Min Takt folgende Mail an den Postmaster:
    find: /home/benutzerX/.gvfs: Permission denied
    Error: Default config/data dir „/root/.getmail/“ does not exist – create or specify alternate directory with –getmaildir option
    Error: Default config/data dir „/root/.getmail/“ does not exist – create or specify alternate directory with –getmaildir option
    Error: Default config/data dir „/root/.getmail/“ does not exist – create or specify alternate directory with –getmaildir option
    Error: Default config/data dir „/root/.getmail/“ does not exist – create or specify alternate directory with –getmaildir option

    Ich habe insgesamt 4 Benutzer angelegt, und auch die Datei .getmail mit getmailrc.
    Da 4 mal eine Errormeldung kommt, vermute ich, dass es die 4 Zugriffe auf die Benutzerdateien sind.
    BenutzerX hat Rootrechte.
    Wenn ich getthemail.sh als root ausführe, funkltioniert alles.
    Die root crontab -e müßte auch funktionieren.
    Kann es was mit den Zugriffsrechten zu tun haben?

  14. Cassandrea

    # m h dom mon dow command
    */2 * * * * /usr/local/bin/getthemail.sh

    Letzte Zeile ist eine Leerzeile

  15. Cassandrea

    Es existiert auch keine andere crontab als die von root

    sudo -s
    ls -ld /usr/local/bin/getthemail.sh
    -rwxr-xr-x 1 root root 132 2008-08-26 10:35 getthemail.sh

    Das Verrückte: Die Crontababfrage lief schon einmal, aber nur mit einem Benutzer.
    Denke beinahe, dass ich den Server neu aufsetzen muss, weil ich irgendwas „verbogen“ habe 🙁
    Wäre zwar nicht so schlimm, da sonst noch nichts weiter darauf läuft, aber …

  16. Cassandrea

    Und hier ein Auszug aus dem Systembetrachter /var/log/auth.log, der sich ebenfalls ständig wiederholt….

    Sep 13 13:04:01 Server CRON[10531]: pam_unix(cron:session): session closed for user root
    Sep 13 13:04:53 Server dovecot-auth: pam_smbpass(dovecot:auth): unrecognized option [missingok]
    Sep 13 13:04:53 Server last message repeated 4 times

  17. Cassandrea

    So – hab den Server neu aufgesetzt und die Befehlsausführung unter Crontab läuft – vorerst mit 1 Benutzer und keinem Skript. Crontab läuft erst einmal nur mit Direktaufruf von getmail und nicht als root sondern unter dem User-Account des Admin.
    Insgesamt habe ich als Neuling ganz schön viel gelernt. So hat das Fehlersuchen auch seine guten Seiten. 😉

  18. chris

    Sie einzige Seite die auf anhieb funzt!!!!! Klasse gemacht .. weiter so!

Kommentare sind geschlossen.