Mailserver mit Ubuntu 14.04.1 LTS

Vor geraumer Zeit hatte ich bereits mit Fetchmail und Postfix herumgespielt, um „irgendwann einmal“ einen Mailserver aufzusetzen. Da ein paar Stunden Zeit vorhanden waren, wollte ich das Thema wieder aufgreifen und einen Server aufsetzen, der

  1. E-Mails regelmäßig vom (Web-/Mail-)Hoster abholt,
  2. Eingehende E-Mails auf Viren und SPAM untersucht (optional),
  3. E-Mails im Intranet über IMAP mehreren Benutzern zur Verfügung stellt und
  4. E-Mails-Backups auf der Server-Seite ermöglicht

Sprich Dinge, die man prima in einer mehrköpfigen Familie oder einem kleinen Unternehmen gut gebrauchen kann.

Frei nach dem Motto „das kann doch alles nicht so schwer sein“ bin ich ganz unbedarft und mit Google bewaffnet an die Sache herangegangen und hier locker aufgeschrieben. Am Ende dieser Seite findet man eine Liste mit Links zu Seiten, die mir beim Aufsetzen des Mailservers behilflich waren.

Disclaimer

Ich bin kein Experte für Mailserver! Im Zweifel habe ich unrecht und die Manpages und FAQs von fetchmail, postfix und dovecot wissen es sicherlich besser! Wer sich aufgrund dieses Tutorials E-Mails unwiederbringlich löscht, der ist selbst schuld! Bei mir funktioniert es. Und das bedeutet nicht, dass es mit einer anderen Konstellation nicht in die Hose geht! Zu Test- und Installationszwecken niemals nie mit wichtigen/richtigen Accounts und E-Mails herumprobieren!

Wer mitgezählt hat: das waren fünf Ausrufezeichen, die da nicht umsonst stehen. 😉

Begriffe

Damit ab nun nicht durcheinander gerät, werde ich versuchen die folgenden Begriffe immer einheitlich zu verwenden:

  • Benutzer: Der Mensch, der vor seinem E-Mail-Programm sitzt
  • Mailserver: Die Linux-Kiste, auf dem wir das hier alles installieren
  • User: Der Linux-Account des Benutzers auf unserem Mailserver
  • Mailhoster: Das ist dort, wo wir mit unserem Mailserver die E-Mails einsammeln (GMX, 1&1, Strato, …)

Beispiel-Installation

Bei der folgenden Installation werden wir E-Mails für eine nicht-existente Familie Meier abrufen, die über einen Webhoster die Domain „familie-meier.test“ reserviert hat. Die Familie besteht aus Vater Horst, Mutter Ursula, Sohn Kevin und Tochter Chantal. Für jedes Familienmitglied ist beim Webhoster eine eigene Mailbox vorname@familie-meier.test angelegt. Zusätzlich gibt es drei Sammel-Mailboxen: Mails an eltern@familie-meiser.test sollen an die Eltern verteilt werden, Mails an kinder@familie-meier.test an die Kinder und Mails an alle@familie-meier.test an alle vier. Abschließend legen wir noch eine administratives Postfach „postmann“ an, kann ja nie schaden. Beim Webhoster sind demnach insgesamt acht Mailboxen* eingerichtet: horst, ursula, kevin, chantal, eltern, kinder, alle und postmann.

* Es gibt bei manchen Webhostern Möglichkeiten, E-Mails schon dort mit passenden Weiterleitungsregeln in die einzelnen Mailboxen zu verteilen, aber wir tun mal so, als ob das nicht möglich wäre und wir die Verteilung auf unserem Mailserver durchführen müssen.

Linux installieren

Zu Beginn installiere man ein frisches, möglichst schlankes Linux (ohne Desktop/X11) auf unserem Mailserver, den wir „kiste“ nennen. Zum Üben empfehle ich eine Installation in einer virtuellen Maschine (VirtualBox, XenServer, VMWare, …). Ich habe mich für ein Ubuntu Server 14.04.1 LTS entschieden, ein Debian 7.x Minimal oder ein anderes Linux wird genauso gut funktionieren.

Bei der Paketauswahl während der Installation von Ubuntu/Debian habe ich alles (auch Verwendung als Mailserver) deaktiviert und nur den OpenSSH-Server zwecks Fernadministration über SSH aktiviert. Alles weitere kann anschließend per apt-get nachinstalliert werden, sofern es benötigt wird.

Nach dem ersten Booten begrüßt uns Ubuntu mit einem Prompt. Wir melden uns mit unserem Standard-Benutzer an und bringen das System erst einmal auf den neuesten Stand:

