# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1399624685 -7200 # Node ID 3d9bb718ac1c02fce7a1e3bb4909cc175a126c15 # Parent 310001890766a7078b101998ef92d74a81b7ecd9 [snapshot] diff -r 310001890766 -r 3d9bb718ac1c Makefile --- a/Makefile Thu May 08 15:44:04 2014 +0200 +++ b/Makefile Fri May 09 10:38:05 2014 +0200 @@ -1,23 +1,23 @@ -IMAGES = procs.pdf routing.pdf + ALL = mk2014.pdf + +DIA = $(wildcard dia/*.dia) TT = $(wildcard *.tt) CONF = $(wildcard *.conf) +FRAMES = $(wildcard frames/*tex) +IMAGES = $(notdir $(DIA:.dia=.pdf)) + .PHONY: clean all: $(ALL) clean: rubber -d --clean mk2014.tex - -rm -f *.vrb $(IMAGES) + -rm -f *.vrb $(PDF) -mk2014.pdf: mk2014.tex $(IMAGES) $(TT) $(CONF) +mk2014.pdf: mk2014.tex $(IMAGES) $(FRAMES) $(TT) $(CONF) %.pdf: %.tex rubber -f -d $< -%.pdf: %.dia +%.pdf: dia/%.dia dia --export $@ $< - -#procs-%.pdf: procs.dia -# for p in 0 1 2 3; do \ -# dia --export procs-$$p.pdf --show-layers $$p $<; \ -# done diff -r 310001890766 -r 3d9bb718ac1c dia/procs.dia --- a/dia/procs.dia Thu May 08 15:44:04 2014 +0200 +++ b/dia/procs.dia Fri May 09 10:38:05 2014 +0200 @@ -62,17 +62,17 @@ - + - + - + - - + + @@ -81,7 +81,7 @@ - + @@ -102,13 +102,13 @@ - + - + - + @@ -117,7 +117,7 @@ - + @@ -137,7 +137,7 @@ - + @@ -150,13 +150,13 @@ - + - + - + @@ -165,7 +165,7 @@ - + @@ -185,7 +185,7 @@ - + @@ -198,10 +198,10 @@ - + - + @@ -215,7 +215,7 @@ - + @@ -234,16 +234,16 @@ - + - + - + @@ -252,7 +252,7 @@ - + @@ -282,7 +282,7 @@ - + @@ -304,20 +304,20 @@ - + - + - - + + - + @@ -335,20 +335,20 @@ - + - + - - + + - + @@ -366,20 +366,20 @@ - + - + - - + + - + @@ -400,20 +400,20 @@ - + - + - - + + - + @@ -434,13 +434,13 @@ - + - + - + @@ -449,7 +449,7 @@ - + @@ -469,7 +469,7 @@ - + @@ -482,14 +482,14 @@ - + - + - - + + @@ -498,7 +498,7 @@ - + @@ -518,14 +518,14 @@ - + - + - - + + @@ -534,7 +534,7 @@ - + @@ -554,20 +554,20 @@ - + - + - - + + - + @@ -588,20 +588,20 @@ - + - + - - + + - + @@ -622,13 +622,13 @@ - + - + - + @@ -637,7 +637,7 @@ - + @@ -657,7 +657,7 @@ - + @@ -670,13 +670,13 @@ - + - + - + @@ -685,7 +685,7 @@ - + @@ -705,7 +705,7 @@ - + @@ -718,10 +718,10 @@ - + - + @@ -735,7 +735,7 @@ - + @@ -751,20 +751,20 @@ - + - + - - + + - + @@ -782,20 +782,20 @@ - + - + - - + + - + @@ -813,14 +813,14 @@ - + - + - - + + @@ -829,7 +829,7 @@ - + @@ -850,14 +850,14 @@ - + - + - - + + @@ -866,7 +866,7 @@ - + @@ -887,13 +887,13 @@ - + - + - + @@ -902,7 +902,7 @@ - + @@ -922,7 +922,7 @@ - + @@ -935,13 +935,13 @@ - + - + - + @@ -950,7 +950,7 @@ - + @@ -970,7 +970,7 @@ - + @@ -983,20 +983,20 @@ - + - + - - + + - + @@ -1014,20 +1014,20 @@ - + - + - - + + - + @@ -1048,20 +1048,20 @@ - + - + - - + + - + @@ -1082,14 +1082,14 @@ - + - + - - + + @@ -1098,7 +1098,7 @@ - + @@ -1119,22 +1119,22 @@ - + - + - + - + - + - + @@ -1157,7 +1157,7 @@ - + @@ -1170,14 +1170,14 @@ - + - + - - + + @@ -1186,7 +1186,7 @@ - + @@ -1207,14 +1207,14 @@ - + - + - - + + @@ -1223,7 +1223,7 @@ - + @@ -1243,22 +1243,22 @@ - + - + - + - + - + - + @@ -1281,7 +1281,7 @@ - + @@ -1294,14 +1294,14 @@ - + - + - - + + @@ -1310,7 +1310,7 @@ - + @@ -1330,22 +1330,22 @@ - + - + - + - + - + - + @@ -1368,7 +1368,7 @@ - + @@ -1381,22 +1381,22 @@ - + - + - + - + - + - + @@ -1419,7 +1419,7 @@ - + @@ -1432,14 +1432,14 @@ - + - + - - + + @@ -1448,7 +1448,7 @@ - + @@ -1468,14 +1468,14 @@ - + - + - - + + @@ -1484,7 +1484,7 @@ - + diff -r 310001890766 -r 3d9bb718ac1c exim_bV.tt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exim_bV.tt Fri May 09 10:38:05 2014 +0200 @@ -0,0 +1,14 @@ +Exim version 4.80 #2 built 02-Jan-2013 18:59:17 +Copyright (c) University of Cambridge, 1995 - 2012 +(c) The Exim Maintainers and contributors in ACKNOWLEDGMENTS file, 2007 - 2012 +Berkeley DB: Berkeley DB 5.1.29: (October 25, 2011) +Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages \B + Content_Scanning DKIM Old_Demime +Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm \B + dbmjz dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite +Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa +Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect +Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp +Fixed never_users: 0 +Size of off_t: 8 +Configuration file is /etc/exim4/exim4.conf diff -r 310001890766 -r 3d9bb718ac1c frames/anatomie.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frames/anatomie.tex Fri May 09 10:38:05 2014 +0200 @@ -0,0 +1,36 @@ +\begin{frame}[<+->]{Arbeitsweise und Anatomie}{Überblick} + \begin{itemize} + \item Binary ist ein ca 1\,MB großer Universalklumpen + \item Einfache Struktur der operativen Daten - 2 Files je + Message, Spool in 16 Verzeichnissen + \item Keine aufwändigen IPC - nichts, außer fork(2) oder exec(3) + \item Wenig gemeinsam genutzte Daten - nur „Hint“-Files + \item Ohoh - setuid 0! + \end{itemize} +\end{frame} + +\begin{frame}{Arbeitsweise und Anatomie}{Prozesse} + \includegraphics[width=0.8\textwidth,angle=270]{procs} +\end{frame} + +\begin{frame}[<+->]{Arbeitsweise und Anatomie}{IN, OUT, Retry} + Es gibt im wesentlichen 3 Phasen der Verarbeitung. In Bezug + auf die Konfiguration sind das + \pause + \begin{enumerate} + \item Empfang + \begin{description} + \item[acl] mit Ratelimit, Blacklists, Adressüberprüfungen, Contentscan + \item[routers] für Adressüberprüfung in den ACL + \end{description} + \item Start des Sendeprozesses + \begin{description} + \item[routers] Ermittlung Transportweg und -mechanismus + \item[transports] Konfiguration der Transportmechanismen + \end{description} + \item Queuerunner startet ggf. weitere Versuche + \begin{description} + \item[retry] Wiederholungsregeln + \end{description} + \end{enumerate} +\end{frame} diff -r 310001890766 -r 3d9bb718ac1c frames/exim.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frames/exim.tex Fri May 09 10:38:05 2014 +0200 @@ -0,0 +1,47 @@ + + +\begin{frame}[<+->][fragile]{Exim}{Entwicklung} +\begin{itemize} + \item \textbf{Ex}perimental \textbf{I}nternet \textbf{M}ailer + \item seit 1995 Phil Hazel, seit ca. 2007 ca. 5…8 Aktive Entwickler + \item Klassisch Unix: traditionelle Konfiguration und traditionelles Prozess-Management + \item mehr als 90\% der Nachrichten werden sofort weitergeleitet bzw. ausgeliefert +\begin{scriptsize} +\begin{verbatim} +Time spent on the queue: messages with at least one remote delivery +------------------------------------------------------------------- +Under 1m 15052 99.2% 99.2% + 5m 20 0.1% 99.3% + 15m 2 0.0% 99.3% + 30m 91 0.6% 99.9% + 1h 9 0.1% 100.0% + 6h 2 0.0% 100.0% +Over 1d 1 0.0% 100.0% +\end{verbatim} +\end{scriptsize} +\end{itemize} +\end{frame} + +\begin{frame}[<+->][fragile]{Exim}{Position} +Ja, das ist Religionskrieg :-) +\pause +\begin{itemize} + \item Lego vs. Playmobil (P. Heinlein) + \item Anpassbarkeit + \begin{itemize} + \item keine Klassifizierung von Adressen + \item keine \verb=$mydestination= + \item Router sind Funktionsblöcke, keine Tabellen + \item Intensive Expansion von Variablen zur Laufzeit + \end{itemize} + \item gut verstandene Prozessstruktur $\rightarrow$ Stabilität + \item extrem gutes Logging $\rightarrow$ Sicherheit + \item exzellente Dokumentation (Referenz-Handbuch mit Beispielen: + spex.txt (33k L), spec.pdf (ca. 500 Seiten)) + \item sehr gutes Debugging der Konfiguration möglich + \item vorbildlichster Quelltext (C, kommentiert) +\end{itemize} +\pause +Nachteile? Klar - das Abarbeiten der Queue ist nicht sonderlich +effizient gelöst. +\end{frame} diff -r 310001890766 -r 3d9bb718ac1c frames/konfiguration.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frames/konfiguration.tex Fri May 09 10:38:05 2014 +0200 @@ -0,0 +1,116 @@ +% konfiguration +\section{Konfiguration} +\subsection{File} + +\begin{frame}[<+->][fragile]{Konfiguration}{File} +\begin{itemize} + \item Debian geht einen sonder(baren) Weg + \item Beispiel-Konfig \verb=example.conf.gz= als Ausgangspunkt + \item \verb=exim -bV= listet die verwendete Konfigurationsdatei und + einkompilierte Features + \begin{scriptsize} + \ttinput{exim_bV.tt} + \end{scriptsize} + \end{itemize} +\end{frame} + +\subsection{Struktur} + +\begin{frame}[<+->][fragile]{Konfiguration}{Struktur} +Strukturiertes Konfigurationsfile mit mehreren Abschnitten, teilweise +miteinander verlinkt (Router referenziert Tranports, globaler Teil +referenziert ACL) +\pause +\begin{scriptsize} +\begin{verbatim} + … + begin acl + … + begin routers + … +\end{verbatim} +\end{scriptsize} +\begin{description} + \item[global] knapp 240 allgemeine Direktiven + \item[acl] Access Control Lists für SMTP + \item[routers] Routing-Regeln (genutzt auch von ACL) + \item[transports] Transport-Mechanismen + \item[retry] Regeln für Wiederholungsversuche + \item[rewrite] Adress-Manipulation in Envelope und Header + \item[authenticators] SMTP-Authentifizierung +\end{description} +\end{frame} + +\subsection{Syntax} + +\begin{frame}[fragile]{Konfiguration}{Syntax} +\begin{exampleblock}{Macros, Kommentar, lange Zeilen} +\begin{verbatim} + # Super! + CF = /etc/exim4/ + USER_BASE = ou=users,BASE + BASE = dc=example,dc=com + received_header_text = Received: ${if def:sender_rcvhost \ + from $sender_rcvhost\n\t}{${if def:sender_ident {from \ + … + def:received_for {\n\tfor $received_for}} +\end{verbatim} +\end{exampleblock} +\pause +Der Rest ist einfach :) +\begin{alltt} + primary_hostname = foo.example.com +\end{alltt} +\pause +… solange keine \$-Zeichen dazu kommen. Dann haben wir Expansion in +allen Spielarten. +\end{frame} + +\subsection{String-Expansion} + +\begin{frame}[<+->][fragile]{Konfiguration}{Expansion} + Etwa die Hälfte der Konfigurationsdirektiven erlaubt Variablensubstitution (Expansion) + zur Laufzeit. +\pause +\begin{verbatim} + message_size_limit = ${if =={$received_port}{587} {200M}{50M}} + headers_add = X-Authenticated: ${if def:authenticated_id \ + {$authenticated_id}{unknown}} +\end{verbatim} +\pause +\begin{description} +\item[Variablen] \verb=$local_part=, \verb=${local_part}= +\item[Operatoren] \verb=${md5:$local_part}=, \verb=${uc:$domain}= +\item[Manipulation] \verb=${sg{$local_part}{.laus}{XXX}}= +\item[Bedingungen] \verb=${if eq{$local_part}{x}{~/mbox}{~/.mail}}= +\item[Lookup/Key] \verb=${lookup{$local_part}lsearch{/etc/aliases}}= +\item[Lookup/Query] \verb+${lookup dnsdb{mx=example.com}}+ +\end{description} +\end{frame} + +\begin{frame}[fragile]{String-Expansion}{Wenn nichts mehr geht} +Als letzte Hilfe gibt es die Möglichkeit, Sockets auszulesen, Perl zu +integrieren, oder externe Kommandos aufzurufen +\pause +\begin{verbatim} + ${readsocket{}{}} + ${run{[]…}} + ${perl{}[{}…]} +\end{verbatim} +\pause +\begin{exampleblock}{Greylisting} +\begin{verbatim} + GREYKEY = $sender_address/$local_part@$domain + perl_startup = do '/etc/exim4/exim-exigrey.pl' + acl_smtp_rcpt = acl_check_rcpt + … + begin acl + cl_check_rcpt: + … + defer condition = ${perl{unseen}{GREYKEY}{1d}} + … +\end{verbatim} +\end{exampleblock} +\end{frame} + + diff -r 310001890766 -r 3d9bb718ac1c mk2014.tex --- a/mk2014.tex Thu May 08 15:44:04 2014 +0200 +++ b/mk2014.tex Fri May 09 10:38:05 2014 +0200 @@ -12,6 +12,12 @@ \author[H. Schlittermann]{Heiko Schlittermann} \institute{schlittermann - internet \& unix support, Dresden} +\newcommand{\B}{$\hookleftarrow$} +\newcommand{\ttinput}[1]{% + \begin{alltt}% + \input{#1}% + \end{alltt}} + \begin{document} @@ -23,376 +29,14 @@ \tableofcontents \end{frame} -\section{Positionierung} - -\begin{frame}[<+->][fragile]{Exim}{Entwicklung} -\begin{itemize} - \item \textbf{Ex}perimental \textbf{I}nternet \textbf{M}ailer - \item seit 1995 Phil Hazel, seit ca. 2007 ca. 5…8 Aktive Entwickler - \item Klassisch Unix: Traditionelle Konfiguration und traditionelles Prozess-Management - \item mehr als 90\% der Nachrichten werden sofort weitergeleitet bzw. ausgeliefert -\begin{verbatim} -Time spent on the queue: messages with at least one remote delivery -------------------------------------------------------------------- -Under 1m 15052 99.2% 99.2% - 5m 20 0.1% 99.3% - 15m 2 0.0% 99.3% - 30m 91 0.6% 99.9% - 1h 9 0.1% 100.0% - 6h 2 0.0% 100.0% -Over 1d 1 0.0% 100.0% -\end{verbatim} -\end{itemize} -\end{frame} - -\begin{frame}[<+->][fragile]{Exim}{Position} -Ja, das ist Religionskrieg :-) -\pause -\begin{itemize} - \item Lego vs. Playmobil (P. Heinlein) - \item Anpassbarkeit - \begin{itemize} - \item keine Klassifizierung von Adressen - \item keine \verb=mydestinations= - \item Router sind Funktionsblöcke - \item Intensiver Gebrauch von Expansionsmechanismen zur Laufzeit - \end{itemize} - \item Stabilität - \item Sicherheit - \item Definierte Dokumentation (Referenz-Handbuch mit Beispielen) - \item Hervorragendes Debugging -\end{itemize} -\pause -Nachteile? Klar - das Abarbeiten der Queue ist nicht sonderlich -effizient gelöst. -\end{frame} - -\section{Anatomie} - -\begin{frame}[<+->]{Arbeitsweise und Anatomie}{Überblick} -\begin{itemize} -\item Binary ist ein ca 1\,MB großer Universalklumpen -\item Einfache Struktur der operativen Daten - Verzeichnis, 2 Files je -Message, Spool/Message-Log in 16 Verzeichnissen -\item Dokument -\item Keine aufwändigen IPC - nichts, außer fork(2) oder exec(3) -\item Wenig gemeinsam genutzte Daten - nur „Hint“-Files (z.B. retry info) -\item Ohoh - setuid 0! -\end{itemize} -\end{frame} - -\begin{frame}{Arbeitsweise und Anatomie}{Prozesse} -\includegraphics[width=0.8\textwidth,angle=270]{procs} -\end{frame} - -\begin{frame}[<+->]{Arbeitsweise und Anatomie}{IN, OUT, Retry} -Es gibt im wesentlichen 3 Phasen der Verarbeitung. -\pause -\begin{enumerate} - \item Empfang - \begin{itemize} - \item ACL mit Ratelimit, Blacklists, Routing-Test, Content-Scan - \item Ablage im Spool-Verzeichnis - \end{itemize} - \item Start des Sendeprozesses - \begin{itemize} - \item Spoolfile-Lock - \item Routing - \item Transport oder ggf. Abbruch - \end{itemize} - \item Queuerunner startet ggf. weitere Versuche -\end{enumerate} -\end{frame} - -\section{Konfiguration} - -\subsection{File} - -\begin{frame}[<+->][fragile]{Konfiguration}{File} -\begin{itemize} - \item Debian geht einen sonder(baren) Weg - \item \verb=/dev/null= ist eine gültige Konfiguration - \item \verb=exim -bV= listet die verwendete Konfigurationsdatei und - einkompilierte Features - \item Beispiel-Konfig \verb=example.conf.gz= als Ausgangspunkt -\end{itemize} -\end{frame} - -\subsection{Struktur} - -\begin{frame}[<+->][fragile]{Konfiguration}{Struktur} -Strukturiertes Konfigurationsfile mit mehreren Abschnitten, teilweise -miteinander verlinkt (Router referenziert Tranports, globaler Teil -referenziert ACL) -\pause -\begin{description} - \item[global] Etwa 240 allgemeine Direktiven - \item[acl] Access Control Lists für SMTP - \item[routers] Routing-Regeln (genutzt auch von ACL) - \item[transports] Wie wird SMTP gemacht, oder das Anhängen an Mailboxen - \item[retry] Unter welchen Bedingungen wird wann und wie oft und wie - lange wiederholt - \item[rewrite] Umschreiben von Headern und Envelope - \item[authenticators] SMTP-Authentifizierung -\end{description} -\end{frame} - -\subsection{Syntax} - -\begin{frame}[fragile]{Konfiguration}{Syntax} -\begin{exampleblock}{Macros} -\begin{verbatim} - CF = /etc/exim4/ - USER_BASE = ou=users,BASE - BASE = dc=example,dc=com -\end{verbatim} -\end{exampleblock} -\pause - -\begin{exampleblock}{Bedingte Konfiguration} -\begin{verbatim} - .ifdef SMALL_MEM - message_size_limit = 50M - .else - message_size_limit = 500M - .endif -\end{verbatim} -\end{exampleblock} -\pause - -\begin{exampleblock}{Versteckte Optionen} -Wegen \verb=exim -bP …=: -\begin{verbatim} - hide mysql_servers = localhost/mail/exim/secret -\end{verbatim} -\end{exampleblock} -\end{frame} - -\begin{frame}[fragile]{Konfiguration}{Options-Typen} -Es existieren ca. 580 Direktiven (Optionen). Exim kennt mehrere Datentypen. -\begin{exampleblock}{Bool} -\begin{verbatim} - more = yes - more = no - more - no_more -\end{verbatim} -\end{exampleblock} - -\begin{exampleblock}{Numerisch: Integer, Fixed-Point, Zeitintervalle} -\begin{verbatim} - message_size_limit = 100k - queue_only_load = 1.5 - retry_data_expire = 4d2h -\end{verbatim} -\end{exampleblock} -\begin{exampleblock}{Zeichenketten} -\begin{verbatim} - primary_hostname = mail.example.com -\end{verbatim} -\end{exampleblock} -\end{frame} - -\begin{frame}[fragile]{Konfiguration}{Options-Typen 2} -\begin{exampleblock}{Listen} -\begin{verbatim} - local_parts = hans : fred : detlef - interfaces = <; 192.168.123.123 ; 2001:db8::42 -\end{verbatim} -\end{exampleblock} - -\begin{exampleblock}{Frei definierte Listen} -\begin{verbatim} - domainlist local_domains = example.com : example.org - hostlist relay_from_hosts = 127.0.0.1 : fred.example.com -\end{verbatim} -\end{exampleblock} +\section{Exim - Entwicklung und Positionierung} +\input{frames/exim.tex} -\end{frame} - -\subsection{Variablen-Expansion} - -\begin{frame}[fragile]{Konfiguration}{Expansion} - Etwa die Hälfte der Konfigurationsdirektiven erlaubt - Variablensubstitution (Expansion) zur Laufzeit. - Testen kann man diese sehr einfach: -\begin{alltt} - $ exim -be '$primary\_hostname' - jumper.schlittermann.de - \pause - $ exim -be -oMi 1.1.1.1 -oMa 2.2.2.2 '$sender\_host\_address $received\_ip\_address' - 2.2.2.2 1.1.1.1 - \pause - $ exim -be '$\{lookup passwd\{nobody\}\{$\{extract\{5\}\{:\}\{$value\}\}\}\}' - /nonexistent - \pause - $ exim -be '$\{lookup\{root\}lsearch\{/etc/aliases\}\}' - heiko - \pause - $ exim -be '$\{lookup dnsdb\{mx=heise.de\}\}' - 10 relay.heise.de -\end{alltt} -\end{frame} - -\begin{frame}[fragile]{Expansion}{Übersicht} -Expansion als „working horse“ der Flexibilität -\begin{description} -\item[Variablen] \verb=$local_part=, \verb=${local_part}= -\item[Operatoren] \verb=${sha1:$local_part}=, \verb=${uc:$domain}= -\item[Manipulation] \verb=${sg{$local_part}{.laus}{XXX}}= -\item[Bedingungen] \verb=${if eq{$local_part}{x}{~x/.mbox}{/var/mail/$local_part}}= -\item[Lookup/Key] \verb=${lookup{$local_part}lsearch{/etc/aliases}}= -\item[Lookup/Query] \verb+${lookup dnsdb{mx=heise.de}}+ -\end{description} -\end{frame} - -\begin{frame}[fragile]{Expansion}{Variablen} -Es gibt knapp 200 Variablen, die Information über Zustände, Limits, … -enthalten: -\begin{verbatim} - … = $ - … = ${} -\end{verbatim} -\begin{description} -\item[Envelope] \verb=$local_part=, \verb=$domain=, \verb=$local_part_prefix=, - \verb=$sender_local_part=, \verb=$recipients= -\item[Message] \verb=$message_line_count=, \verb=$message_size=, - \verb=$message_headers=, \verb=$h_subject:= -\item[Content] \verb=$spam_score_int=, \verb=$malware_name= -\item[Routing] \verb=$original_domain= -\item[Delivery] \verb=$host_address=, \verb=$home=, - \verb=$qualify_recipient= -\item[Operation] \verb=$load_average=, \verb=$log_space=, \verb=$pid= - \verb=$received_interface_address=, \verb=$tls_out_peerdn=, - \verb=$message_age= -\end{description} -\end{frame} - -\begin{frame}[fragile]{Expansion}{String-Operationen} -Einfache Operationen auf Zeichenketten sind möglich: -\begin{verbatim} - … = ${:} -\end{verbatim} -\begin{description} -\item[Konvertierung] \verb=${uc:$local_part}=, \verb=${sha1:$domain}=, \verb=${time_eval:2d4h}= -\item[Extraktion] \verb=${length_3:$domain}=, \verb=${substr_1_3:$domain}=, \verb=${addresses:$h_from}= -\item[Arithmetik] \verb=${eval:40 + 2}=, \verb=${eval:40 + 2k}=, \verb=${eval:8 << 2}= -\item[Filesystem] \verb=${stat:/etc/hosts}= -\end{description} -\end{frame} - -\begin{frame}[fragile]{Expansion}{Bedingte Expansion} -Expansion kann von Bedingungen abhängig gemacht werden. -\begin{verbatim} - ${if :} - ${if [{arg}…] {}[{}]} - ${if [{arg}…] {}fail} -\end{verbatim} -\begin{description} -\item[Negation] \verb=! = -\item[Verknüpfungen] \verb=and{{…}{…}{…}}= -\item[Definiert] \verb=def:tls_cipher= -\item[Vergleiche] \verb=eq{foo}{bar}=, \verb+=={1}{2}+ -\item[Matching] \verb=match{$local_part}{^h\d+}= -\item[Authentication] \verb=pam{$user:$pass}= -\item[Status] \verb=first_delivery= -\end{description} -\end{frame} +\section{Arbeitsweise und Anatomie} +\input{frames/anatomie.tex} -\begin{frame}[fragile]{String-Expansion}{Listen} -An vielen Stellen werden Listen verwendet, Trenner in literalen -Listen ist „:“, es können aber auch Listen aus Textfiles, DBM-Files und -Directories erstellt werden: -\begin{description} -\item[Literale] \verb=example.com : foo.bar : example.org=, - \verb=<; 2001:db8::10 ; 2001:db8::12= -\item[Datei] \verb=lsearch;/etc/mailnames=, - \verb=dbm;/etc/mailnames= -\item[Verzeichnis] \verb=dsearch;/etc/vmail/domains= -\end{description} -\end{frame} - -\begin{frame}[fragile]{String-Expansion}{Single-Key Lookups} -Suche nach einem einzelnen Key, implizit oder explizit -\begin{verbatim} - = ; - ${lookup{}{}[{}[{}{}{}fail} -\end{verbatim} -\begin{description} -\item[implizit] \verb+domains = lsearch;/etc/mail/domains+ -\item[Lookup] \verb|${lookup{$local_part}lsearch{/etc/aliases}}| -\item[Lookup] \begin{verbatim} - ${lookup{$local_part}lsearch{/etc/aliases}\ - {$value}\ - {${lookup{…}}}} -\end{verbatim} -\end{description} -\begin{exampleblock}{Lookup-Typen} -lsearch, dsearch, dbm, cdbm, iplsearch, net-iplsearch, wildlsearch, … -\end{exampleblock} -\end{frame} - -\begin{frame}[fragile]{String-Expansion}{Query-Style Lookups} -Generische Suche in (SQL)-Datenbank, LDAP, DNS, NIS -\begin{verbatim} - ${lookup {}[{}[{}]]} -\end{verbatim} -\begin{description} -\item[DNS] \verb+${lookup dnsdb{a=foobar.de}}+ -\item[LDAP] \begin{verbatim}${lookup ldap{ldap:///o=bar?mailbox - ?sub?uid=${quote_ldap:$local_part}}} -\end{verbatim} -\item[PSQL] \verb=${lookup pgsql{SELECT mailbox FROM …}}= -\end{description} -\begin{exampleblock}{Lookup-Typen} - dnsdb, ibase, ldap, mysql, nisplus, oracle, passwd, pgsql, sqlite -\end{exampleblock} -\end{frame} - -\begin{frame}[fragile]{String-Expansion}{Wenn nichts mehr geht} -Als letzter Hilfe gibt es die Möglichkeit, Sockets auszulesen, externe -Kommandos aufzurufen oder Perl-Funktionen zu nutzen. -\begin{exampleblock}{Sockets} -\begin{verbatim} - condition = ${readsocket{}{}} -\end{verbatim} -\end{exampleblock} -\begin{exampleblock}{Kommandos} -\begin{verbatim} - domains = ${run{[]…}} -\end{verbatim} -\end{exampleblock} -\begin{exampleblock}{Perl} -\begin{verbatim} - perl_startup = do '/etc/exim/foo.pl' - … - domains = ${perl{}[{}…]} -\end{verbatim} -\end{exampleblock} -\end{frame} - - -%\begin{frame}{ACL (SMTP-Phasen, Address-Überprüfung, Rate-Limiting, Content-Scan)} -%\begin{itemize} -%\item Eingehende SMTP-Verbindungen (und in Grenzen auch -% nicht-SMTP)-Verbindungen müssen ACL überwinden. -%\item Für jede Phase der SMTP-Kommunikation gibt es einen -%ACL-Einstiegspunkt, z.B.:\begin{verbatim} -% acl_smtp_connect = -% acl_smtp_rcpt = -% acl_smtp_data = -%\end{verbatim} -%\item ACL entscheidet: accept, reject, defer, warn (noop) -%\item ACL Bedingungen: domains, DNS-BL, Verify (Sender/Empfänger), …, -% condition -%\item ACL können die interne Behandlung der Nachricht beeinflussen -% (queue\_only, submission, …) -%\item ACL können Variablen setzen, die später (Router, Transports) -% verwendet werden -%\end{itemize} -%\end{frame} -% +% -- +\input{frames/konfiguration.tex} \section{Routing} \subsection{Ablauf} diff -r 310001890766 -r 3d9bb718ac1c procs.dia --- a/procs.dia Thu May 08 15:44:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1194 +0,0 @@ - - - - - - - - - - - - - #A4# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #listener# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #receiver# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #queue# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #receiver# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #sender# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #sender# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #sender# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #queue runner# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #sender# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 310001890766 -r 3d9bb718ac1c routing.dia --- a/routing.dia Thu May 08 15:44:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1266 +0,0 @@ - - - - - - - - - - - - - #A4# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #remote# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #alias# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #mbox# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #domains?# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #local_user?# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #Address# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #accept -N: hans@example.com# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #accept -T: dovecot# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #Routing failed# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #accept -T: remote_smtp# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # file? # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #decline# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #decline# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #no more# - - - - - - - - - - - - - - - - - - - - - - - -