diff -r 3b662aa211f7 -r f0138e72be4e short.txt --- a/short.txt Mon Apr 20 23:08:26 2015 +0200 +++ b/short.txt Mon Apr 20 23:49:11 2015 +0200 @@ -1,5 +1,5 @@ -Kurzer Konfigurationsritt -========================= +Exim - Kurzer Konfigurationsüberblick +===================================== :Author: Heiko Schlittermann :toc: :data-uri: @@ -7,26 +7,27 @@ :numbered: :ascii-ids: +//// _italic_:: Namen von Dateien, Programmen, Hosts, Domains, Mail-Header, URLS: _example.com_, _From:_ *bold*:: Namen von Exim-Routern, Transports, Authenticators: *dnslookup*-Router +fixed+:: Kommandos, Code-Beispiele, Exim-Konfigurations-Optionen: +primary_hostname+ - *+fixed bold+*:: Hervorhebung von Kommandos, Nutzereingaben: *+exim -bV+* - '+slanted+':: Exim-Variablen im Text: '+$local_part+' oder '+$sender_address+' +//// == Konfiguration === File -Das Konfigurationsfile wird in der Build-Konfiguration (_EDITME_) festgelegt. -Es ist auch eine Liste von Konfigurationsfiles möglich, der erste Treffer gewinnt. -Das verwendete File läßt sich ermitteln mit +* Das Konfigurationsfile wird in der Build-Konfiguration (_EDITME_) festgelegt. +* Es ist auch eine Liste von Konfigurationsfiles möglich, der erste Treffer gewinnt. + +Das verwendete File läßt sich ermitteln mit: exim -bP configure_file @@ -38,14 +39,11 @@ Die Konfiguration wird öfter gelesen als vielleicht erwartet: -* Beim Start -* Aber - wann wird gestartet? - ** Start des Daemon - ** Signal _HUP_ - ** re-exec for verschiedene Zwecke +* Start des Daemon +* Signal _HUP_ +* re-exec for verschiedene Zwecke -CAUTION: Inhalt der Datei _exim.conf_ footnote:[Debian verwendet häufig exim4 an -stelle von exim.] +CAUTION: Inhalt der Datei _exim.conf_ und eventuell über +.include+ eingelesener Files ist statisch. Dynamisch sind dann Expansionen, Lookups. @@ -65,29 +63,37 @@ Allgemeine Parameter wir Listendefinitionen, Optionen für den Mailempfang, Datenbank-Verbindungsparameter Access Control Lists:: - Kontrolle der Nachrichtenannahme + Kontrolle des Nachrichten-Empfangs Router:: Steuerung des Nachrichten-Routings (Ermittlung des Zielhosts und des Transportmechanismus) Transports:: - Konfiguration der Transportmechanismen + Konfiguration der Transportmechanismen (SMTP, LMTP, o.a.) Rewrite:: Umschreiben von Envelope und Kopfzeilen +Retry:: + Regeln für Wiederholungsversuche bei der Zustellung Authentifizierung:: Parameter für die SMTP-Authentifizierung (sowohl Client als auch Server) == Syntax der Konfiguration === Kommentare -Alle Zeilen, die mit einem „#“ beginnen (nach optionalem Whitespace), sind Kommentarzeilen. -An anderen Stellen der Konfiguration hat das „#“-Zeichen keine besondere Bedeutung. + +* Alle Zeilen, die mit einem „#“ beginnen (nach optionalem Whitespace), sind Kommentarzeilen. +* An anderen Stellen der Konfiguration hat das „#“-Zeichen keine besondere Bedeutung. === Macros -Macros sind für einen einfachen statischen Textersetzungsmechanismus und für das -bedingte Parsen von Konfigurationsteilen. Macros können in der Konfiguration definiert werden, aber -auch auf der Kommandozeile. (Auf der Kommandozeile gibt es jedoch wegen eventueller Sicherheitsimplikationen -einige Besonderheiten zu beachten.) Macros werden generell groß geschrieben. +* Macros werden generell groß geschrieben. +* Macros sind ein einfache statischer Textersetzungsmechanismus (im Sinne +* globaler „Konstanten“) und für das + bedingte Parsen von Konfigurationsteilen. +* Macros können in der Konfiguration definiert werden, aber + auch auf der Kommandozeile. (Auf der Kommandozeile gibt es jedoch wegen eventueller Sicherheitsimplikationen + einige Besonderheiten zu beachten.) + +.Beispiel LDAP_BASE = ou=ousers,o=acme LDAP = ldap:///LDAPBASE … @@ -96,23 +102,28 @@ .ifdef TESTING testrouter: driver = dnslookup + transport = TRANSPORT … .endif Und beim Aufruf: - exim -DTESTING … - exim -DFOO=bar … + exim -DTESTING -DTRANSPORT=foo … Macros können neu definiert werden („==“ statt „=“). Macros von der Kommandozeile haben Vorrang. === Optionen -Es gibt ca. 250 globale Optionen, hinzu kommen noch weitere Optionen für Router, Transports, … -Optionen haben einen bestimmten <>. Optionen werden generell klein geschrieben. +* Optionen werden generell klein geschrieben. +* Es gibt ca. 250 globale Optionen, hinzu kommen noch weitere Optionen für Router, +Transports, Authenticators, usw. +* Optionen haben einen bestimmten <>. + +.Beispiel primary_hostname = foo.example.com === Listen + Listen bestehen aus der Angabe des Listentypes, eines Namens und dem Listeninhalt. Es gibt 4 verschiedenen Listentypen. @@ -143,12 +154,15 @@ domainlist_cache local_domain = ${lookup …} +.Beispiel Debugging + exim -bP +local_domains + === Instanzen von Routern, Transports, Authentificators -Router, Transports und Authenificators werden in einzelnen „Funktionsblöcken“ -definiert. Diese Blöcke haben selbstgewählte Namen und eine Liste von +* Router, Transports und Authenificators werden in einzelnen „Funktionsblöcken“ definiert. +* Diese Blöcke haben selbstgewählte Namen und eine Liste von Optionen, die das Verhalten des jeweiligen Routers, Transports oder -Authenicators bestimmen. +Authenticators bestimmen. begin transports … @@ -163,7 +177,7 @@ [[types]] == Werte und ihre Typen -ALle Optionen der Konfigurationsdatei haben einen spezifischen Werte-Typ. +ALle Optionen der Konfigurationsdatei haben einen spezifischen Daten-Typ. * _bool_, _integer_, _fixed-point_, _time_ und _string_ * Listen sind immer String-Listen @@ -220,8 +234,8 @@ .Format: … = []… -Erlaubte Suffixe sind 's', 'm', 'h', 'd', 'w', also für -Intervalle, die sich zweifelsfrei in Sekunden umrechnen lassen. +Erlaubte Suffixe sind 's', 'm', 'h', 'd', 'w', also Intervalle, die sich +zweifelsfrei in Sekunden umrechnen lassen. .Beispiel auto_thaw = 3d12h @@ -230,9 +244,10 @@ === Zeichenketten -Zeichenketten gibt es in zwei Formen: Literale Zeichenketten und gequotet. -Zeichenketten, die später noch expandiert werden, werden _immer_ als gequotete -Zeichenketten behandelt. +* Zeichenketten gibt es in zwei Formen: Literale Zeichenketten und gequotete + Zeichenketten.. +* Zeichenketten, die später noch expandiert werden, werden _immer_ als gequotete + Zeichenketten behandelt. .Format … = @@ -253,12 +268,13 @@ === Listen -Listen sind immer Listen zuerst eine _einzige_ Zeichenkette, unterliegen also -den Zeichenketten-Interpretationsregeln. Der Feldtrenner ist standardmäßig +* Listen sind immer zuerst eine _einzige_ Zeichenkette, unterliegen also +den Zeichenketten-Interpretationsregeln. +* Der Feldtrenner ist standardmäßig ein ':'. Wird der Feldtrenner als Teil eines Listenelements benötigt, muss er verdoppelt werden (oder es wird ein anderer Trenner gewält.) -Umschließender Leerraum an den einzelnen Elementen wird ignoriert. Leere -Elemente in der Liste und am _Ende_ der Liste werden ignoriert. +* Umschließender Leerraum an den einzelnen Elementen wird ignoriert. +* Leere Elemente in der Liste und am _Ende_ der Liste werden ignoriert. .Format … = : … @@ -275,16 +291,17 @@ <1> leere Liste <2> Liste mit einem leeren Element -.Debugging +.Beispiel Debugging exim -be '${map{:a:b:c,}{<$item>}}' exim -be '${map{<,,a,b,c,}{<$item>}}' exim -C <(echo domainlist local_domains = 'a:b::c:d') -be '${listnamed:local_domains}' + exim -bP +local_domains === Reguläre Ausdrücke -Reguläre Ausdrücke werden durch 'libpcre' ausgewertet, sie sind also kompatibel -mit den von Perl bekannten regulären Ausdrücken. Reguläre Ausdrücke werden immer -zuerst als String evaluiert, eventuelle Backslash-Sequenzen müssen also ggf. geschützt +* Reguläre Ausdrücke werden durch 'libpcre' ausgewertet, sie sind also kompatibel +mit den von Perl bekannten regulären Ausdrücken. +* Reguläre Ausdrücke werden immer zuerst als String evaluiert, eventuelle Backslash-Sequenzen müssen also ggf. geschützt werden. .Format @@ -299,15 +316,15 @@ == Expansion von Zeichenketten -Viele Stellen der Konfiguration verwenden String-Expansion (Typ 'string*' im -_spec.txt_). String-Expansion wird von '\$' getriggert. Das Ergebnis ist dann +* Viele Stellen der Konfiguration verwenden String-Expansion (Typ 'string*' im +_spec.txt_). String-Expansion wird von '$' getriggert. Das Ergebnis ist dann ein neuer String oder 'forced failure'. -Die Expansion der Strings erfolgt in der Regel erst im Bedarfsfall („late +* Die Expansion der Strings erfolgt in der Regel erst im Bedarfsfall („late binding“). -CAUTION: Es stehen aber nicht in jeder Phase alle Items zur Verfügung. (z.B. +CAUTION: Es stehen aber nicht in jeder Phase alle Expansions-Items zur Verfügung. (z.B. wird der Wert der globalen Option +message_size_limit+ expandiert, aber bereits -während der Antwort auf das SMTP-HELO, in dieser Phase gibt es noch keinen +während der Antwort auf das SMTP-HELO. In dieser Phase gibt es noch keinen '+$local_part+'). .Debugging @@ -315,13 +332,14 @@ exim -bem [] exim -be -Mset [] - eg: exim -be '$primary_hostname' - exim -be '$tod_full' - exim -bem <(echo 'Subject: Hi') '$h_subject:' +.Beispiel Debugging + exim -be '$primary_hostname' + exim -be '$tod_full' + exim -bem <(echo 'Subject: Hi') '$h_subject:' === Expansions-Items -Aus Sicht des Expanders ist alles, was mit einem '\$' beginnt, ein +* Aus Sicht des Expanders ist alles, was mit einem '$' beginnt, ein Expansions-Item. Variablen:: @@ -360,22 +378,19 @@ == Lookups -Mit Lookups werden Daten aus externen Quellen gewonnen. Lookups gibt es in zwei -Syntaxvarianten und in zwei Stilen. +* Mit Lookups werden Daten aus externen Quellen gewonnen. +* Lookups gibt es in zwei Syntaxvarianten und in zwei Stilen. -* Syntax -** implizit -** explizit -* Stil -** Single-Key -** Query-Style - +Syntax:: + Es gibt implizite und explizite Loookups. +Stil::: + Es gibt Single-Key und Query-Style Lookups. === Syntax -==== explizit +==== explizite Syntax -Der Key oder die Frage wird ausdrücklich formuliert, es ist eine gewöhnliche +* Der Key oder die Frage wird ausdrücklich formuliert, es ist eine gewöhnliche String-Expansion. Als Resultat wird das Ergebnis des Lookups zurückgeliefert. .Format @@ -383,17 +398,20 @@ … = ${lookup {}} .Beispiel - domainlist local_domains = ${lookup{$domain}dsearch{/etc/vmail/domains}} - local_parts = ${lookup ldap{ldap:///o=foo?uid?sub?uid=${quote_ldap:$local_part}}} + domainlist local_domains = ${lookup{$domain}dsearch{/etc/vmail/domains}} <1> + localpartlist users = ${lookup ldap{ldap:///o=foo?uid?sub?uid=${quote_ldap:$local_part}}} + data = ${lookup{$local_part}lsearch{/etc/aliases}{$value}{root@localhost}} + data = ${lookup{$local_part}lsearch{/etc/aliases}{$value}\ + {${lookup{…}}}} -Im Beispiel wird der Umstand genutzt, dass in vielen Fällen lediglich +<1> Im Beispiel wird der Umstand genutzt, dass in vielen Fällen lediglich die aktuell behandelte Adresse in der Liste vorhanden sein muss. Die explizite Syntax kann natürlich auch eine komplette Liste zurückliefern, diese muss dann eventuell massiert werden, damit die Feldtrenner den Erwartungen von Exim entsprechen. -==== implizit +==== implizite Syntax Der Key ergibt sich aus dem Kontext, das Lookup wird dennoch durch den String-Expander behandelt. Wenn das Lookup erfolgreich ist, wird als Resultat @@ -422,7 +440,7 @@ Suche nach Teilzeichenketten (Domain) mit _partial-lsearch_. _dsearch_:: Verzeichnis-Lookup: Suche nach einem spezifischen Verzeichniseintrag -_iplsearch:: +_iplsearch_:: Suche nach IP-Adressen oder Netzen unter Beachtung von Netzmasken _dbm_:: Suche in Berkeley-DBM Files @@ -449,7 +467,7 @@ _ldap_:: Anfragen an LDAP. Erwartet wird ein Object (_ldap_) oder mehrere Objekte - (_ldap_) + (_ldapm_). ${lookup ldap{ldap:///ou=foo?mail?sub?uid=${quote_ldap:$local_part}}} @@ -482,7 +500,7 @@ Eine ACL ist eine Folge von Bedingungsblöcken. Sind _alle_ Bedingungen eines Blocks erfüllt, gilt die für diesen Block festgelegte Aktion. Die Bedingungen werden in der Reihenfolge ihres Auftretens bearbeitet. Sobald -eine nicht zutrifft, wird der nächste Block untersucht. +eine Bedingung nicht zutrifft, wird der nächste Block untersucht. .Beispiel accept domains = +local_domains @@ -560,7 +578,7 @@ Sofort einen Log-Eintrag +control+:: - Steuert das weitere Verhalten + Steuert das weitere Verhalten der Nachrichtenverarbeitung control = submission @@ -603,10 +621,10 @@ generate bounce .Beispiel - external: + external: driver = dnslookup - domains = !+local_domains - transport = remote_smtp + domains = !+local_domains + transport = remote_smtp ignore_target_hosts = <; 127.0.0.1 : ::1 Eine Liste der konfigurierten Router erhält man mit: @@ -745,13 +763,13 @@ exim -bP spool_directory 'input':: - Message-Spool. Wichtig! Je Message 2 Dateien. + Message-Spool. Je Message 2 Dateien. 'db':: - Hint-Files, nicht wichtig. + Hint-Files, Cache. 'msglog':: Nachrichten-Logs, solange die Nachricht noch nicht 'completed' ist. -Mit dem klassischen 'mailq' lässt sich die aktuelle Queue anzeichen. Oder auch +Mit dem klassischen 'mailq' lässt sich die aktuelle Queue auflisten. Oder auch mit exim -bp @@ -785,7 +803,7 @@ 'rejectlog':: Etwas mehr Details bei 5xx/4xx (Headerzeilen) 'paniclog':: - ... wenn nichts mehr geht. + Wenn nichts mehr geht. Zum Suchen und Zusammenfassen dieser Informationen eignet sich 'exigrep' am besten. @@ -805,14 +823,14 @@ 'exim_dumpdb':: Textdump der jeweiligen Datenbank, Ausgabeformat ist je nach DB-Format leicht unterschiedlich - ++ .Beispiel exim_dumpdb /var/spool/exim retry 'exim_fixdb':: Mit diesem Werkzeug können gezielt einzelne Datensätze einer Hint-DB gelöscht werden - ++ .Beispiel # exim_fixdb /var/spool/exim4 retry Modifying Exim hints database /var/spool/exim4/db/retry @@ -935,6 +953,9 @@ .Beispiel exim -be '${lookup{root}lsearch{/etc/aliases}}' + +[index] + //// implizit "deny" am Ende jeder ACL!