Copyright © 1996 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux: Wegweiser durch das Netzwerk" dann klicken Sie hier.


Anhang B
Beispiel-Konfigurationsdateien für smail

Dieser Anhang enthält Beispiel-Konfigurationsdateien für eine UUCP-Leafsite (ein Host, der ein LAN über UUCP mit Mail versorgt) in einem lokalen Netzwerk. Die Dateien basieren auf den Beispielen, die in der Source-Distribution von smail-3.1.28 enthalten sind. Ich habe den kläglichen Versuch unternommen, Ihnen zu erklären, wie diese Dateien arbeiten, Sie sind aber gut beraten, wenn Sie sich die sehr gute smail(8)-Manpage ansehen, die diese Dateien sehr ausführlich beschreibt. Haben Sie erst einmal die grundlegende Idee hinter der smail-Konfiguration verstanden, lohnt es sich, dieses Dokument zu lesen. Es ist ganz einfach!

Die erste abgedruckte Datei ist die routers-Datei, die smail eine Reihe von Routern beschreibt. Muß smail eine Nachricht an eine gegebene Adresse liefern, wird diese Adresse der Reihe nach an alle Router übergeben, so lange, bis einer paßt. »Passen« bedeutet hier, daß der Router den Zielhost in seiner Datenbank findet, sei es in der paths-Datei, in /etc/hosts, oder welcher Routing-Mechanismus auch immer verwendet wird.

Einträge in smail-Konfigurationsdateien beginnen immer mit einem eindeutigen Namen, der den Router, Transport oder Direktor bestimmt. Darauf folgt eine Liste mit Attributen, die das entsprechende Verhalten definieren. Die Liste besteht aus einer Reihe globaler Attribute, wie dem verwendeten driver, und privaten Attributen, die nur von dem jeweiligen Driver verstanden werden. Attribute werden durch Kommata, globale und private Attribute hingegen jeweils durch ein Semikolon voneinander getrennt.

Um diese feine Unterscheidung zu verdeutlichen, stellen Sie sich vor, Sie wollen zwei separate pathalias-Dateien verwalten; eine enthält die Routing-Information für Ihre Domain, und die zweite enthält globale Routing-Informationen, die möglicherweise aus den UUCP-Maps generiert wurden. Mit smail können Sie nun zwei Router in Ihre routers-Datei eintragen, die beide den pathalias-Driver verwenden. Dieser Treiber durchsucht eine pathalias-Datenbank nach Hostnamen. Es wird erwartet, daß der Dateiname in einem privaten Attribut angegeben wird:

#
# pathalias-Datenbank zum Routen innerhalb der Domain
domain_paths:
        driver=pathalias,         # suche Host in Pfaddatei
        transport=uux;            # wenn vorhanden, über UUCP ausliefern
        file=paths/domain,        # Datei ist /usr/lib/smail/paths/domain
        proto=lsearch,            # Datei ist nicht sortiert (lineare Suche)
        optional,                 # ignorieren, wenn Datei nicht existiert
        required=vbrew.com,       # nur nach *.vbrew.com-Hosts suchen
#
# pathalias-Datenbank zum Routen auf Hosts außerhalb der Domain
world_paths:
        driver=pathalias,         # suche Host in Pfaddatei
        transport=uux;            # wenn vorhanden, über UUCP ausliefern
        file=paths/world,         # Datei ist /usr/lib/smail/paths/world
        proto=bsearch,            # Datei ist mit sort(1) sortiert
        optional,                 # ignorieren, wenn Datei nicht existiert
        -required,                # keine Domains benötigt
        domain=uucp,              # entferne vor der Suche das ".uucp" am Ende

Das zweite globale Attribut, das in beiden oben aufgeführten routers-Einträgen verwendet wird, definiert den sog. Transport, d. h. wie die Daten weitergeleitet werden, wenn der Router die passende Adresse findet. In unserem Fall wird die Nachricht mit dem uux-Transport ausgeliefert. Transports werden in der Datei transports definiert, die noch beschrieben wird.

Sie können genauer bestimmen, mit welchem Transport eine Nachricht ausgeliefert wird, indem Sie eine Methodendatei anstelle des transports-Attributs verwenden. Methodendateien ermöglichen die Abbildung von Ziel-Hostnamen auf Transports. Wir gehen an dieser Stelle aber nicht weiter darauf ein.

