Home       Servicebereich  Projekte  Kontakt  


Kurze Einführung in die Konfiguration von Sendmail

Martin Werthmöller

Der Autor übernimmt keinerlei Haftung für die Richtigkeit der Aussagen dieses Dokuments und nätürlich auch keinerlei Haftung für das Eintreten von Folgeschäden durch Anwendung dieser Doku.



Grundlegende Konfiguration

Der MTA Sendmail wird mit Hilfe der im folgenden beschriebenen Dateien konfiguriert. Die Grundkonfiguration erfolgt in der sendmail.cf, die in der Regel aber nicht direkt bearbeitet werden muß, sondern mit Hilfe von m4-Makros erzeugt wird. Die eigentlichen Anpassungen für einzelne Sites erfolgen in anderen Dateien.

Einige der dieser Configfiles müssen in ein .db Datenbankfile gewandelt werden. Dieses erfolgt mit Hilfe des Befehls makemap (bzw. newaliases)1. Nach Änderungen der Konfiguration muß der sendmail Prozeß veranlaßt werden, die Dateien neu einzulesen.


Datenfluß in Sendmail

Wenn eine Email von Sendmail verschickt wird, durchlaufen die Headerinformationen verschiedene Tests gegen die einzelnen Konfigruationsdateien. Nachfolgend ist der Datenfluß durch Sendmail dokumentiert.

 ankommende Mail
       |
       |
       |
       v       n                   Liste der Hosts (IP-Addr.)
   access.db ----->550             von denen Email akzeptiert,
       |                           bzw. weitergeleitet wird.
    y  |                          
       |                          
       v             n            
local-host-names ---------+        Liste der lokalen Domains
 (sendmail.cw)            |       
       |                  |       
    y  |                  |       
       |                  |       
       v                  |       
virtusertable.db          v        Zuordnung Emailadresse ->
       |                  |        mailboxname
    y  |                  |        anderer@neuedomain.org
       |                  |       
       v                  |       
   aliases.db ------>-----+        username: user@neuedomain.org
       |                  |        user: anderer, nocheiner
       |                  |       
       |                  |       
       |                  v        Weiterleitung f. Domain
       |             mailertable   <domain>   smtp:[IP-Addr.]
       |                  |        []->keine DNS-Abfr. f. Domain
       v                  |       
/var/spool/mail           |       
    (lokal)               |       
                          |       
                          |       
                          v        Envelope (Received: from.. by)
                genericstable.db   maskieren fuer:
                          |        user         nuser@neuedom.org
                          |        user@domain  nuser@neuedom.org
                          |
                          |
                          v
                    SMTP-Versand

Beschreibung der einzelnen Configdateien

/etc/mail/access(.db)
Wird Email von hier angenommen? Werden Emails für diese Domain weitergeleitet?
   makemap hash access < access

Beispiel:

  ----------------------------------------------------
  # /etc/mail/access
  #
  localhost        RELAY
  127.0.0.1        RELAY
                  
  ourdomain.de     RELAY
  192.168.1.1      RELAY
                  
  spammer.com      550     We don't accept spam
  ----------------------------------------------------

/etc/aliases(.db)
Übersetzung einer lokalen Empfängeradresse (in der Form username@sitename.de) in eine andere Adresse. Der Namensteil der Adresse entspricht einem in der /etc/passwd eingetragenen Usernamen.
   newaliases

Beispiel:

  ----------------------------------------------------
  # /etc/mail/aliases
  #
  root:         me@domain.com
  postmaster:   root
  
  admins:       me@domain.com, fellow@domain.com

  # append to file
  myboss:       /var/tmp/garbage

  # pipe mail to program
  info:         |/usr/local/bin/autoanswer.pl
  important:   "|/usr/local/bin/impmail important"
  ----------------------------------------------------

/etc/genericstable(.db)
Übersetzung der (lokalen) Senderadresse in eine andere Adresse.
   makemap hash genericstable < genericstable

