13.2 SMTP-Server mit Exim
Im Folgenden wollen wir beschreiben, wie ein exim-SMTP-Server (http://www.exim.org) arbeitet und was man bei einem eigenen Betrieb beachten sollte. Dabei stellt sich natürlich die Frage: Warum exim und nicht Postfix, Sendmail oder einen anderen 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 nicht unwesentliche Rolle.
13.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 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 ist daher mindestens eine ACL nach dem »RCPT TO«-Kommando in SMTP-Protokoll aktiv, die Folgendes prüft:
- 1. Lokaler Empfänger
- Ob die Mail , wenn sie aus dem Internet kommt, für einen lokalen Empfänger empfängt bestimmt ist.
- 2. Empfänger im Internet
- Ob der Empfänger im Internet ist, die Mail von einem lokalen Absender kommt (der sich beispielsweise über Benutzername und Passwort authentifiziert hat).
Andernfalls wird die Mail oft verworfen. Macht man das nicht, können Spammer den eigenen 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 die eigenen, normalen Nicht-Spam-Mails annimmt.
Auch kann man das bereits vorgestellte Greylisting über eine ACL nach dem »RCPT TO«-Kommando und die Spam-Erkennung zur SMTP-Zeit über eine ACL nach dem »DATA«-Kommando abbilden. <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 dem Akzeptieren einer Message durch exim wird diese im Spooling-Verzeichnis abgelegt. Die Mail wird dazu in zwei Dateien aufgespalten, um den Header und den eigentlichen Mail-Inhalt zu trennen. <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. Der Hintergrund dafür sind Performance-Gedanken: Eine große Queue lässt sich leichter indexieren, wenn sie in kleine Teile aufgebrochen ist.
Routers und Transports
Die eigentliche Auslieferung übernehmen die Routers und Transports. Kurz gesagt, legt ein Router anhand der Empfängeradresse fest, wie eine Zustellung erfolgen soll – und 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 über eine E-Mail 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 die selbe Nachricht über unterschiedliche Transports verschickt wird – nämlich beispielsweise an einen lokalen und an einen entfernten Empfänger.
13.2.2 Exim installieren und konfigurieren
Für dieses Buch ist die eigentliche Konfiguration des Exim eher weniger interessant. Der Grund dafür ist zum einen, dass man auch mit einer weitgehenden Standardkonfiguration sehr weit kommt und damit auch eigene Server im Internet betreiben kann. Zum anderen ist jedoch die Syntax von Exim so komplex, dass man darüber ein eigenes Buch schreiben kann – und das auch tun muss, wenn man einigermaßen ins Detail gehen will. 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:
primary_hostname = foo.example.com
Listing 13.6 Der Mailname
Diese Änderung ist vor allem bei gemieteten Servern interessant, die standardmässig einen vom Provider vorgegebenen Namen tragen, mit dem sich der eigene Mailserver aber nicht unbedingt vorstellen sollte.
Lokale Domains
Lokale Domains sind alle Domains, 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:
domainlist local_domains = @
Listing 13.7 local_domains sehr lokal
Das @ bedeutet in diesem Fall wieder den lokalen Hostnamen. Möchte man aber nicht nur E-Mail-Adressen wie user@foo.example.com, sondern auch die »schönere« Form foo@example.com verwenden, muss man dem Exim an dieser Stelle mitteilen, dass er auch für diese Domain Mails annehmen soll:
domainlist local_domains = @ : example.com
Listing 13.8 local_domains etwas globaler
Weitere Domains, für die der Server E-Mails annehmen soll, müssen mit Doppelpunkt getrennt 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 lokal vorliegen, sondern an einen anderen Server weitergeleitet werden. 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 selbstverständlich werden entsprechende E-Mails unterschiedlich behandelt. <... nämlich entweder lokal zugestellt oder an einen anderen Rechner weitergesendet.>
domainlist relay_to_domains =
Listing 13.9 relay_to_domains
Ein weitere das Relaying betreffende Einstellung ist die relay_from_hosts-Liste. 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:
hostlist relay_from_hosts = 127.0.0.1
Listing 13.10 relay_from_hosts
Wie Sie vielleicht bemerkt haben, sind wir bisher allein auf Variablen eingegangen. Je nach Exim-Config können diese Variablen zwar theoretisch anders heißen oder ganz fehlen, jedoch sind diese rudimentären Listen in so ziemlich jeder Exim-Config 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 senden. Exim kann dabei unter anderem die Mails im MBox-Format <Eine große Datei, in der alle Mails stehen. 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 <Meist eine eigene Verzeichnisstruktur im Homeverzeichnis 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 dann relayen.
- Kein Open Relay
- Man kann es nicht oft genug betonen: Bitte überprüfen Sie vor einer Inbetriebname den Server gründlich daraufhin, ob er nicht vielleicht doch Spammern hilft, ihre potenziell 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 Sie bei diesem Test unterstützen können. <Googlen Sie doch einfach mal nach »Open Relay Test«.>
13.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 dieser Anwendungsfälle 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.
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
Listing 13.11 Auszug aus dem mainlog
In diesem Beispiel kann man folgenden Ablauf erkennen:
- 1. Ankunft der Mail
- Der Mailserver empfängt (»<=«) eine E-Mail mit dem Absender johannes@ploetner-it.de von der IP-Adresse 212.82.224.202. Diese Verbindung wird mittels TLS verschlüsselt, und der Authenticator login_server mit dem Usernamen jploetner wird benutzt. Die Mail hat die Message-ID 1ISYLX-0001Rm-N3.
- 2. 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.
- 3. Zweiter Empfänger
- Der erste Auslieferungsversuch an den zweiten Empfänger der Mail schlägt im ersten Versuch fehl: 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. <Und nebenbei ist das ein hübsches Beispiel für Greylisting.>
- 4. Completed
- Damit ist die Mail an alle Empfänger ausgeliefert, und somit kann die Message 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:
$ mailq [...] 90m 19K 1ISaNw-00006x-Rd <bar@super-freemailer.com> foo@example.com [...]
Listing 13.12 mailq
Die wichtigsten Informationen sind hier die Message-ID sowie Absender (bar@super-freemailer.com) und 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 auftreten, kann man einige Queuerunner anstoßen. Ein Queuerunner versucht, die aktuell in der Queue gespeicherten Mails auszuliefern:
# exim4 -qf & # exim4 -qf & # exim4 -qf & # exim4 -qf &
Listing 13.13 Queuerunner
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:
# exim4 -M 1ISaNw-00006x-Rd
Listing 13.14 Instant Delivery
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 /etc/aliases ins Spiel.
Die /etc/aliases hat ein einfaches Format: Links steht die »Quelle«, gefolgt von einem Doppelpunkt, rechts stehen ein oder mehrere, gegebenenfalls mit Komma getrennte »Ziele«. Für den ominösen Hans Müller müsste man also eine Zeile wie folgt einfügen:
hans.mueller: hans
Jedoch können über die Aliases auch andere Weiterleitungsziele gewählt werden:
- E-Mail-Adresse
- Anstatt an einen lokalen User kann man auch eine entfernte E-Mail-Adresse angeben. So können globale Weiterleitungen eingerichtet werden.
- 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. <Für eine Pipe muss aber prinzipiell ein Transport in der Exim-Konfiguration definiert sein – und 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 /etc/aliases ihren eigenen Router, der die Datei auswertet und gegebenenfalls den richtigen Transport aufruft.
Neue Konfigurationen testen
Und 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 kann man dem 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 den beiden Folgenden 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. im Output.