Die folgende routers-Datei definiert Router für ein lokales Netz, die die Resolver-Library abfragen. Allerdings würden Sie auf einem Internet-Host einen Router konfigurieren, der MX-Records verarbeiten kann. Zu diesem Zweck sollten Sie die Kommentarzeichen vor dem alternativen inet_bind-Router entfernen, der den eingebauten BIND-Driver von smailverwendet.

In einer Umgebung, in der UUCP und TCP/IP gemeinsam genutzt werden, könnten Sie mit dem Problem konfrontiert werden, daß sich Hosts in Ihrer /etc/hosts-Datei befinden, mit denen Sie nur gelegentlich über SLIP oder PPP Kontakt haben. Normalerweise wollen Sie in solchen Fällen Mail immer noch über UUCP versenden. Um zu verhindern, daß der inet_hosts-Driver diese Hosts prüft, müssen Sie sie in die paths/force-Datei eintragen. Das ist eine weitere pathalias-ähnliche Datenbank, die durchsucht wird, bevor smail den Resolver abfragt.

# Eine /usr/lib/smail/routers-Beispieldatei
#
# force -- erzwinge UUCP-Auslieferung an bestimmte Hosts, selbst wenn sie
#       in unserer /etc/hosts stehen
force:
        driver=pathalias,         # suche Host in Pfaddatei
        transport=uux;            # wenn vorhanden, über UUCP ausliefern
        file=paths/force,         # Datei ist /usr/lib/smail/paths/force
        optional,                 # ignorieren, wenn Datei nicht existiert
        proto=lsearch,            # Datei ist nicht sortiert (lineare Suche)
        -required,                # keine Domains benötigt
        domain=uucp,              # entferne vor der Suche das ".uucp" am Ende
# inet_addrs -- überprüfe Domain-Namen, die literale
#       IP-Adressen wie in janet@[172.16.2.1] enthalten
inet_addrs:
        driver=gethostbyaddr,     # Driver zur Prüfung von IP-Domainliteralen
        transport=smtp;           # Auslieferung mit SMTP über TCP/IP
        fail_if_error,            # Fehler, wenn Adreßformat nicht korrekt
        check_for_local,          # sofort ausliefern, wenn lokaler Host
# inet_hosts -- prüfe Hostnamen mit gethostbyname(3N)
#       kommentieren Sie diese Zeilen aus, wenn Sie die BIND-Version verwenden 
        wollen 
inet_hosts:
        driver=gethostbyname,     # prüfe Hosts mit Hilfe der Library-Funktion
        transport=smtp;           # SMTP verwenden
        -required,                # keine Domains benötigt
        -domain,                  # keine Domainendungen definiert
        -only_local_domain,       # nicht auf definierte Domains beschränken
# inet_hosts -- alternative Version, die BIND verwendet, um auf DNS zuzugreifen
#inet_hosts:
#       driver=bind,              # eingebauten BIND-Driver verwenden
#       transport=smtp;           # mit TCP/IP-SMTP ausliefern
#
#       defnames,                 # normale Domain-Suche verwenden
#       defer_no_connect,         # neuer Versuch, wenn Name-Server down ist
#       -local_mx_okay,           # MX nicht an lokalen Host weiterleiten
#
# pathalias-Datenbank zum Routen innerhalb der Domain
domain_paths:
        driver=pathalias,         # suche Host in Pfaddatei
        transport=uux;            # wenn vorhanden, über UUCP ausliefern
        file=paths/domain,        # Datei ist /usr/lib/smail/paths/domain
        proto=lsearch,            # Datei ist nicht sortiert (lineare Suche)
        optional,                 # ignorieren, wenn Datei nicht existiert
        required=vbrew.com,       # nur nach *.vbrew.com-Hosts suchen
#
# pathalias-Datenbank zum Routen auf Hosts außerhalb der Domain
world_paths:
        driver=pathalias,         # suche Host in Pfaddatei
        transport=uux;            # wenn vorhanden, über UUCP ausliefern
        file=paths/world,         # Datei ist /usr/lib/smail/paths/world
        proto=bsearch,            # Datei ist mit sort(1) sortiert
        optional,                 # ignorieren, wenn Datei nicht existiert
        -required,                # keine Domains benötigt
        domain=uucp,              # entferne vor der Suche das ".uucp" am Ende