Beispiel:

  ----------------------------------------------------
  # /etc/mail/genericstable
  #
  user                            user@absenderdomain.org
  user@localhost                  user@absenderdomain.org
  user@localhost.localdomain      user@absenderdomain.org
  ----------------------------------------------------

/etc/mailertable(.db)
Gibt es eine besondere Route zu diesem Host?
   makemap hash mailertable < mailertable

Beispiel:

  ----------------------------------------------------
  # mailertable
  #
  domain.org                      smtp:[nnn.xxx.yyy.zzz]
  host.domain.org                 smtp:[nnn.xxx.yyy.zzz]
  anotherdomain.org               smtp:smtp.another.org

  # create a smarthost 
  .                               smtp:smarthost.domain.com
  ----------------------------------------------------

/etc/virtusertable(.db)
Weiterleitung, bzw. behandlung einer (virtuellen) Emailadresse. Z.B. Einlieferung in eine loklale Mailbox (/var/spool/mail/<username>)oder eine Weiterleitung an einen andere Adresse.
   makemap hash virtusertable < virtusertable

Beispiel:

  ----------------------------------------------------
  # virtusertable
  #
  user@domain.org                 username
  anderer@andere.org              foo@bar.com
  @diesedomain.org                %1@anderedomain.com
  ----------------------------------------------------

Der Catch-all Eintrag muß nicht ans Ende der Datei geschrieben werden. Sendmail erkennt wählt den passendsten Eintrag aus.

/etc/sendmail.cw
Lokale Hostnamen, für die Mail angenommen und an einen User auf diesem System gesandt wird (kann über /etc/aliases) weitergeleitet werden. Die Datei wird bei neueren Versionen auch als /etc/mail/local-host-names gespeichert.

Beispiel:

  ----------------------------------------------------
  # /etc/mail/sendmail.cw
  #
  local.domain.net
  .domain.net
  my.domain.org
  ----------------------------------------------------

Prüfen der Sendmailkonfiguration

Die Konfiguration des Mailversands kann mit Hilfe des sendmail Programms überprüft werden. Es werden u.a. folgende Schalter genutzt:

sendmail -bv foo@bar.com
Überprüfung, ob die Emailadresse vom System bearbeitet werden kann. (Verify user)

Überprüfen der SMTP-Konfiguration

Die Kommunikation mit dem SMTP-Server kann bei sendmail mit verschiedenen Schaltern geprüft werden:
-bv
Zustellbarkeit (mailer) der Adresse prüfen
-bt
Testmodus für die Rulesets
-bi
Alias-DB neu konvertieren (wie newaliases)
-bp
Mailqueue anzeigen (wie mailq)
-v
Verbose (s.u.)
-X logfile
SMTP-Traffic loggen (s.u.)
-C
<file> Verwende fileanstatt sendmail.cf
-t
Lese von STDIN

Beispiel:

   eclipse:martin$ sendmail -v -t
   To: foo@bar.com
   From: baz@spam.com 
   Subject: Test mail
   Testline1
   Testline2
   ^D
   baz@spam.com... Connecting to smtp.bar.com. via smtp...
   220 smtp.bar.com ESMTP Sendmail 8.9.3/8.9.3; Wed, 26 Sep 2001 21:35:41 +0200
   >>> EHLO piggy.bar.com
   250-smtp.bar.com Hello piggy.bar.com [217.4.140.61], pleased to meet you
   250-8BITMIME
   250-SIZE 104857600
   250-DSN
   250-ONEX
   250-XUSR
   250 HELP
   >>> MAIL From: SIZE=72
   250 ... Sender ok
   >>> RCPT To:
   250 ... Recipient ok
   >>> DATA
   354 Enter mail, end with "." on a line by itself
   >>> .
   250 VAA05714 Message accepted for delivery
   foo@bar.com... Sent (VAA05714 Message accepted for delivery)
   Closing connection to smtp.bar.com.
   >>> QUIT
   221 smpt.bar.com closing connection

Direktes Prüfen der Rulesets