sudo apt-get update
sudo apt-get upgrade

Nun sollten wir ein aktuelles System haben, das bootet und zu dem man sich mittels ssh verbinden kann.

Bevor es weitergeht, noch ein kleiner Tipp: Wen das dauernde sudo-Getippe unter Ubuntu stört, hole sich mit „sudo bash“ eine root-Shell und verzichte anschließend auf das sudo.

User anlegen

Unser Mailserver wird dovecot als IMAP-Server verwenden, wobei dovecot E-Mails im Maildir-Format ablegen wird. „Maildir“ bedeutet, dass E-Mails im Filesystem gespeichert werden; IMAP-Ordner sind auch im Filesystem Ordner, für jede E-Mail wird eine Datei erzeugt. Die Dateistruktur wird unterhalb des Homeverzeichnisses des Users abgelegt. Somit müssen wir für jeden E-Mail-Benutzer auch einen entsprechenden Linux-User anlegen. Unter Ubuntu und Debian macht man das am besten mittels adduser:

sudo adduser USERNAME

Beim folgenden Frage-Antwortspiel geben man zunächst ein Passwort für den Benutzer ein (das auch später standardmäßig als IMAP-Passwort dienen wird) sowie den kompletten Namen („Full Name“), welcher in E-Mails als Absendername verwendet wird.

chef@kiste:~$ sudo adduser horst
[sudo] password for chef:
Lege Benutzer »horst« an ...
Lege neue Gruppe »horst« (1001) an ...
Lege neuen Benutzer »horst« (1001) mit Gruppe »horst« an ...
Erstelle Home-Verzeichnis »/home/horst« ...
Kopiere Dateien aus »/etc/skel« ...
Geben Sie ein neues UNIX-Passwort ein:
Geben Sie das neue UNIX-Passwort erneut ein:
passwd: password updated successfully
Changing the user information for horst
Enter the new value, or press ENTER for the default
        Full Name []: Horst Meier
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Sind diese Informationen korrekt? [J/n]

Das Prozedere wiederholen wir nun analog noch für Mutter, Sohn und Tochter:

sudo adduser ursula
sudo adduser kevin
sudo adduser chantal

Dazu legen wir noch einen User an, an den später administrative E-Mails gehen sollen, die ebenfalls mittels IMAP-Zugriff abgerufen werden können. Nennen wir ihn der Einfachheit halber postmann (mit zwei n):

sudo adduser postmann

Damit haben wir nun folgende User angelegt:

chef@kiste:~$ ls /home
chantal chef horst kevin postmann ursula

Pakete installieren

Wir installieren nun die Pakete, die wir für unseren Mailserver benötigen. Fetchmail wird die E-Mails vom Mailhoster abholen, Dovecot wird die E-Mails speichern und per IMAP an die E-Mail-Programme der Benutzer (Thunderbird, Outlook, …) ausliefern, Postfix wird eingehende E-Mails zwischen Fetchmail und Dovecot sowie ausgehende E-Mails zwischen Dovecot und Mailhoster transportieren. Später werden in die Transportkette noch Viren- und SPAM-Filter zwischengeschaltet werden, sobald ich weiß, wie das funktioniert.

Folgende Pakete werden wir auf jeden Fall benötigen: ntp um die Uhrzeit zu korrigieren, die mailutils um testweise Mails von der Kommandozeile aus zu verschicken:

sudo apt-get install ntp ntp-doc mailutils mailutils-doc mailutils-common

Nun installieren wir die wichtigen Pakete für fetchmail, postfix und dovecot. Nach Eingabe von …

sudo apt-get install fetchmail postfix dovecot-core

… schlägt uns apt-get weitere Pakete vor, von denen wir anschließend ein paar installieren. Erst einmal werden die drei und die automatisch von apt-get ausgewählten Pakete installiert und konfiguriert.

Bei der Paketkonfiguration von dovecot-core werden wir gefragt, ob wir ein selbstsigiertes SSL-Zertifikat erstellen wollen: Ja. Als Rechnernamen belassen wir das vorgeschlagene „localhost“.

Bei der Paketkonfiguration von postfix wählen wir das vorgeschlagene „Internet-Site“. Als System-E-Mail-Name verwenden wir „kiste.localdomain“

Wir fahren fort mit …

sudo apt-get install dovecot-imapd sasl2-bin postfix-doc 

Das war es schon.

Dovecot konfigurieren

Zunächst stellen wir Dovecot so um, dass die E-Mails im Maildir-Format in die Homeverzeichnisse der User abgelegt werden:

