# 1.113.2

# Verwendung und allgemeine Konfiguration von Sendmail

Beschreibung: Prüfungskandidaten sollten in der Lage sein, einfache Einstellungen in den Sendmail Konfigurationsdateien vorzunehmen (einschließlich des "Smart Host" Parameters, wenn notwendig), Mail-Aliases anzulegen, die Mail-Queue zu verwalten, Sendmail zu starten und zu stoppen, Mail-Weiterleitung zu konfigurieren und allgemeine Sendmail-Probleme zu lösen.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- `/etc/sendmail.cf`
- `/etc/aliases` oder `/etc/mail/aliases`
- `/etc/mail/*`
- `~/.forward`

Die Einrichtung eines Mailservers mit sendmail gilt als eines der kompliziertesten Kapitel der Unix-Serverinstallation. Es existiert ein tausendseitiges Buch alleine über die Sendmail-Konfiguration, es gibt auch die Weisheit:

> Ein richtiger Unix-Systemadministrator ist man erst, wenn man einmal eine Sendmail Konfigurationsdatei geschrieben hat.

> Ein richtiger Unix-Systemadministrator wird sich aber hüten, es ein zweites Mal zu tun.

Aber so schlimm ist es heute nicht mehr, keine Angst. Die modernen Sendmail Versionen bringen heute ausgesprochen leicht zu handhabende Konfigurationsdateien mit, die die Arbeit mit Sendmail erleichtern. Wenn also kein zu komplizierter Mailserver aufgesetzt werden soll, dann können wir uns das Leben sehr einfach machen.

Die LPI102 Prüfung verlangt kein tiefergehendes Wissen über die Geheimnisse der sendmail Konfiguration, es genügen die notwendigen Informationen, um einen einfachen Mailserver einzurichten.

### Die Architektur von E-Mail

Das SMTP Prinzip verteilt seine Aufgaben auf verschiedene Programme. Die zwei grundlegenden Programmtypen sind dabei

Der Mail User Agent (MUA)
  Das Programm, mit dem der User seine Mails liesst und erstellt. Es existieren hunderte verschiedener MUAs, für jedes Betriebssystem. Beispiele hierfür sind Eudora, OutlookExpress, Outlook auf der Windows-Seite und elm, pine, xfmail, kmail, mutt auf der Linux-Seite.
Der Mail Transfer Agent (MTA)
  Das Programm, das die abgehende Mail von einem beliebigen MUA erhält und sich darum kümmert, daß diese Mail weitergeleitet wird. Andererseits das Programm, das - bei permanenter Internet-Anbindung - die ankommenden Mails von anderen MTAs entgegennimmt und lokal abspeichert, damit die MUAs darauf zugreifen können. Der verbreitetste und mächtigste MTA ist das Programm sendmail.

Hier geht es prinzipiell um die Konfiguration von MTAs - konkret um die Konfiguration von sendmail. Die genannte Aufteilung der Aufgaben in Userprogramm und Versendeprogramm machen eine Unterscheidung hinsichtlich der Netzanbindung nötig. Es ist ein erheblicher Unterschied, ob unser Mailserver eine permanente Netzanbindung hat, oder nicht.

In einem lokalen Netz kann auf jeder Unix-Workstation ein sendmail-Daemon laufen, jedoch hat nur einer der Rechner die tatsächliche Anbindung ans Internet. Das bewirkt, daß die anderen Rechner ihre Mails an den einen mit Netzanbindung schicken, erst der versendet sie dann weiter ins Internet. Diese Architektur hat in vielen Fällen Vorteile, zum Beispiel

- Bei temporärer Netzanbindung bauen nicht alle User dauernd Verbindungen ins Internet auf, sondern schicken ihre Mails an einen Rechner, der die Mails regelmäßig weiterleitet.
- Bei einer Firewalleinrichtung kann eingestellt werden, daß nur SMTP-Pakete von und zu diesem einen Rechner durchgelassen werden.

