Unix: sendmail
sendmail ist ein bekannter MTA (mail transport agent), der den Transport von EMails ermöglicht und kontrolliert. Da sendmail sehr universell und mächtig ist, ist die Konfiguration ebenso umfangreich. Der einfachste Weg ist das Nutzen der beigelegten m4-Macros. Aktuell ist die Version 8.14.x. Ich empfehle eine aktuelle Version zu nehmen, da dort viele Sicherheitslöcher beseitigt wurden und auch der Relay-Schutz integriert ist.
Der sendmail ist primär für Mail-Server gedacht, die 24h direkt im/am Internet erreichbar sind, da er fleißig Nameserver-Abfragen tätigt. Zum einen fragt er Nameserver nach den MX-Einträgen von Domains, um zu wissen an welche Mail-Server er Mails für bestimmte Domains senden soll. Und zum anderen macht er Reverse Lookups bei Verbindungen mit Clients und Servern. Mit ein paar Tricks kann man ihn auch hervorragend offline betreiben, z.B. für UUCP. Diese Seite bezieht sich auf die Version 8.12.x. Bei den vorherigen Versionen hatten die Konfigurationsdateien teilweise andere Namen. Also aufpassen!
Übersicht
Übersetzen
Das Übersetzen geht recht problemlos. Als erstes das Archiv auspacken und das geliebte README lesen. Evtl. müssen Sie in manchen Source-Files alle # include <db.h> durch # include <db/db.h> ersetzen (nur bei älteren sendmail-Versionen - hängt auch von den Includes Deines Systems ab). Mit einem grep sind die entspr. Dateien schnell gefunden. Nach dem Übersetzen befinden sich die Executables in den Verzeichnissen der einzelnen Tools unter obj-...
| Programm> | Beschreibung |
|---|---|
| sendmail | MTA |
| smrsh | sendmail restricted shell |
| makemap | ASCII-Liste als DB-File schreiben |
| mail.local | lokaler delivery agent |
| rmail | für UUCP |
Installieren
Der typische Ort für sendmail ist /usr/lib/sendmail. Zusätzlich kann man Links auf /usr/bin/sendmail und /bin/sendmail setzen. Die smrsh kann überall liegen, vernünftig ist sicher /usr/sbin/ oder /usr/local/sbin. Da gleiche gilt für die weiteren Tools. Im Source gibt es das Verzeichnis cf/, welches die m4-Makros enthält. Das cf/ können Sie irgendwo hin kopieren, z.B. /usr/lib/sendmail.cf/.
Die smrsh ist eine spezielle Shell, die das Ausführen nur von bestimmen Programmen via Aliases-Datei und Co erlaubt. Dazu legien Sie /usr/lib/sm.bin (kann im Source geändert werden) an und kopieren alle Programme in das Verzeichnis oder setzen dort Sym-Links auf die Programme. Typische Vertreter sind procmail oder majordomo.
Konfig-Dateien
Bevor wir an die Konfiguration gehen, möchte ich zuerst einige Konfig-Dateien vorstellen. Die meisten Dateien kann man nach Belieben umbenennen. Daher nehme ich die üblichen Namen.
sendmail.cf
Die zentrale Konfig-Datei von sendmail ist /etc/sendmail.cf. Dort werden alle Optionen, Regeln und Pfade für andere Dateien festgelegt. Die sendmail.cf wird von den m4-Makros erzeugt. Per Hand können Sie diese natürlich auch bearbeiten :-) Für die zusätzlichen Konfig-Files empfehle ich /etc/mail/.
trusted-users (sendmail.ct)
In der trusted-users werden sogenannte "trusted users" eingetragen. Das sind User mit besonderen Rechte, die z.B. die From-Adresse ändern dürfen. Die Datei könnte so aussehen:
# trusted users majordom slist
local-host-names (sendmail.cw)
Die local-host-names gibt die Liste der Domains an, für welche sich sendmail zuständig fühlt, z.B.:
thecat.lahn.de meine-andere-domain.com
aliases
In aliases können Sie lokale Aliases, einfache Verteiler oder auch auszuführende Programme eintragen:
# # /etc/mail/aliases # # wichtig! postmaster: userx # Verteiler alle: userx, walter, willi # Mailingliste majordomo: "|/usr/local/majodomo/wrapper"
relay-domains
Die Datei relay-domains regelt für welche Domains unser sendmail EMail annimmt bzw. zwischenlagert. Wenn z.B. ein Bekannter die Domain blub.de hat und sein Mail-Server ausfällt, soll unser Mail-Server seine Post zwischenlagern bis der Mail-Server des Bekannten wieder läuft und die EMail annehmen kann. Warum der Aufwand? Der Mail-Server muß sicher gegen EMail-Spammer sein, d.h. unerwünschte Dritte können unseren Mail-Server nicht benutzen, um Millionen von Werbe-Mails an wiederum andere zu versenden. Aber die EMails an die eingetragenen Domains werden angenommen, auch Werbe-Mails :-) Beispiel:
lahn.de domain-von-freund.de
access
Mit der Datei access kann die Benutzung des Mail-Servers für bestimmte Domains oder IP-Adressen/Netze geregelt werden. Im folgenden Beispiel geben wir unseren Mail-Server für sich selber und für ein privates Netz frei:
# # /etc/mail/access # Domains and IP addresses for which we accept or deny relaying. # 127.0.0.1 RELAY 10.0.0 RELAY
mailertable
Für spezielles Mail-Routing gibt es die mailertable. Für einen UUCP-Knoten könnte folgendes konfiguriert sein:
# # mailertable # host1.lahn.de uucp-dom:host1 host2.lahn.de uucp-dom:host2 host3.lahn.de uucp-dom:bighost host4.lahn.de uucp-dom:bighost host5.lahn.de uucp-dom:bighost bighost.lahn.de uucp-dom:bighost
Hier wird für UUCP-Hosts das Routing via UUCP eingetragen. Hinter bighost hängen die Hosts host3 bis host5, d.h. die Post für diese Systeme muß über bighost laufen.
virtusertable
Falls Sie virtuelle Domains verwalten möchten, ist die Datei virtusertable wichtig. Dort tragen Sie ein, welche virt. EMail-Adresse auf welchen lokalen User oder externe Adresse geleitet wird:
# einzelne Adressen auf lokale User leiten user1@virtuelle-domain.de willi user2@virtuelle-domain.de walter # externe Adresse user3@virtuelle-domain.de madires@woanders.de # restliche, unbekannte Empfänger auf einen User leiten @virtuelle-domain.de walter # komplette Post einer Domain auf einen User leiten @virtual-domain.com madires@woanders.de # Mails einer Domain auf gleiche User in einer anderen Domain leiten @virtuelle-domain.ch %1@virtual-domain.org
genericstable & sendmail.cG
Die genericstable und sendmail.cG sorgen für die Rück-Umsetzung von Adressen lokaler User. Wenn Sie Ihren Usern vertrauen, können Sie darauf verzichten. Aber falls Sie zwangsweise die Absenderadressen ändern möchten, damit Ihre User keinen Unfug mit ihren Adressen treiben, dann sind sind Sie hier genau richtig. In der sendmail.cG trägt man die Domains ein, für welche die Rückumsetzung erfolgen soll:
virtuelle-domain.de virtual-domain.com
Und in der Datei genericstable stehen die Rückumsetzungen:
# genericstable willi user1@virtuelle-domain.de walter user2@virtuelle-domain.de
Die User willi und walter können beliebige Adressen in ihren Mail-Clients eintragen. Die Adressen werden immer durch die obigen ersetzt.
Konfigurieren
Den sendmail sollte man über die m4-Macros konfigurieren. Dazu gehen wir in das cf-Verzeichnis und legen eine mc-Datei für unser System an. Vorher unbedingt die Datei README lesen. Dort sind alle Macros erklärt. Für ein UUCP-System (Name thecat.lahn.de, Smarthost netserv) könnte die mc-Datei (hier: thecat.mc) etwa so aussehen:
divert(-1) # # sendmail thecat.mc # (c) 1999 by Markus Reschke # divert(0) VERSIONID(`@(#)thecat.mc 1.0 1999-02-14') OSTYPE(debian)dnl # defines define(SMART_HOST, uucp-dom:netserv)dnl define(`LOCAL_MAILER_PATH', `/usr/sbin/mail.local')dnl define(`LOCAL_MAILER_FLAGS', `9nES')dnl define(`LOCAL_MAILER_ARGS', `mail.local $u')dnl define(`LOCAL_SHELL_FLAGS', `u9')dnl define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl define(`ALIAS_FILE', `/etc/mail/aliases')dnl define(`STATUS_FILE', `/var/log/sendmail.st')dnl define(`confCW_FILE', `-o /etc/mail/local-host-names')dnl define(`confCT_FILE', `-o /etc/mail/trusted-users')dnl define(`UUCP_MAILER_MAX', `5000000')dnl define(`confPRIVACY_FLAGS', `novrfy, noexpn, authwarnings')dnl # local LOCAL_CONFIG Cwthecat.lahn.de MASQUERADE_AS(thecat.lahn.de)dnl # features FEATURE(nocanonify)dnl FEATURE(masquerade_envelope)dnl FEATURE(always_add_domain)dnl FEATURE(use_cw_file)dnl FEATURE(use_ct_file)dnl FEATURE(nodns)dnl FEATURE(smrsh, `/usr/sbin/smrsh')dnl FEATURE(mailertable, `hash -o /etc/mail/mailertable')dnl FEATURE(access_db, `hash /etc/mail/access')dnl # mailers MAILER(local)dnl MAILER(smtp)dnl MAILER(uucp)dnl
Mit dem Befehl (cf-Dir ist /usr/lib/sendmail.cf)
m4 /usr/lib/sendmail.cf/m4/cf.m4 thecat.mc > sendmail.cf
läßt sich die sendmail.cf generieren, die anschließend nach /etc kopiert wird. Danach ist der sendmail neu zu starten bzw. können Sie ihm auch ein kill -HUP senden. Oder Sie schreiben sich schnell ein Makefile:
#
# Makefile for sendmail.cf
# (c) 1999 by Markus Reschke
CFDIR=/usr/lib/sendmail.cf
all: cf
.PHONY: all
cf: thecat.mc
m4 ${CFDIR}/m4/cf.m4 thecat.mc > sendmail.cf
chmod 444 sendmail.cf
cp sendmail.cf /etc/mail
cp thecat.mc /etc/mail/sendmail.mc
/etc/init.d/sendmail reload
#
# Extras
#
.PHONY: clean
clean:
rm -f sendmail.cf
Administration
Sendmail liefert mehrere Tools mit.
makemap
Das Administrieren von sendmail läuft hauptsächlich über die vielen Konfig-Dateien, in welche neue Domains oder User eingetragen werden. Bei Files mit DB-Format immer nach Änderungen der zugehörigen ACSII-Dateien mit makemap eine aktuelle DB-Datei erzeugen, z.B.:
makemap -v hash /etc/mail/mailertable < /etc/mail/mailertable
Tip: kleines Shell-Script schreiben, das automatisch alle DB-Files erzeugt.
DNS
Bei UUCP-Systemen macht die Namensauflösung, die sendmail immer durchführen will, Probleme. Daher sollten Sie alle in der Konfiguration benutzten Rechnernamen in der /etc/hosts eintragen. Evtl. macht es auch Sinn einen lokalen Nameserver einzurichten, dem die Liste der Root-Nameserver fehlt.
Testen
Mit
sendmail -bv <email-adresse>
können Sie EMail-Adressen testen (wie sendmail diese routen würde). Ein interaktives Debugging ist mit sendmail -bt möglich. Einige Informationen lassen sich auch den Log-Dateien, meist unter /var/log, ziehen.
Testen 2
Mit etwas Kenntnis des SMTP läßt sich ein Mailserver auch von aussen testen, z.B. ob der Relay-Schutz funktioniert. Dazu erstmal ein telnet auf Port 25 des Mailservers starten (alles mit <...> durch richtige Angaben ersetzen):
telnet <mailserver> 25
Nun starten Sie eine EMail. Nach jeder Eingabe gibt der Mailserver eine Antwort (ein OK oder eine Fehlermeldung).
HELO <Hostname Deines Rechners> MAIL FROM: <EMail-Adresse des Senders> RCPT TO: <EMail-Adresse des Empfängers> QUIT
Anhand der Antworten des Mailservers haben Sie schnell herausgefunden, ob die Konfiguration funktioniert.