# smart_host -- ein teilweise spezifizierter Smart Host-Direktor
#       ist das Attribut smart_path nicht in /usr/lib/smail/config
#       definiert, wird dieser Router ignoriert.
#       das Transport-Attribut wird durch die globale
#       smart_transport-Variable überschrieben
smart_host:
        driver=smarthost,         # Spezial-Driver
        transport=uux;            # Standard-Auslieferung über UUCP
        -path,                    # verwende smart_path Konfigurationsdatei-
                                  # Variable

Die Behandlung von Mail für lokale Adressen wird in der Datei directors festgelegt. Diese ist genauso aufgebaut wie die routers-Datei und enthält eine Liste von Einträgen, die jeweils einen Direktor definieren. Direktors liefern keine Nachrichten aus, sondern führen nur alle möglichen Umleitungen über Aliases, Mail-Forwarding und ähnliches durch. like.

Wird Mail an eine lokale Adresse wie beispielsweise janet geliefert, gibt smail den Benutzernamen an alle aktiven Direktors weiter. Ist ein Direktor erfolgreich, bestimmt er entweder einen Transport, über den die Nachricht ausgeliefert werden soll (z. B. die Mailbox-Datei des Benutzers), oder er generiert eine neue Adresse (beispielsweise nach der Auswertung eines Aliases).

Aus Sicherheitsgründen führen Direktors viele Überprüfungen durch, die ermitteln sollen, ob eine Datei sicher ist oder nicht. Adressen, die auf etwas dubiose Weise gefunden wurden (beispielsweise aus einer allgemein schreibbaren aliases-Datei), werden als unsicher markiert. Manche Driver weisen solche Adressen zurück, wie beispielsweise der Transport, der Nachrichten an Dateien liefert.

Darüber hinaus assoziiert smail auch einen Benutzer mit jeder Adresse. Alle Schreib-/Leseoperationen werden im Namen dieses Benutzers durchgeführt. Für die Auslieferung in die Mailbox von janet wird die Adresse natürlich auch mit janet assoziiert. Andere Adressen, wie die aus der aliases-Datei, assoziieren andere Benutzer, beispielsweise den Benutzer nobody.

Die Details dieser Features entnehmen Sie bitte der smail(8)-Manpage.

# Eine /usr/lib/smail/directors-Beispieldatei
# aliasinclude -- löse aus Alias-Dateien erzeugte ":include:filename"-Adressen 
# auf
aliasinclude:
        driver=aliasinclude,    # verwende Spezial-Driver
        nobody;                 # greife als Benutzer "nobody" auf Datei zu, 
                                # wenn unsicher
        copysecure,             # übernehme Rechte von Alias-Direktor
        copyowners,             # übernehme Besitzer von Alias-Direktor
# forwardinclude -- löse aus Forward-Dateien erzeugte
#       ":include:filename"-Adressen auf
forwardinclude:
        driver=forwardinclude,    # verwende Spezial-Driver
        nobody;                   # greife als Benutzer "nobody" auf Datei zu, 
                                  # wenn unsicher
        checkpath,                # prüfe Zugriff auf Pfad
        copysecure,               # übernehme Rechte vom Forwarding-Direktor
        copyowners,               # übernehme Besitzer vom Forwarding-Direktor
# aliases -- suche nach in der Datenbank gespeicherten Alias-Auflösungen
aliases:
        driver=aliasfile,         # Allzweck-Aliasing-Direktor
        -nobody,                  # alle Adressen sind per Voreinstellung
                                  # bereits mit nobody assoziiert
        sender_okay,              # Sender aus Erweiterungen nicht entfernen
        owner=owner-$user;        # Probleme an Benutzeradresse melden
        file=/usr/lib/aliases,    # Voreinstellung: sendmail-Kompatibilität
        modemask=002,             # sollte nicht allgemein geschrieben werden 
                                  # können
        optional,                 # ignorieren, wenn Datei nicht existiert
        proto=lsearch,            # unsortierte ASCII-Datei