Im Regelfall läuft sendmail als stand-alone Dienst. Das heißt, auch bei temporärer Anbindung ist der Daemon ständig im Speicher. Das ist notwendig, damit ein Rechner Mails von anderen MTAs empfangen kann. Ob sendmail die ausgehenden Mails gleich losschickt, oder wohin es sie weiterleitet, das muss konfiguriert werden.

Die zentrale sendmail-Konfigurationsdatei ist /etc/sendmail.cf. Diese Datei selbst zu bearbeiten oder gar zu erstellen ist ausgesprochen kompliziert - das Anfangs angeführte Zitat bezieht sich eben darauf. Wir werden hier nicht die komplette Konfiguration von sendmail behandeln, sondern ausschließlich kleine Veränderungen an dieser Datei vornehmen.

### Grundlagen der Mailverzeichnisse im Linux-System

Jedes Unix/Linux-System hat zwei verschiedene Mail-Verzeichnisse. Zum einen existiert eine Warteschlange für ausgehende Mails (meist `/var/spool/mqueue` oder `/var/mqueue`) und zum anderen ein Verzeichnis `/var/spool/mail`, in dem eine Datei für jeden User existiert, die seine angekommene Mail bereithält. Die MUAs und MTAs arbeiten beide mit diesen Verzeichnissen.

Ein MUA, mit dessen Hilfe eine Mail versendet wird, legt diese abgehende Mail mitsamt aller dazu nötigen Headerinformation (von wem kommt die Mail, an wen geht die Mail usw.) in das Spoolverzeichnis für die ausgehende Mail. Der MTA arbeitet diese Warteschlange in regelmäßigen Abständen ab und verschickt die Mails ins Internet - entweder direkt an die empangenden Rechner oder an einen Mailserver des Providers, der dann die Weiterversendung übernimmt.

Umgekehrt bekommt der MTA eingehende Mails aus dem Netz und sortiert sie in die Eingangspostfächer (z.B. `/var/spool/mail/hans`). Beim nächsten Aufruf eines MUA findet dieser im jeweiligen Verzeichnis dann die neue Mail vor und kann sie darstellen.

Die Programme, die unter Unix ständig dafür sorgen, daß einem User mitgeteilt wird, daß er neue Mail hat (biff/xbiff), nützen ebenso diese Verzeichnisse. Der Vorteil an diesem Prinzip liegt in der Tatsache, daß das Mailsystem so integraler Bestandteil des Systems selbst ist, und nicht ein aufgepfropftes Anwenderprogramm. Nur deshalb können z.B. Programme wie cron oder at ihre Ausgaben als Mail an den User schicken, der den Auftrag gegeben hatte.

Um den Inhalt der Warteschlange anzusehen, existiert der Befehl mailq, der in Wahrheit nur ein symbolischer Link auf sendmail ist.

### Starten von sendmail

Die zentrale Aufgabe von sendmail ist es, neben dem Empfang von Mails über SMTP, die Warteschlange für die ausgehende Mail (mqueue) zu bearbeiten. Dazu existieren zwei völlig unterschiedliche Architekturen, entweder ist der Rechner, auf dem sendmail läuft tatsächlich mit einer festen IP-Adresse ans Internet angebunden und von überall her unter einem bestimmten Namen zu erreichen, oder er ist nur temporär ans Internet angebunden und somit nur für das Versenden von Mails gedacht.

#### Starten des Mailservers mit permanenter Netzanbindung

Auf einem Rechner mit permanenter Internet-Anbindung hat sendmail in der Regel zwei Aufgaben:

- Empfang von Mails aus dem Internet über SMTP
- Versand von ausgehenden Mails über SMTP

Zumindestens die erste Aufgabe bedingt es, daß sendmail permanent als Daemon im Speicher liegt und arbeitet. Nur so ist es gewährleistet, daß eingehende Mails tatsächlich jederzeit angenommen werden können. Der Start von sendmail benötigt hier zwei wesentliche Parameter, der erste gibt an, daß das Programm als Daemon gestartet werden soll und der zweite stellt die Frequenz ein, in der sendmail die Warteschlange bearbeiten soll (in diesem Beispiel 30 Minuten):

      sendmail -bd -q30m