Die einzelnen Rulesets können wie oben schon gelistet mit sendmail -bt getestet werden. Anbei einige Beispiele:

Lokale Emaildomains
(local-host-names bzw. sendmail.cw)
  echo '$=w' | sendmail -bt'
Usernamen
(virtusertable)
  echo '/map access @meine-domain.de' | sendmail -bt
  echo '3,0 info@meine-domain.de' | sendmail -bt -d21.4

Die Tests können auch interaktiv durchgeführt werden:

sendmail -bt
# Ist die Domain in der class w?
$=w
# funktioniert das Virtusertable mapping?
/map virtuser joe@yourdomain.com
/map virtuser jane@yourdomain.com
/map virtuser @yourdomain.com
# und das Rewriting?
3,0 joe@yourdomain.com
3,0 some@yourdomain.com

Achtung:
Falls beim Test 3,0.. oder im Logfile festgestellt wird, daß sendmail anscheinend versucht, Email für einen lokalen Empfänger mit verdoppeltem Domaintail (die Domain mit einem Punkt angehängt wie: user@domain.de.domain.de) zuzustellen, sollte geprüft werden, ob der MX-Record auf diesen Host zeigt!


Traffic loggen

Mit Hilfe des Schalters -X /tmp/SMTP.log wird die komplette ein- und ausgehende SMTP-Kommunikation mit anderen Hosts in die Datei /tmp/SMTP.log geschrieben. Achtung: Erzeugt ein hohes Datenaufkommen und sollte daher nur für die Fehlersuche eingesetzt werden.

   /usr/sbin/sendmail -bd -X /tmp/SMTP.log

Erweiterte Konfigurationsoptionen

Die erweiterten Konfigurationsoptionen können in den Konfigurationsdateien (m4 oder sendmail.cf) eingetragen oder auch per Kommandozeilenschalte übergeben werden.


DaemonPortOptions

Mit Hilfe der Option DaemonPortOptions2 kann u.a. das Binden an einzelne Adressen konfiguriert werden. Um den Socket nur an ein lokales Interface zu binden wird je nach Konfiguration wie folgt vorgegangen:

Eintrag in den Konfigurationsdateien