# dotforward -- löse .forward-Dateien im Home-Verzeichnis des Benutzers auf
dotforward:
        driver=forwardfile,       # Allzweck-Forwarding-Direktor
        owner=real-$user,         # Probleme an Benutzer-Mailbox melden
        nobody,                   # Benutzer ist nobody, wenn unsicher
        sender_okay;              # Sender niemals aus Erweiterungen entfernen
        file=~/.forward,          # .forward-Datei im Home-Verzeichnis
        checkowner,               # Benutzer kann diese Datei besitzen
        owners=root,              # aber auch root kann diese Datei besitzen
        modemask=002,             # sollte nicht allgemein geschrieben werden 
                                  # können
        caution=0-10:uucp:daemon, # nicht als root oder Daemon
        # besondere Vorsicht bei Home-Verzeichnissen auf entfernten Rechnern
        unsecure="~ftp:~uucp:~nuucp:/tmp:/usr/tmp",
# forwardto -- löse "Forward to "-Zeile zu Beginn
#       der Mailbox-Datei eines Benutzers auf
forwardto:
        driver=forwardfile,
        owner=Postmaster,         # Fehler an Postmaster melden
        nobody,                   # Benutzer ist nobody, wenn unsicher
        sender_okay;              # Sender aus Erweiterungen nicht entfernen
        file=/var/spool/mail/${lc:user}, # Position der Benutzer-Mailbox
        forwardto,                # aktiviere "Forward to "-Prüfung
        checkowner,               # Benutzer kann diese Datei besitzen
        owners=root,              # aber auch root kann diese Datei besitzen
        modemask=0002,            # Unter System V kann Group-Mail schreiben
        caution=0-10:uucp:daemon, # nicht als root oder Daemon
# user -- überprüfe Benutzer auf dem lokalen Host mit Lieferung zu deren 
#       Mailboxen
user:   driver=user;              # Driver zur Prüfung der Benutzernamen
        transport=local,          # lokaler Transport erfolgt in Mailboxen
# real_user -- überprüfe Benutzernamen, wenn der Prefix mit dem String 
#       "real-" beginnt
real_user:
        driver=user;              # Driver zur Prüfung der Benutzernamen
        transport=local,          # lokaler Transport erfolgt in Mailboxen
        prefix="real-",           # Prüfe z. B. "real-root"
# lists -- löse Mailing-Listen auf, die unter /usr/lib/smail/lists 
#       gespeichert sind
lists:  driver=forwardfile,
        caution,                  # alle Adressen sind mit Vorsicht zu genießen
        nobody,                   # und mit dem Benutzer nobody assoziiert
        sender_okay,              # Sender NICHT entfernen
        owner=owner-$user;        # Besitzer der Liste
        # wandele den Namen der Mailing-Liste in Kleinbuchstaben
        file=lists/${lc:user},

Wurde eine Nachricht erfolgreich geroutet oder geleitet, übergibt smail die Nachricht an den vom Router oder Direktor spezifizierten Transport, der die Adresse prüft. Diese Transports sind in der Datei transports definiert. Auch ein Transport wird durch eine Reihe globaler und privater Optionen definiert.

Die wichtigste Option, die in jedem Eintrag definiert wird, ist der Driver, der den Transport übernimmt. Dazu gehört beispielsweise der Driver pipe, der den im cmd-Attribut angegebenen Befehl ausführt. Darüber hinaus gibt es eine ganze Reihe globaler Attribute, die vom Transport verwendet werden können, um den Nachrichten-Header und möglicherweise den -Body umzuwandeln. Beispielsweise läßt das Attribut return_path den Transport ein Return-Path-Feld in den Header einfügen. Durch das Attribut unix_from_hack wird jeder Zeile, die mit dem Wort From beginnt, ein >-Zeichen vorangestellt.

# Eine /usr/lib/smail/transports-Beispieldatei
# local -- Mail an lokale Benutzer ausliefern
local:  driver=appendfile,        # Nachricht an Datei anhängen
        return_path,              # Return-Path:-Feld einfügen
        from,                     # From_-Zeile verwenden
        unix_from_hack,           # > vor From im Body einfügen
        local;                    # lokale Forms verwenden
        file=/var/spool/mail/${lc:user}, # Position der Mailbox-Dateien
        group=mail,               # Besitzergruppe für System V
        mode=0660,                # Gruppe, auf die die Mail zugreifen kann
        suffix="\n",              # Extra-Zeilenvorschub anhängen