Auf diese Weise wird sendmail alle 30 Minuten die Mailqueue lesen und anstehende Aufträge (ausgehende Mails) versenden. Die eingehenden Mails werden jederzeit empfangen.

#### Starten des Mailservers mit temporärer Netzanbindung

In diesem Fall wird sendmail nur für die Versendung von Mail herangezogen. Das Empfangen wird wahrscheinlich über POP3 oder IMAP geregelt. In diesem Fall muß sendmail nur regelmäßig aufgerufen werden, um die ausgehenden Mails zu versenden. Dazu wird der Parameter `-bd` weggelassen, um zu verhindern, daß das Programm als Daemon gestartet wird. Der Parameter `-q` wird ohne Angabe eines Zeitintervalls angegeben. Das führt dazu, daß sendmail die Mailqueue abarbeitet und anschließend beendet wird.

      sendmail -q

Dieser Befehl kann jetzt z.B. in regelmäßigen Abständen von cron aufgerufen werden.

Um die interne Weitergabe von Mails zu realisieren, wird meist jedoch auch auf Rechnern ohne permanente Anbindung ein Sendmail-Daemon gestartet, der allerdings nicht die Warteschlange abarbeitet. Die Versendung geschieht mit dem oben genannten Befehl über cron gesteuert, der Aufruf von sendmail heißt dann

      sendmail -bd

So ist die interne Funktionalität weiter gewährleistet, ohne daß in regelmäßigen Abständen die Queue abgearbeitet wird.

### Mailaliase

sendmail hat die Möglichkeit, Alias-Adressen zu bilden. Das sind E-Mail Adressen, die in Wahrheit keinem normalen User zugeordnet sind, sondern auf andere User verweisen. Häufig benutzte solche Adressen sind z.B.

- webmaster@...
- abuse@...
- ftpadmin@...

In den seltensten Fällen sind das wirkliche User des Systems. Normalerweise werden einfach Aliase angelegt, die diese Adressen dem entsprechenden User zuweisen, der den Job übernommen hat. Dazu kennt sendmail die Datei `/etc/aliases` oder manchmal auch `/etc/mail/aliases`.

Das Format dieser Datei ist sehr einfach, pro Zeile wird ein Alias definiert:

Aliasname: Username

Um die drei obigen Beispiele bestimmten Usern zuzuordnen könnten in einer solchen Datei also folgende Einträge stehen:

      webmaster: root
      abuse:     root
      ftpadmin:  hans

Alle Mails an `webmaster@mydomain.de` und `abuse@mydomain.de` würden also an den User `root@mydomain.de` weitergeleitet, während Mails an `ftpadmin@mydomain.de` an `hans@mydomain.de` weitergegeben würden. mydomain.de würde natürlich durch die entsprechende lokale Domain ersetzt.

Es ist auch möglich, bestimmte Adressen nicht an andere Adressen zu versenden, sondern an bestimmte Programme weiterzuleiten. In diesem Fall werden Mails, die an diese Adresse gingen an ein angegebenes Programm weitergepiped. So können z.B. Mailinglists organisiert werden. Statt einem Usernamen wird dann ein Programmname angegeben, dem ein Pipe-Symbol vorangestellt wurde. Programmname und Pipesymbol müssen in doppelte Anführungszeichen gesetzt werden:

      Aliasname: "|Pfad/zu/Programm Optionen"

Nach jeder Veränderung der Alias-Datei muß das Programm newaliases aufgerufen werden, um diese Aliase für sendmail bekannt zu machen. Wie mailq ist auch newaliases nur ein symbolischer Link auf sendmail.

### Mails an andere Adressen weiterleiten