sudo vi /etc/dovecot/conf.d/10-mail.conf
...
# mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_location = maildir:~/Maildir
...

Wir suchen in der Datei nach der Zeile, die mit mail_location beginnt, kommentieren sie durch ein # am Zeilenanfang aus und fügen die neue Zeile „mail_location = maildir…“ ein, speichern und beenden.

Du weißt nicht, wie man den vi bedient? Mit den Cursortasten an den Anfang der Zeile gehen, „i“ drücken (Insert-Mode), „# “ eingeben, ESC drücken (Insert-Mode beenden), „A“ (Shift-Taste + a) drücken (Append-Mode), RETURN drücken (= neue Zeile einfügen), Inhalt der neuen Zeile eingeben (siehe oben), ESC drücken (Append-Mode verlassen), „:wq“ eingeben (Speichern und Beenden). Oder einen anderen Editor verwenden. 😉

sudo vi /etc/dovecot/conf.d/15-lda.conf
...
postmaster_address = postmann@familie-meier.test
...

Dieser Konfigurationseintrag ist erforderlich, damit Dovecot später nicht mit der Fehlermeldung „Invalid settings: postmaster_address setting not given lda“ nervt.

Postfix konfigurieren

Für Postfix gibt es ein wenig mehr zu konfigurieren und aufzurufen. Wir müssen…

  • den SMTP-Server unseres Mailhosters eintragen,
  • die Authentifizierung mit dem SMTP-Server regeln,
  • die Netzwerkmaske unseres Intranets eintragen,
  • die Mailauslieferung auf Dovecot umstellen,
  • eine „Canonical Map“ für ausgehende E-Mails anlegen,
  • eine „Virtual Map“ für E-Mails anlegen,
  • Postfix ebenfalls auf das Maildir-Format umstellen

Bei der nun folgenden Konfiguration suche man die vielleicht schon vorhandenen Zeilen und ändere sie entsprechend. Findet man sie nicht, fügt man sie als neue Zeile ein.

Los geht es mit der Konfiguration des SMPT-Servers unseres Mailhosters (= der Server, an den unser Mailserver ausgehende E-Mails liefert). Das folgende Beispiel funktioniert für 1&1.

sudo vi /etc/postfix/main.cf
...
relayhost = smtp.1und1.de
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps =  hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
...

In die Datei /etc/postfix/sasl_passwd muss nun eine der vorhandenen E-Mail-Adressen und das zugehörige Passwort des Postfachs bei 1&1 eingetragen werden:

smtp.1und1.de horst@familie-meier.test:Geheim1234

Mittels postmap wird diese Datei nun in das postfix-interne Datenbankformat umgewandelt:

cd /etc/postfix/
sudo postmap sasl_passwd

Der SMTP-Zugriff ist damit erledigt, tragen wir nun die Netzmaske unseres Intranets (die Rechner haben Adressen zwischen 192.168.0.1 und 192.168.0.254) in die main.cf ein:

sudo vi /etc/postfix/main.cf
mynetworks = 127.0.0.0/8 192.168.0.0/24 [::ffff:127.0.0.0]/104 [::1]/128

Mit der folgenden Zeile teilen wir postfix mit, dass E-Mails über dovecot zu verteilen sind. Möglicherweise ist bereits ein Eintrag für procmail vorhanden, diesen dann zuvor entfernen oder auskommentieren und den folgenden einfügen:

sudo vi /etc/postfix/main.cf
...
mailbox_command = /usr/lib/dovecot/deliver
...

Über die „Canonical Map“ erfolgt für ausgehende E-Mail eine Umsetzung von lokalen User-Namen (horst, ursula, …) auf externe E-Mail-Adressen (horst@familie-meier.test, ursula@familie-meier.test). Wir legen zunächst die Datei an …

cd /etc/postfix
sudo vi sender_canonical
horst    horst@familie-meier.test
ursula   ursula@familie-meier.test
kevin    kevin@familie-meier.test
chantal  chantal@familie-meier.test
postmann postmann@familie-meier.test

… erzeugen aus der Datei mittels postmap die postfix-interne Datenbank …

sudo postmap sender_canonical

und aktivieren sie schließlich in der main.cf:

sudo vi main.cf
...
sender_canonical_maps = hash:/etc/postfix/sender_canonical
...

Über die „Virtual Map“ wird geregelt, wie eintreffende E-Mails weiterverteilt werden. Über diese Datei werden auch die Verteilerlisten „eltern“, „kinder“ und „alle“ abgewickelt. Auf der linken Seite der Datei stehen die internen Adressen, auf der rechten Seite der/die User, in dessen/deren Postfächer die E-Mails einsortiert werden.