# pipe -- Mail an Shell-Befehle weiterleiten
pipe:   driver=pipe,              # Nachricht an anderes Programm pipen
        return_path,              # Return-Path:-Feld einfügen
        from,                     # From_ -Zeile verwenden
        unix_from_hack,           # > vor From im Body einfügen
        local;                    # lokale Forms verwenden
        cmd="/bin/sh -c $user", # Adresse an Bourne Shell
        parent_env,               # Umgebungsinfo von Parent-Adresse
        pipe_as_user,             # mit Benutzer-ID assoziierte Adresse 
                                  # verwenden
        ignore_status,            # Exit-Status ungleich 0 ignorieren
        ignore_write_errors,      # Schreibfehler ignorieren (gebrochene Pipe)
        umask=0022,               # umask für Child-Prozeß
        -log_output,              # stdout/stderr nicht loggen
# file -- Mail in Dateien liefern
file:   driver=appendfile,
        return_path,              # Return-Path:-Feld einfügen
        from,                     # From_-Zeile verwenden
        unix_from_hack,           # > vor From im Body einfügen
        local;                    # lokale Forms für Lieferung verwenden
        file=$user,               # Datei wird aus Adresse genommen
        append_as_user,           # verwende mit Benutzer-ID assoziierte Adresse
        expand_user,              # löse ~ und $ innerhalb der Adresse auf
        suffix="\n",              # Extra-Zeilenvorschub anhängen
        mode=0600,                # Zugriffsrechte auf 600 setzen
# uux -- an rmail-Programm an einer entfernten UUCP-Site weiterleiten
uux:    driver=pipe,
        uucp,                     # UUCP-Adreßformate verwenden
        from,                     # From_-Zeile verwenden
        max_addrs=5,              # maximal 5 Adressen pro Aufruf
        max_chars=200;            # maximal 200 Zeichen für Adressen
        cmd="/usr/bin/uux -- -r -a$sender -g$grade $host!rmail $(($user)$)",
        pipe_as_sender,           # uucp-Logs enthalten Rufer
        log_output,               # Fehlermeldungen für gebouncte Nachrichten 
                                  # speichern
#       defer_child_errors,       # erneuter Versuch, wenn uux Fehler meldet
# demand -- Lieferung an unmittelbar pollendes entferntes rmail-Programm
demand: driver=pipe,
        uucp,                     # UUCP-Adreßformate verwenden
        from,                     # From_-Zeile verwenden
        max_addrs=5,              # maximal 5 Adressen pro Aufruf
        max_chars=200;            # maximal 200 Zeichen für Adressen
        cmd="/usr/bin/uux -- -a$sender -g$grade $host!rmail $(($user)$)",
        pipe_as_sender,           # uucp-Logs enthalten Rufer
        log_output,               # Fehlermeldungen für gebouncte Nachrichten 
                                  # speichern
#       defer_child_errors,       # erneuter Versuch, wenn uux Fehler meldet
# hbsmtp -- halbgares BSMTP. Die Ausgabedateien müssen
#       regelmäßig bearbeitet und über UUCP verschickt werden.
hbsmtp: driver=appendfile,
        inet,                     # verwende RFC 822-Adressierung
        hbsmtp,                   # "batched SMTP" ohne HELO und QUIT
        -max_addrs, -max_chars;   # kein Limit bei Zahl der Adressen
        file="/var/spool/smail/hbsmtp/$host",
        user=root,                # Datei gehört root
        mode=0600,                # kann nur von root gelesen und geschrieben 
                                  # werden
# smtp -- Lieferung mit SMTP über TCP/IP
smtp:   driver=tcpsmtp,
        inet,
        -max_addrs, -max_chars;   # kein Limit bei Zahl der Adressen
        short_timeout=5m,               # Timeout für kurze Operationen
        long_timeout=2h,                # Timeout für längere SMTP-Operationen
        service=smtp,                   # Verbindung mit dem Service-Port
# bei Internet: die folgenden vier Zeilen auskommentieren
#       use_bind,                       # löse MX- und mehrfache A-Records auf
#       defnames,                       # verwende voreingestellte Domainsuche
#       defer_no_connect,               # erneuter Versuch, wenn Name-Server 
                                        # nicht hochgefahren
#       -local_mx_okay,                 # MX nicht an lokalen Host weiterleiten

Inhaltsverzeichnis Anhang A Anhang C