18.2 SMTP-Server mit Exim
Im Folgenden wollen wir beschreiben, wie ein Exim-SMTP-Server (siehe auch http://www.exim.org) arbeitet und was man beim eigenen Betrieb beachten sollte. Dabei stellt sich natürlich die Frage: Warum Exim und nicht Postfix, Sendmail oder ein anderer Mailserver? Bis zu einem gewissen Grad gibt es gute Argumente für Exim – der Server gilt beispielsweise als sehr flexibel und ist auch der Standard-Mailserver vieler Distributionen --, aber ab einem gewissen Punkt spielt natürlich auch der persönliche Geschmack eine Rolle.
18.2.1 Die Exim-Philosophie
Exim ist dafür ausgelegt, als Mailserver auf permanent am Internet angeschlossenen Systemen zu arbeiten. Exim lauscht dabei an Port 25 auf eingehende Mails, um diese
dann weiterzuverarbeiten.
Access Control Lists – ACLs
Bevor eine Mail jedoch überhaupt angenommen wird, können theoretisch nach jedem Schritt im SMTP-Protokoll sogenannte Access Control Lists (ACLs) aktiv sein. Diese ACLs definieren Regeln, die testen, ob eine Mail überhaupt angenommen werden soll. Der Sinn dieser Aktion ist es, kein offenes Relay zu betreiben, bei dem jeder Absender an beliebige Empfänger im Internet senden kann.
RCPT TO
Meist greift mindestens eine ACL nach dem Kommando RCPT TO im SMTP-Protokoll und prüft Folgendes:
- Lokaler Empfänger
Ist die Mail, wenn sie aus dem Internet kommt, für einen lokalen Empfänger bestimmt? - Empfänger im Internet
Ist der Empfänger im Internet: Kommt die Mail von einem lokalen Absender (der sich beispielsweise über Benutzername und Passwort authentifiziert hat)?
Andernfalls wird die Mail oft verworfen. Täte man das nicht, könnten Spammer Ihren Mailserver zum Spam-Versand nutzen, was schnell sehr unangenehm werden kann – und zwar spätestens dann, wenn die eigene IP-Adresse auf diversen Blacklists gelandet ist und kein Mailserver mehr Ihre regulären Nicht-Spam-Mails annimmt.
Auch kann man Greylisting über eine ACL nach dem RCPT-TO-Kommando und die Spam-Erkennung zur Versandzeit über eine ACL nach dem DATA-Kommando abbilden. [Fn. Als einer der Hauptvorteile von exim wird im Übrigen die Möglichkeit angesehen, in diesen ACLs exzessiven Gebrauch von (gern auch ausgefallenen) SQL-Statements zu machen.]
Spooling
Nach Annahme einer Message durch Exim wird sie im Spooling-Verzeichnis abgelegt. Die Mail wird dazu in zwei Dateien aufgespaltet, um den Header und den eigentlichen Mail-Inhalt zu trennen. [Fn. Dies geschieht aus Effizienzgründen: Die Headerdaten werden von exim für interne Zwecke benötigt und müssen unter Umständen öfter gelesen werden als der eigentliche Mail-Inhalt.]
Die Dateinamen im Spooling-Verzeichnis sind dabei aus der Message-ID abgeleitet, die exim jeder E-Mail zuteilt. Eine Message-ID sieht beispielsweise so aus: 1IRfRs-00023e-6K. Im entsprechenden Spooling-Verzeichnis findet man dann die Dateien 1IRfRs-00023e-6K-H und 1IRfRs-00023e-6K-D mit dem Mailheader beziehungsweise den eigentlichen Daten.
Das Spooling-Verzeichnis selbst ist in der Regel in mehrere Unterverzeichnisse aufgeteilt. Hintergrund dieser Aufteilung sind Performancegedanken: Eine große Queue lässt sich leichter indizieren, wenn sie in kleine Teile aufgebrochen ist.
Routers und Transports
Die eigentliche Auslieferung übernehmen Routers und Transports. Kurz gesagt legt ein Router anhand der Empfängeradresse fest, wie eine Zustellung erfolgen soll – ein Transport führt diese Auslieferung schließlich durch.
In der Exim-Konfiguration sind in der Regel mehrere Router konfiguriert, die alle nacheinander für eine Mail durchlaufen werden. Einer der Router wird schließlich die Empfängeradresse akzeptieren und sie einem Transport zuweisen. Alternativ kann der Router die Adresse auch »bouncen« lassen, also die Zustellung als fehlgeschlagen definieren und den Absender per E-Mail über die gescheiterte Zustellung informieren.
Der vom Router gewählte Transport stellt schließlich die Mail zu: beispielsweise lokal in die Mailbox des Users oder auch an einen entfernten Server, wenn für diesen relayt wird.
Wenn eine Nachricht mehrere Empfänger hat, so werden alle Router für jeden Empfänger einzeln durchlaufen. Somit kann es durchaus vorkommen, dass dieselbe Nachricht über unterschiedliche Transports verschickt wird – nämlich beispielsweise an einen lokalen und an einen entfernten Empfänger.
18.2.2 Exim installieren und konfigurieren
Für dieses Buch ist die eigentliche Konfiguration des Exim-Servers eher weniger interessant. Zum einen kommt man auch mit einer weitgehenden Standardkonfiguration sehr weit und kann bereits mit dieser eigene Server im Internet betreiben. Zum anderen ist jedoch die Syntax von Exim so komplex, dass man darüber ein eigenes Buch schreiben müsste, wenn man einigermaßen ins Detail gehen wollte. Daher werden wir uns im Folgenden vor allem mit Optionen beschäftigen, die eine Standardkonfiguration hinreichend an die eigenen Bedürfnisse anpassen.
Der Mailname
Eine der wichtigsten Einstellungen ist der sogenannte Mailname. Dieser Hostname wird vom versendenden SMTP-Server im HELO- beziehungsweise EHLO-Kommando genutzt. Normalerweise nutzt Exim dafür den normalen Hostnamen des Systems, jedoch gibt es Fälle, wo man einen anderen Mailnamen verwenden möchte. Dann kann man den primären Hostnamen auch wie folgt setzen:
Listing 18.5 Der Mailname
primary_hostname = foo.example.com
Diese Änderung ist vor allem bei gemieteten Servern interessant, die standardmäßig einen vom Provider vorgegebenen Namen tragen, mit dem sich der eigene Mailserver aber nicht unbedingt vorstellen sollte.
Lokale Domains
Lokale Domains sind alle, für die der eigene Mailserver E-Mails annimmt. In der Konfigurationsdatei wird diese Einstellung als einfache Liste von Domains definiert, auf die dann in den entsprechenden ACLs zugegriffen wird:
Listing 18.6 local_domains sehr lokal
domainlist local_domains = @
Das @ steht in diesem Fall wieder für den lokalen Hostnamen. Möchte man aber nicht nur E-Mail-Adressen wie user@foo.example.com, sondern auch die »schönere« Form user@example.com verwenden, muss man dem Exim an dieser Stelle mitteilen, dass er auch für diese Domain Mails annehmen soll:
Listing 18.7 local_domains etwas globaler
domainlist local_domains = @ : example.com
Weitere Domains, für die der Server E-Mails annehmen soll, müssen durch einen Doppelpunkt abgetrennt an die Liste angefügt werden.
Relaying
Eine andere Variable beschreibt Domains, für die E-Mails zwar auch akzeptiert werden sollen, die jedoch nicht zu den lokalen Domains zählen, sondern von denen an einen anderen Server weitergeleitet werden soll. Zwar spielt es für den SMTP-Protokollablauf keine Rolle, ob eine Domain in local_domains oder relay_to_domains liegt, da in beiden Fällen Mails für diese Domains angenommen werden, jedoch kommen die Variablen in den ACLs an unterschiedlichen Stellen zum Einsatz, und folglich werden entsprechende E-Mails auch unterschiedlich behandelt. [Fn. ... nämlich entweder lokal zugestellt oder an einen anderen Rechner weitergesendet.]
Listing 18.8 relay_to_domains
domainlist relay_to_domains =
Eine weitere das Relaying betreffende Einstellung ist die Liste relay_from_hosts. Hier werden alle IP-Adressen eingetragen, von denen aus Mails an das ganze Internet akzeptiert werden.
Normalerweise steht hier nur localhost, aber wenn ein eigenes LAN Zugriff auf den Server hat, kann auch dieses hier gelistet werden:
Listing 18.9 relay_from_hosts
hostlist relay_from_hosts = 127.0.0.1
Wie Sie vielleicht bemerkt haben, sind wir bisher nur auf Variablen eingegangen. Je nach Exim-Konfiguration können diese Variablen zwar theoretisch anders heißen oder ganz fehlen, jedoch sind diese rudimentären Listen in so ziemlich jeder Exim-Konfiguration enthalten und damit durchaus relevant.
Weitere Punkte
Einige weitere wichtige Punkte, die Sie bei einer Installation beachten sollten, haben wir in der folgenden Auflistung zusammengefasst:
- Richtiger lokaler Transport
Je nachdem, welchen POP3/IMAP-Server Sie verwenden, sollten Sie den richtigen lokalen Transport wählen. Exim kann Mails unter anderem im MBox- [Fn. Erzeugt eine große Datei, in der alle Mails stehen. Dieses Format ist nur für POP3 effizient, da bei diesem Protokoll das gesamte Postfach komplett abgeholt wird und anschließend alle Mails vom Server gelöscht werden.] oder im Maildir-Format [Fn. Dieses Format hat meist eine eigene Verzeichnisstruktur im Home-Verzeichnis des Users, die Unterordner usw. abbilden kann und daher für IMAP-Postfächer geeignet ist.] ablegen. - Richtige Listen-IP(s)
Achten Sie darauf, dass Ihr Mailserver auch an den richtigen IP-Adressen auf eingehende Mails horcht. Bei manchen Distributionen bindet Exim, wenn er »frisch« aus dem Paket kommt, nur auf localhost. - Authenticators
Wenn Sie Ihren Server im Internet betreiben, werden Sie höchstwahrscheinlich von dynamischen IP-Adressen über Ihren Mailserver versenden wollen. Da Sie in einem solchen Setup nicht einfach alle IP-Adressen per relay_from_hosts freischalten können, müssen Sie Authenticators definieren. Dann können Sie sich über verschiedene Verfahren über SMTP mit Benutzernamen und Passwort authentifizieren und dürfen anschließend relayen. - Kein Open Relay
Man kann es nicht oft genug betonen: Bitte überprüfen Sie vor einer Inbetriebnahme den Server gründlich daraufhin, ob er nicht vielleicht doch Spammern hilft, ihre vermeintlich potenzsteigernden Nachrichten unters Volk zu bringen. Dabei können Sie einerseits selbst »SMTP« per telnet mit Ihrem Server sprechen, andererseits gibt es sehr viele Webseiten, die solche Tests durchführen. [Fn. Googeln Sie einfach einmal nach »Open Relay Test«.]
18.2.3 Die Arbeit mit Exim-Tools
Es gibt einige typische Anwendungsfälle, mit denen Sie bei der Administration eines Mailservers früher oder später konfrontiert werden. Die wichtigsten finden Sie in den folgenden Abschnitten beschrieben.
Logfiles
Das wichtigste Exim-Logfile ist das mainlog, das Sie beispielsweise unter /var/log/ exim/mainlog finden. Im Mainlog sehen Sie alle eingehenden Verbindungsversuche sowie wichtige Informationen zur Mail-Verarbeitung. Anhand dieser Informationen können auftretende Probleme recht gut debuggt werden.
Listing 18.10 Auszug aus dem mainlog
2007-09-04 15:21:35 1ISYLX-0001Rm-N3 <= johannes@ploetner-it.de
H=fw0-frankfurt.de.clara.net ([192.168.0.104]) [212.82.224.202]
P=esmtpsa X=TLS-1.0:RSA_ARCFOUR_MD5:16 DN=""
A=login_server:jploetner S=1260
id=1188912188.4001.10.camel@laptop.pit
2007-09-04 15:21:36 1ISYLX-0001Rm-N3 => swendzel
<steffen@ploetner-it.de> R=local_user T=maildir_home
2007-09-04 15:21:47 1ISYLX-0001Rm-N3 ==
judith.stevens@galileo-press.de
R=dnslookup T=remote_smtp defer (-44): SMTP error from
remote mail server after RCPT TO:<judith.stevens@galileo-press.de>:
host mail.galileo-press.de [194.8.219.19]: 451 Please try again
2007-09-04 16:05:25 1ISYLX-0001Rm-N3 =>
judith.stevens@galileo-press.de
R=dnslookup T=remote_smtp H=mail.galileo-press.de [194.8.219.19]
X=TLS-1.0:RSA_AES_256_CBC_SHA1:32 DN="C=XX,ST=XX,L=XX,O=XX,OU=XX,
CN=mail.galileo-press.de,EMAIL=x.x"
2007-09-04 16:05:25 1ISYLX-0001Rm-N3 Completed
In diesem Beispiel erkennen Sie folgenden Ablauf:
- Eingang der Mail
Der Mailserver empfängt (<=) eine E-Mail mit johannes@ploetner-it.de als Absender von der IP-Adresse 212.82.224.202. Die Verbindung ist mittels TLS verschlüsselt, und der Authenticator login_server wird mit dem Usernamen jploetner benutzt. Die Mail hat die Message-ID 1ISYLX-0001Rm-N3. - Erster Empfänger
Der erste Empfänger dieser Mail (steffen@ploetner-it.de) ist ein lokaler User. Die Mail wird unter Verwendung des Routers local_user und des Transports maildir_home zugestellt. - Zweiter Empfänger
Die Auslieferung an den zweiten Empfänger der Mail ist beim ersten Versuch fehlgeschlagen: Wir bekommen ein 451 Please try again als Antwort vom Server, also einen temporären Fehler. Beim zweiten Auslieferungsversuch nimmt der Mailserver die Mail jedoch an. [Fn. Und nebenbei ist das ein hübsches Beispiel für Greylisting.] - Completed
Damit ist die Mail an alle Empfänger ausgeliefert und kann somit aus der Queue gelöscht werden.
Arbeiten mit der Queue – mailq
Um sich den Inhalt der Queue und damit alle aktuell noch nicht ausgelieferten Mails anzeigen zu lassen, gibt es den Befehl mailq:
Listing 18.11 Der Befehl mailq
$ mailq
[...]
90m 19K 1ISaNw-00006x-Rd <bar@super-freemailer.com>
foo@example.com
[...]
Die wichtigsten Informationen sind hier die Message-ID sowie der Absender (bar@ super-freemailer.com) und der Empfänger (foo@example.com). Bei kleinen Mailservern sollte die Queue allerdings die meiste Zeit leer sein.
Queuerunner & Instant Delivery
Sollten trotzdem einmal große Queues (das ist die Warteschlange für Mails) auftreten, kann man einige Queuerunner anstoßen. Ein Queuerunner versucht, die aktuell in der Queue gespeicherten Mails auszuliefern:
Listing 18.12 Queuerunner
# exim4 -qf &
# exim4 -qf &
# exim4 -qf &
# exim4 -qf &
Da ein Queuerunner immer nur eine Mail zu einem bestimmten Zeitpunkt ausliefern will, ist es kein Problem, mehrere Queuerunner gleichzeitig zu starten, um die Auslieferungsgeschwindigkeit noch einmal zu erhöhen. Alternativ kann man aber auch eine bestimmte E-Mail über die Message-ID sofort ausliefern lassen:
Listing 18.13 Instant Delivery
# exim4 -M 1ISaNw-00006x-Rd
Die /etc/aliases
Ein weiterer wichtiger Bestandteil in der Arbeit mit einem Mailserver ist die Verwaltung der Aliase. Normalerweise wird eine einkommende E-Mail user@host.com – sofern host.com eine local_domain ist – dem Benutzer user zugestellt. Wenn man nun aber eine Adresse wie hans.mueller an den Account hans zustellen will, kommt die Datei /etc/aliases ins Spiel.
Die /etc/aliases-Datei hat ein einfaches Format: Links steht die »Quelle«, gefolgt von einem Doppelpunkt, rechts stehen ein oder mehrere, gegebenenfalls mit Kommas getrennte »Ziele«. Für den ominösen Hans Müller müsste man also eine Zeile wie die folgende einfügen:
Listing 18.14 Ein typischer Eintrag in der Datei /etc/aliases
hans.mueller: hans
Jedoch können über die Aliase auch andere Weiterleitungsziele gewählt werden:
- E-Mail-Adresse
Anstelle eines lokalen Users kann man als Empfänger auch eine entfernte E-Mail-Adresse angeben. Auf diese Weise lassen sich globale Weiterleitungen einrichten. - Pipe
Man kann als Ziel auch einfach eine Pipe zu einem Programm eintragen, das die Mail dann weiterverarbeitet. Auch eine Pipe nach /dev/null ist möglich. [Fn. Für eine Pipe muss aber prinzipiell ein Transport in der Exim-Konfiguration definiert sein – das ist leider nicht bei allen Default-Konfigurationen so. Speziell bei Debian (und seinen Abkömmlingen) müssen Sie das Paket exim-daemon-heavy installieren.]
Im Übrigen hat die Datei /etc/aliases ihren eigenen Router, der die Datei auswertet und gegebenenfalls den richtigen Transport aufruft.
Neue Konfigurationen testen
Sollten Sie doch einmal an Ihrer Konfiguration schrauben, bietet es sich, gerade bei produktiven Systemen, an, die neue Konfigurationsdatei vor dem Einsatz zu testen. Dabei helfen folgende Optionen, die man dem Exim-Programm übergeben kann:
- -C DATEI
Mit dieser Option lässt sich Exim eine alternative Konfigurationsdatei angeben. Da es wenig Sinn macht, eine bereits »live« gegangene Konfiguration im Nachhinein zu testen, sollte man diese Option immer mit einer der beiden folgenden Optionen kombinieren. - -bV
Überprüft die Konfigurationsdatei auf Fehler. - -bh IP
Mit dieser sehr nützlichen Option kann man eine SMTP-Sitzung simulieren, die von der angegebenen IP-Adresse kommt. Dazu gibt man wie bei einem telnet auf Port 25 alle SMTP-Befehle ein und sieht die genaue Abarbeitung der ACLs usw. in der Ausgabe.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.