Einen ähnlichen Mechanismus wie das Setzen von Aliasen bietet die Datei `~/.forward` im Homeverzeichnis eines Users. Diese Datei enthält entweder E-Mail-Adressen, Dateinamen oder Programmnamen, an die eingehende Mails des Users, in dessen Homeverzeichnis die Datei liegt, weitergeleitet werden.

Die Syntax der drei möglichen Einträge ist einfach:

E-Mail-Adressen
  Enthält eine `.forward` Datei eine Zeile mit einer einfachen E-Mail-Adresse, so wird jede eingehende Mail des Users an diese Mailadresse weitergeleitet. Die E-Mail-Adresse wird ohne Anführungszeichen angegeben. Enthält sie keine Domain-Angabe, so wird eine lokale Adresse angenommen. Wenn z.B. auf einem Rechner der Useraccount `hans` der Normallogin des Systemverwalters ist, so kann der Systemverwalter in sein Homeverzeichnis eine `.forward` Datei anlegen, mit dem Eintrag

        hans

  Jede Mail an `root` wird jetzt an Hans weitergeleitet. So empfängt der Systemverwalter seine Mails auch, wenn er sich als `hans` anmeldet.
Dateinamen
  Wenn eingehende Mails in eine bestimmte Datei kopiert werden sollen, so wird der Name der Datei in Anführungszeichen in `.forward` angegeben. Die angegebene Datei entspricht vom Aufbau her einer normalen Mailbox-Datei, wie sie normalerweise in `/var/spool/mail` liegt. Alle Mails werden an diese Datei angehängt.

        "/var/spool/mail2/hans"
        "./Mail/meinemail"

  Die Angaben einer Datei werden immer entweder als kompletter Pfad zu der Datei oder als Pfad mit führendem Punkt angegeben. Im zweiten Fall bezieht sich der Pfad auf das Homeverzeichnis des jeweiligen Users.

  Bei der Angabe von normalen Pfaden muß darauf geachtet werden, daß der User Schreibrecht auf die entsprechende Datei besitzt.

Programmnamen
  Soll eine Mail an ein bestimmtes Programm weitergegeben werden, so wird der Programmname in die Datei `.forward` in Anführungszeichen mit führendem Pipe-Symbol angegeben.

        "| /Pfad/zu/Programm"

  Die Mail wird dann an das angegebene Programm gepiped, das heißt, das Programm muß Eingaben von der Standard-Eingabe verarbeiten können. Die Angabe eines Programms erfolgt mit vollem Pfad.

Mit Hilfe dieses Mechanismuses ist es möglich, daß auch Normaluser ihre Mails weiterleiten oder Mailinglisten aufbauen, auch wenn sie keinen Zugriff auf `/etc/aliases` besitzen.

### Ausgehende Mailserver

Wenn Mails von sendmail versendet werden sollen, dann gibt es zwei Möglichkeiten, wie das organisiert werden kann. Entweder verschickt sendmail die Mails direkt an die angegebenen Adressen, oder alle Mail wird an einen sogenannten Smarthost weitergeleitet, der sich dann um das weitere Versenden kümmert. Die meisten Internet-Provider stellen einen solchen SMTP-Server für ihre Kunden zur Verfügung.

Die Versendung ohne Smarthost bedingt eine funktionierende DNS-Installation, da sendmail sowohl die Adressen der ausgehenden Mails auflösen muß, als auch von den Empfänger-Rechnern wieder angesprochen werden muß.

Wird stattdessen aber ein Smarthost angegeben, so sendet sendmail alle ausgehende Mail an diesen Rechner, der dann natürlich die selben Ansprüche erfüllen muß, wie ein lokaler Rechner, der keinen Smarthost verwendet, er muß eine funktionierende DNS-Anbindung haben.

Der Eintrag für den Smarthost findet in der zentralen Konfigurationsdatei von sendmail statt, die Datei `/etc/sendmail.cf`. Hier muß die Einstellung

      DSRechnername

eingetragen sein. Soll stattdessen kein solcher Rechner verwendet werden, so wird der Parameter Rechnername einfach weggelassen.

      DS