Wie im obigen Fall legen wir eine Datei mit den notwendigen Einträgen an, speichern diese, erzeugen die postfix-interne Datenbank und konfigurieren sie in der main.cf:

cd /etc/postfix
sudo vi virtual
horst      horst
ursula     ursula
kevin      kevin
chantal    chantal
postmann   postmann
eltern     horst,ursula
kinder     kevin,chantal
alle       horst,ursula,kevin,chantal

horst@familie-meier.test     horst
ursula@familie-meier.test    ursula
kevin@familie-meier.test     kevin
chantal@familie-meier.test   chantal
postmann@familie-meier.test  postmann
eltern@familie-meier.test    horst,ursula
kinder@familie-meier.test    kevin,chantal
alle@familie-meier.test      horst,ursula,kevin,chantal
sudo postmap virtual
sudo vi main.cf
...
virtual_maps = hash:/etc/postfix/virtual
...

Zum Abschluss teilen wir Postfix noch mit, dass E-Mails im Maildir-Format abgelegt werden. Hinweis: Ich bin mir nicht sicher, ob das erforderlich ist, wenn an dovecot verteilt wird, aber jedenfalls läuft es so. 😉

sudo vi /etc/postfix/main.cf
...
home_mailbox = Maildir/
...

Damit ist die Konfiguration von Postfix abgeschlossen.

Fetchmail konfigurieren

Zum Schluss noch die Konfiguration von Fetchmail. Hierfür bitte die Adressen und Kennwörter der Postfächer bereithalten, die wir beim Mailhoster abrufen wollen. In unserem Beispiel sind das die seit oben bekannten Familienpostfächer, die bei 1&1 gehostet und über den dortigen POP3-Server abgerufen werden.

Da noch keine Konfigurationsdatei in /etc bereit liegt, kopieren wir die Beispieldatei dort hin, ändern den Eigentümer auf fetchmail, ändern die Zugriffsrechte …

cd /etc
sudo cp /usr/share/doc/fetchmail/examples/fetchmailrc.example fetchmailrc
sudo chown fetchmail fetchmailrc
sudo chmod 0600 fetchmailrc

… und bearbeiten sie anschließend:

sudo vi fetchmailrc
...
set daemon 60
...
poll pop.1und1.de with protocol pop3
  user 'horst@familie-meier.test'    there with password 'geheim' is 'horst' here
  user 'ursula@familie-meier.test'   there with password 'geheim' is 'ursula' here
  user 'kevin@familie-meier.test'    there with password 'geheim' is 'kevin' here
  user 'chantal@familie-meier.test'  there with password 'geheim' is 'chantal' here
  user 'eltern@familie-meier.test'   there with password 'geheim' is 'eltern' here
  user 'kinder@familie-meier.test'   there with password 'geheim' is 'kinder' here
  user 'alle@familie-meier.test'     there with password 'geheim' is 'alle' here
  user 'postmann@familie-meier.test' there with password 'geheim' is 'postmann' here
...

Über „set daemon 60“ wird der fetchmail-Hintergrundprozess angewiesen, alle 60 Sekunden nach neuen E-Mails zu schauen und abzurufen. Er ist den eigenen Bedürfnissen anzupassen. Bei einer Familie wird es vielleicht ausreichen alle fünf Minuten („set daemon 300“ = default), in einem kleinen Unternehmen möchte man nach einem Anruf „ich habe Ihnen gerade eine E-Mail geschickt“ nicht immer die Geduld für fünf Minuten haben.

Die folgenden Zeilen sollten größtenteils selbsterklärend sein. Bei „geheim“ ist das hoffentlich ordentliche Kennwort des jeweiligen Postfaches einzutragen.

Nach Speichern der Konfiguration aktivieren wir nun noch den fetchmail-Hintergrundprozess durch das Ändern eines „no“ in ein „yes“:

sudo vi /etc/default/fetchmail
...
START_DAEMON=yes
...

Damit ist auch die Konfiguration von fetchmail abgeschlossen.

Services (neu) starten

Der große Moment ist nun gekommen, unseren Mailserver in Betrieb zu nehmen und zu schauen, ob wir alles korrekt konfiguriert haben. Ich empfehle, mehrere Shells auf der Kiste zu öffnen und die Logfiles /var/log/syslog bzw. /var/log/mail.err oder /var/log/mail.log mit tail -f zu verfolgen. Tipp: MobaXterm und der View „4 terminals mode“ eignet sich vorzüglich dafür.