Im m4 File werden Zeilen mit dem folgenden Aufbau eingefügt:

  DAEMON_OPTIONS(`field1=value1,field2=value2,...')

Um den Daemon an das lokale Interface 10.10.0.1 zu binden wird die folgende Zeile in die m4 Konfigurationsdatei eingetragen:

  DAEMON_OPTIONS(`Name=MTA, Addr=10.10.0.1')

Es können auch mehrere Adressen in der Form Addr=1.2.3.4, Addr=1.2.3.5 übergeben werden.

In der aus diesem Makrofile erzeugten sendmail.cf wird die Optionszeile

  # SMTP daemon options
  O DaemonPortOptions=Name=MTA, Addr=10.10.0.1
eingefügt.

Der Daemon ist jetzt nur an die Adresse 10.10.0.1 gebunden. Anfragen an Port 25 anderer lokal konfigurierter Adressen dieses Rechners werden nicht beantwortet.

Kommandozeilenschalter

Die Option kann auch über den Kommandozeilenschalter -O angegeben werden:
  border:cf# sendmail -bd -q20m -O DaemonPortOptions=Addr=192.168.1.1 \
  -O DaemonPortOptions=Addr=127.0.0.1


LogLevel

Das Logging kann mit Hilfe der Option LogLevel genau eingestellt werden. Der LogLevel ist in der Defaulteinstellung auf 9 eingestellt, kann aber mit Hilfe der Konfigurationsdatei oder einem Kommandozeilenschalter verändert werden:

Eintrag in den Konfigurationsdateien

Das m4 Makro
  define(`confLOG_LEVEL', `15')
stellt den LogLevel auf 15 ein. Es erzeugt einen Eintrag der Form
  # log level
  O LogLevel=15
in der sendmail.cf.

Kommandozeilenschalter

  border:cf# sendmail -bd -q20m -O LogLevel=15

Bedeutung der einzelnen LogLevels

Je nach eingestelltem LogLevel werden die Aktionen von sendmail unterschiedlich ausführlich in das Log geschrieben. Die einzelnen Werte habe folgende Bedeutung. Werte größer 64 sind für das Debugging des sendmail selbst reserviert und haben für den Produktionseinsatz keinen Sinn.

0
Minmales Logging.
1
Ernste Systemprobleme und potentielle Sicherheitsprobleme.
2
Kommunikationsprobleme und Protokollfehler.
3
Sonstige Probleme ernsterer Art wie mißgebildete Adressen, Timeouts oder vorübergehende I/O Fehler.
4
Leichtere Probleme wie veraltete Aliasfiles oder Zurückweisungen von Verbindungsaufbauten via check_rulesets.
5
Zusammengefaßte Statistiken über den Nachrichtenverkehr.
6
Anzeigen von Fehlermeldungen, VRFY und EXPN Kommandos.
7
Auslieferungsprobleme (host oder user nicht bekannt, etc.).
8
Erfolgreiche Auslieferungen und konvertierungen von Alias-Dateien.
9
Verschobene (deferred) Nachrichtenauslieferung (Host des Empängers temporär nicht erreichbar).
10
Datenbankzugriffe (alias, forward und userdb) und Authentifizierungsinformationen.
11
NIS Fehler und ``end of job processing''.
12
Logging der kompletten SMTP Verbindungen.
12
Anzeige von fraglichen Situationen wie falsche User-shells, Dateien mit ungeeigneten Zugriffsrechten
14
Abgelehnte Verbindungsaufbauten.
15
Logging aller ein- und ausgehenden SMTP-Kommandos.
20
Versuche, gelockte Queue-Files zu verschicken. Keine Fehler, jedoch evtl. nützlich bei der Fehlersuche.
30
Verlorene Locks (bei Nutzung von lockf anstatt flock).


MaxMessageSize

Die maximale Größe einer Nachricht (in Byte) kann mit der Option MaxMessageSize eingestellt werden. Wenn die Größe, die bei der ESMTP HELO Antwort übermittelt wird, größer ist als dieser Wert, wird die Annahme zurückgewiesen.

Eintrag in den Konfigurationsdateien

Das m4 Makro
  define(`confMAX_MESSAGE_SIZE', `10000000')
stellt die Größe auf 10MB ein und erzeugt folgenden Eintrag
  # maximum message size
  O MaxMessageSize=10000000
in der sendmail.cf.

Kommandozeilenschalter

  border:cf# sendmail -bd -q20m -O MaxMessageSize=10000000

Weitere Befehle und Optionen


mailq

Die Queue kann mit dem Befehl mailq angezeigt werden. Bei großen Queues kann es sinnvoll sein, die Anzeige zu filtern. Hierzu stehen 3 Schalter zur Verfügung:
mailq -qI
Filtert die Queue-ID: mailq -qIKAA32296
mailq -qS
Filtert den Absender mailq -qS root
mailq -qR
Filtert den Empfänger mailq -qS @werthmoeller.de. Anstatt der vollen Emailadresse kann auch nur der Host-Anteil angebeben werden, um alle Empfänger einer einzelnen Domain aufzulisten.


sendmail

Der Befehl sendmail kann mit etlichen Schaltern aufgerufen werden. Hiermit kann eine Statusanzeige erfolgen oder z.B. die Queue manuell zur Auslieferung angestoßen werden.

sendmail -q

Der Schalter -q erzwingt die Auslieferung der Queue. Diverse Optionen schränken den Befehl auf Teilbereiche der Queue ein.
sendmail -qI
Filtert die Queue-ID: sendmail -qIKAA32296
sendmail -qS
Filtert den Absender sendmail -qSroot
sendmail -qR
Filtert den Empfänger sendmail -qS@werthmoeller.de. Anstatt der vollen Emailadresse kann auch nur der Host-Anteil angebeben werden, um alle Empfänger einer einzelnen Domain aufzulisten.

< zurück  | weiter >