### Die Dateien in /etc/mail

Das Verzeichnis `/etc/mail` enthält verschiedene Dateien, die Einstellungen für sendmail ermöglichen. Die meisten davon existieren in zwei Formaten. Zum einen existiert eine einfache Textdatei, in der wir die Einstellungen vornehmen können, zum anderen eine Datei, die den selben Namen, aber die Endung `.db` trägt. Sie enthält die Informationen, die sendmail selbst verarbeitet. Nach jeder Änderung einer der Textdateien ist es notwendig, diese Datei in das Datenbankformat (`.db`) zu konvertieren. Dazu wird folgender Befehl eingegeben:

        makemap hash -f /etc/mail/datei.db < /etc/mail/datei

Statt datei wird natürlich der Name der zu konvertierenden Datei angegeben.

#### /etc/mail/access

Diese Datei regelt den Zugriff auf den Mailserver. Also die Frage, welcher Rechner darf ausgehende Mail an diesen Server schicken, damit er sie weiterleitet. Ein paar Beispiele:

      127                     RELAY
      192.168.100.123         OK
      mydomain.de             OK

Alle Rechner, deren Adresse mit 127 anfangen (das sind nur wir selbst) senden ihre Mail grundsätzlich (RELAY) über diesen Rechner. Der Rechner 192.168.100.123 darf jederzeit Aufträge an diesen Rechner weitergeben und alle Mitglieder der Domain mydomain.de ebenfalls. Sonst werden alle Aufträge zur Weiterleitung abgelehnt.

Wie oben erwähnt muß diese Datei nach jeder Veränderung in das Datenbankformat konvertiert werden.

#### /etc/mail/genericstable

Diese Datei dient der Übersetzung ausgehender E-Mail Adressen in weltweit gültige. Bin ich z.B. auf dem Server der Systemverwalter, so lautet meine E-Mail Adresse intern z.B. `root@server.local`. Würde meine ausgehende Mail nun diese Adresse als Absender tragen, bekäme ich wohl nie eine Antwort. Denn mit `root@server.local` kann im Internet niemand etwas anfangen. Dort gilt meine Adresse `echter.name@echter.provider.org`. In der Datei genericstable stehen jetzt Umrechnungstabellen für solche Fälle:

        root                     echter.name@echter.provider.org
        root@server.local        echter.name@echter.provider.org
        hans                     hMueller@gmx.de
        hans@server.local        hMueller@gmx.de

Auch diese Datei muß nach einer Veränderung in das Datenbankformat gebracht werden.

#### /etc/mail/mailertable

Hier werden bekannte Rechner genannt, samt den Methoden, mit denen Mail an sie verschickt wird. Dabei können auch Tricks angewandt werden, wie etwa der Domainname, der an einen bestimmten Rechner weitergeleitet wird:

      marvin.local.de        smtp:marvin.local.de
      hal.local.de           smtp:hal.local.de
      golem.local.de         smtp:golem.local.de
      local.de               smtp:marvin.local.de

Alle Aufträge an bestimmte Rechner (marvin, hal und golem) gehen an die Rechner selbst via smtp. Alle Adressen, die keinen Rechner sondern nur eine Domain nennen (z.B. `hans@local.de`) werden an marvin weitergeschickt.

Auch diese Datei muß nach einer Veränderung in das Datenbankformat gebracht werden.

#### /etc/mail/virtusertable

Hier werden - ähnlich wie bei aliases - zwei verschiedene Adressen miteinander verknüpft. Dabei darf allerdings über Domaingrenzen gegangen werden, so daß - sollte ein Rechner mehrere Domains verwalten - hier Umleitungen zur jeweils passenden Adresse vorgenommen werden können.

        efka@local.de root@golem.local.de

Die Adresse `efka@local.de` wird in Wahrheit an `root@golem.local.de` weitergegeben.

Auch diese Datei muß nach einer Veränderung in das Datenbankformat gebracht werden.