Was noch laufen sollte, stoppen wir erst einmal, danach starten wir die als Hintergrunddienste laufenden Mailprozesse erneut:

sudo service fetchmail stop
sudo service postfix stop
sudo service dovecot stop

Vor dem Starten der Prozesse bitte noch einmal den Disclaimer oben lesen! Zum Starten der Prozesse dann eingeben:

sudo service dovecot start
sudo service postfix start
sudo service fetchmail start

Zum Testen des E-Mail-Versandes logge man sich mit den angelegten Usern ein und schicke per Kommandozeile mal kreuz und quer ein paar E-Mails auf die Reise, betrachtet dabei die Logfiles, ob irgendwelche Fehler auftreten.

horst@kiste:~$ echo "Test" | mailx -s "horst an ursula" ursula
horst@kiste:~$ echo "Test" | mailx -s "horst an ursula@..." ursula@familie-meier.test
horst@kiste:~$ echo "Test" | mailx -s "horst an eltern" eltern

Danach schicke man von extern ein paar Testmails an alle Adressen und schaue, ob fetchmail die auch brav abholt. Abschließend ruft man per externem Mailclient (z.B. Thunderbird) die Mails vom Mailserver ab, löscht ein paar, archiviert sie, schaut dabei ob die IMAP-Ordner korrekt angelegt werden, betrachtet auf der Kiste die Veränderungen in den Mail-Verzeichnissen, …

Sollten Fehler auftreten, empfiehlt es sich wie immer, einfach nach den wichtigsten Teilen der Fehlermeldung per Copy&Paste bei Google zu suchen. Die Wahrscheinlichkeit ist hoch, dass irgendjemand bereits über genau diesen Fehler gestolpert ist und die Lösung im Web zu finden ist.

Und jetzt?

Jetzt werde ich selbst auf Basis dieser Installation schauen, ob alles genau so funktioniert, wie ich mir das vorstelle. Falls nicht, werde ich die notwendigen Änderungen oben dokumentieren.

Anschließend mache ich mich an die Arbeit Richtung Filterung von SPAM oder des Virenschutzes sowie Überlegungen, wie man den Server möglichst geschmeidig im laufenden Betrieb oder mitten in der Nacht sichern kann…

Update: Fetchmail nicht als System Daemon verwenden

Möchte man fetchmail nicht als systemweiten Dämon laufen lassen – bspw. weil man nicht pausenlos nach der konfigurierten Wartezeit die Postfächer für alle Benutzer nacheinander gleich oft auf neue E-Mails zu überprüfen, setze in der /etc/default/fetchmail den Konfigurationswert auf „no“. Sollte der Dämon/Service noch laufen, ihn vorher noch stoppen:

sudo service fetchmail stop
sudo vi /etc/default/fetchmail
...
START_DAEMON=no
...

Nun kann/muss man die Fetchmailkonfiguration pro Benutzer im jeweiligen Homeverzeichnis in der Datei .fetchmailrc vornehmen. Wie oben kopieren wir erst einmal das Beispiel herüber und passen die Benutzerrechte an:

horst@kiste:~$ sudo cp /usr/share/doc/fetchmail/examples/fetchmailrc.example .fetchmailrc
horst@kiste:~$ sudo chmod 0700 .fetchmailrc

Nun tragen wir die POP3-Abrufinformationen speziell für diesen Benutzer hinein:

horst@kiste:~$ sudo vi .fetchmailrc
...
poll pop.1und1.de with protocol pop3
  user 'horst@familie-meier.test' there with password 'geheim' is 'horst' here
...

E-Mails lassen sich nun manuell abrufen, ein einfacher Aufruf von „fetchmail“ reicht. „fetchmail -v“ macht fetchmail gesprächiger, „fetchmail -v -v“ noch geschprächiger.

Mit „fetchmail -d 123“ startet der Benutzer seinen eigenen fetchmail-Dämon, bei dem alle 123 Sekunden nach neuen E-Mails geschaut wird. Mit „fetchmail –quit“ wird der Benutzer-Dämon wieder abgeschossen (die Prozess-ID steht in .fetchmail.pid). Was man sonst noch alles konfigurieren und per Commandline-Optionen übergeben kann, findet man unter „fetchmail –help“ und natürlich „man fetchmail„.

Hinweis: Ich werde vermutlich für meine späteren Zwecke fetchmail über die crontab steuern und über „–syslog“ ins Syslog protokollieren lassen.

Links

  1. Bisher keine Kommentare
  1. Bisher keine Trackbacks