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.