# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1399634803 -7200 # Node ID e3ac4157aae416bc2582fbecd10ed54c9316b14e # Parent 3d9bb718ac1c02fce7a1e3bb4909cc175a126c15 [snapshot] diff -r 3d9bb718ac1c -r e3ac4157aae4 .hgsubstate --- a/.hgsubstate Fri May 09 10:38:05 2014 +0200 +++ b/.hgsubstate Fri May 09 13:26:43 2014 +0200 @@ -1,2 +1,2 @@ 5654b1c30b86960fc8880f449dd99d9ff016c1a5 emig -be6f040666503da5318cea099adf5fbe190577a8 smart-config +327049f04783e46ded8c8cc5ad62fd6927aba594 smart-config diff -r 3d9bb718ac1c -r e3ac4157aae4 frames/acl.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frames/acl.tex Fri May 09 13:26:43 2014 +0200 @@ -0,0 +1,46 @@ +\section{Access Control Lists} +\subsection{Konfiguration} + +\begin{frame}[<+->][fragile]{Acess Control Lists} +Für jede Phase der SMTP-Kommunikation gibt es einen ACL-Einstiegspunkt. +Abarbeitung der Regeln bis zur Entscheidung. +\pause +\begin{description} +\item[accept] alles gut, keine weiteren Regeln +\item[deny] permanenter Fehler und passender Text dazu +\item[require] permanenter Fehler oder nächste Regel +\item[warn] Protokollierung und nächste Regel +\item[defer] temporärer Fehler +\end{description} +\pause +Verweis auf Blöcke im ACL-Abschnitt der Konfiguration +\begin{verbatim} + acl_smtp_connect = acl_check_connect + acl_smtp_rcpt = acl_check_rcpt + acl_smtp_data = acl_check_data +\end{verbatim} +\end{frame} + +\begin{frame}[fragile]{Access Control Lists}{Konfiguration} +\tiny +\verbatiminput{acl.conf} +\end{frame} + +\subsection{Features} + +\begin{frame}[<+->][fragile]{Access Control Lists}{Features} +\begin{itemize} + \item Zugriff auf alles, was an Information verfügbar ist + \item Ratelimit mit beliebigen Keys + \item Überprüfung von Adressen \verb+verify = recipient+ + \item Callout zur Überprüfung \verb+verify = recipient/callout=use_sender,defer_ok+ + \item DNS-Blacklists \verb+dnslists = sbl.spamhaus.org+ + \item Verschlüsselte Verbindung \verb+encrypted = *+ + \item Content-Scan \verb+malware = *+, \verb+spam = …+ + \item Header-Syntax \verb+verify = header_syntax+ + \item Reverse-DNS \verb+verify = reverse_host_lookup+ + \item ACL-Variablen für spätere Verarbeitung \verb+set acl_m_foo = bar+ + \item Sub-ACL \verb+acl = foo_acl+ + \item Generische Bedingung \verb+condition =+ +\end{itemize} +\end{frame} diff -r 3d9bb718ac1c -r e3ac4157aae4 frames/anatomie.tex --- a/frames/anatomie.tex Fri May 09 10:38:05 2014 +0200 +++ b/frames/anatomie.tex Fri May 09 13:26:43 2014 +0200 @@ -1,3 +1,5 @@ +\section{Arbeitsweise und Anatomie} + \begin{frame}[<+->]{Arbeitsweise und Anatomie}{Überblick} \begin{itemize} \item Binary ist ein ca 1\,MB großer Universalklumpen diff -r 3d9bb718ac1c -r e3ac4157aae4 frames/emil.tex diff -r 3d9bb718ac1c -r e3ac4157aae4 frames/exim.tex --- a/frames/exim.tex Fri May 09 10:38:05 2014 +0200 +++ b/frames/exim.tex Fri May 09 13:26:43 2014 +0200 @@ -1,4 +1,5 @@ +\section{Exim - Entwicklung und Positionierung} \begin{frame}[<+->][fragile]{Exim}{Entwicklung} \begin{itemize} diff -r 3d9bb718ac1c -r e3ac4157aae4 frames/routing.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frames/routing.tex Fri May 09 13:26:43 2014 +0200 @@ -0,0 +1,43 @@ +\section{Routing} +\subsection{Ablauf und Konfiguration} + +\begin{frame}[<+->][fragile]{Routing}{Allgemein} +\begin{itemize} +\item Routing - zentrale Rolle +\item Routing bereits in den ACL für Adresstests +\item Konfiguration enthält eine Kette von Router-Blöcken +\item Vorbedingungen entscheiden, ob ein Block aktiv wird +\item Router liefern für eine gegebene Adresse: + \begin{description} + \item[accept] Zuordnung zu Transport oder Erzeugung neuer Adressen + \item[decline] Verweigerung + \item[fail] Bounce wird generiert + \item[defer] falscher Augenblick + \end{description} +\item Routerblock +\begin{verbatim} + dnslookup: + driver = dnslookup + domains = ! +local_domains + transport = remote_smtp + ignore_target_hosts = 127.0.0.0/8 +\end{verbatim} + \item Treiber dnslookup, manualroute, queryprogram, redirect, accept +\end{itemize} +\end{frame} + +\subsection{Test} + +\begin{frame}[fragile]{Routing}{Test} +\begin{alltt} + $ exim -bt hans@example.com + hans@example.com + router = remote, transport = remote_smtp + host example.com [2606:2800:220:6d:26bf:1447:1097:aa7] + host example.com [93.184.216.119] +\pause +\begin{scriptsize} +\input{routingremote.tt} +\end{scriptsize} +\end{alltt} +\end{frame} diff -r 3d9bb718ac1c -r e3ac4157aae4 frames/smarthost.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frames/smarthost.tex Fri May 09 13:26:43 2014 +0200 @@ -0,0 +1,65 @@ +\section{Beispiel} +\subsection{Viele Smarthosts} + +\begin{frame}{Beispiel}{Smarthost} +\begin{block}{Aufgabe} +Wir haben mehrere Smarthosts und müssen je nach Sender-Adresse über +einen anderen Smarthost versenden. +\end{block} +\begin{scriptsize} +\verbatiminput{smart-config/smarthosts.example} +\end{scriptsize} + +\begin{block}{Routing} +Wir müssen beim Routing die Sender-Adresse als Kriterium +verwenden, nicht die Zieladresse! +\end{block} +\end{frame} + + +# some macros to ease the understanding +ADDRESS_DATA = ${sg{${lookup{$sender_address}lsearch*@{SMARTHOSTS}}}{\\s+}{\t}} +SMARTHOST = ${extract{1}{\t}{$address_data}} +USER = ${extract{2}{\t}{$address_data}} +PASS = ${extract{3}{\t}{$address_data}} + +domainlist local_domains = @ + +begin router + +# the first router routes according the sender_address +smarthosts: + driver = manualroute + address_data = ADDRESS_DATA + route_data = SMARTHOST + transport = smtp_auth + +# in case you don't have a '*' line in your smarthosts file + +dnslookup: + driver = dnslookup + domains = !+local_domains + transport = smtp + no_more + +begin transport + +smtp_auth: + driver = smtp + port = submission + hosts_require_auth = * + +smtp: + driver = smtp + +begin authenticators + +plain: + driver = plaintext + public_name = PLAIN + client_send = ^USER^PASS + +login: + driver = plaintext + public_name = LOGIN + client_send = :USER:PASS diff -r 3d9bb718ac1c -r e3ac4157aae4 frames/transport.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frames/transport.tex Fri May 09 13:26:43 2014 +0200 @@ -0,0 +1,23 @@ +\section{Transport} + +\begin{frame}[<+->][fragile]{Transports} +\begin{itemize} +\item Router referenzieren ggf. einen Transport-Block, der +mindestens einen Treiber und ggf. noch weitere Optionen spezifiziert. +\begin{verbatim} + remote_smtp: + driver = smtp + + local_mailbox: + driver = appendfile + file = /var/mail/$local_part + group = mail +\end{verbatim} +\item Treiber +\begin{description} + \item[smtp] SMTP, TLS, LMTP + \item[appendfile] Mailbox, Maildir + \item[pipe] Kommando-Pipelinee (z.B. UUCP) +\end{description} +\end{itemize} +\end{frame} diff -r 3d9bb718ac1c -r e3ac4157aae4 mk2014.tex --- a/mk2014.tex Fri May 09 10:38:05 2014 +0200 +++ b/mk2014.tex Fri May 09 13:26:43 2014 +0200 @@ -29,163 +29,30 @@ \tableofcontents \end{frame} -\section{Exim - Entwicklung und Positionierung} +% -- \input{frames/exim.tex} -\section{Arbeitsweise und Anatomie} +% -- \input{frames/anatomie.tex} -% -- +% -- Config \input{frames/konfiguration.tex} -\section{Routing} -\subsection{Ablauf} - -\begin{frame}[fragile]{Routing}{Allgemein} -\begin{itemize} -\item Adresse wird an eine Kette von Routern übergeben (Reihenfolge!) -\item Router entscheiden über den Fortgang der Bearbeitung -\item Vorbedingungen entscheiden, ob der Router „befragt“ wird -\item Router liefern für eine gegebene Adresse - \begin{description} - \item[accept] Zuordnung zu Transport oder erzeugung neuer Adressen - \item[pass] Weitergabe an anderen Router - \item[decline] Verweigerung - \item[fail] Bounce wird generiert - \item[defer] falscher Augenblick - \item[error] Panik - \end{description} -\item werden auch von ACL genutzt (Adressüberpüfung) -\item Router: dnslookup, manualroute, queryprogram, redirect, accept -\item einfache Tests sind möglich mit \verb=exim -bt= (Adresstest - - Routing) bzw. \verb=exim -bv= (Adressüberprüfung - ACL) -\end{itemize} -\end{frame} - -\subsection{Konfiguration} +% -- Routing +\input{frames/routing.tex} -\begin{frame}[fragile]{Routing}{Konfiguration} -Für jeden Router-Block -\begin{itemize} -\item Treiber -\item Vorbedingungen (\verb=check_local_user=, \verb=domains=, \verb=condition=, …) -\item Generische Optionen (\verb=caseful_local_part=, \verb=local_part_prefix=, …) -\end{itemize} -%\scriptsize -\verbatiminput{routers.conf} -\end{frame} - -\begin{frame}{Routing}{Schema} -\includegraphics[width=0.8\textwidth,angle=270]{routing} -\end{frame} - -\subsection{Test} - -\begin{frame}[fragile]{Routing}{Test} -\begin{verbatim} - $ exim -bt hans@example.com - hans@example.com - router = remote, transport = remote_smtp - host example.com [2606:2800:220:6d:26bf:1447:1097:aa7] - host example.com [93.184.216.119] - - $ exim -bt hans@localhost - hans@example.com - <-- hans@localhost - router = remote, transport = remote_smtp - host example.com [2606:2800:220:6d:26bf:1447:1097:aa7] - host example.com [93.184.216.119] - - $ exim -bt heiko@localhost - heiko@localhost - router = mbox, transport = local_mbox -\end{verbatim} -\end{frame} - -\begin{frame}[fragile]{Routing}{Remote} -\scriptsize -\begin{alltt} -\input{routingremote.tt} -\end{alltt} -\end{frame} +% -- Transport +\input{frames/transport.tex} -\begin{frame}[fragile]{Routing}{Alias} -\scriptsize -\begin{alltt} -\input{routingalias.tt} -\end{alltt} -\end{frame} - -\begin{frame}[fragile]{Routing}{Local} -\scriptsize -\begin{alltt} -\input{routinglocal.tt} -\end{alltt} -\end{frame} - -\section{Transport} - -\begin{frame}[fragile]{Transports} -Die Router referenzieren ggf. einen „transport“. -\begin{itemize} -\item Reihenfolge egal -\item Generische Optionen: \verb=headers_remove=, -\verb=envelope_to_add=, \verb=transport_filter=, \verb=user= -\item Treiber hat weitere Optionen -\item Transports: appendfile, autoreply, lmtp, pipe, smtp -\item Default TLS, wenn STARTTLS geboten wird -\end{itemize} -\begin{alltt} -\input{transports.conf} -\end{alltt} -\end{frame} - -\section{Access Control Lists} -\subsection{Konfiguration} +% -- ACL +% \input{frames/acl.tex} -\begin{frame}[<+->][fragile]{Acess Control Lists} -Für jede Phase der SMTP-Kommunikation gibt es einen ACL-Einstiegspunkt. -Abarbeitung der Regeln bis zur Entscheidung. -\pause -\begin{description} -\item[accept] alles gut, keine weiteren Regeln -\item[deny] permanenter Fehler und passender Text dazu -\item[require] permanenter Fehler oder nächste Regel -\item[warn] Protokollierung und nächste Regel -\item[defer] temporärer Fehler -\end{description} -\pause -Verweis auf Blöcke im ACL-Abschnitt der Konfiguration -\begin{verbatim} - acl_smtp_connect = acl_check_connect - acl_smtp_rcpt = acl_check_rcpt - acl_smtp_data = acl_check_data -\end{verbatim} -\end{frame} +% -- Example Emil +\input{frames/emil.tex} -\begin{frame}[fragile]{Access Control Lists}{Konfiguration} -\tiny -\verbatiminput{acl.conf} -\end{frame} - -\subsection{Features} +% -- Example multiple smarthosts +% \input{frames/smarthost.tex} -\begin{frame}[<+->][fragile]{Access Control Lists}{Features} -\begin{itemize} - \item Zugriff auf alles, was an Information verfügbar ist - \item Ratelimit mit beliebigen Keys - \item Überprüfung von Adressen \verb+verify = recipient+ - \item Callout zur Überprüfung \verb+verify = recipient/callout=use_sender,defer_ok+ - \item DNS-Blacklists \verb+dnslists = sbl.spamhaus.org+ - \item Verschlüsselte Verbindung \verb+encrypted = *+ - \item Content-Scan \verb+malware = *+, \verb+spam = …+ - \item Header-Syntax \verb+verify = header_syntax+ - \item Reverse-DNS \verb+verify = reverse_host_lookup+ - \item ACL-Variablen für spätere Verarbeitung \verb+set acl_m_foo = bar+ - \item Sub-ACL \verb+acl = foo_acl+ - \item Generische Bedingung \verb+condition =+ -\end{itemize} -\end{frame} \section{Logging} diff -r 3d9bb718ac1c -r e3ac4157aae4 routingremote.tt --- a/routingremote.tt Fri May 09 10:38:05 2014 +0200 +++ b/routingremote.tt Fri May 09 13:26:43 2014 +0200 @@ -1,24 +1,20 @@ -$ exim -d-all+route -bt hans@example.com +$ exim -d-all+dns+route -bt hans@example.com >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> routing hans@example.com --------> remote router <-------- local_part=hans domain=example.com checking domains -calling remote router -remote router called for hans@example.com +calling remote router for hans@example.com domain = example.com +DNS lookup of example.com (MX) gave NO_DATA +returning DNS_NODATA +DNS lookup of example.com (AAAA) succeeded +DNS lookup of example.com (A) succeeded set transport remote_smtp queued for remote_smtp transport: local_part = hans -domain = example.com - errors_to=NULL - domain_data=NULL localpart_data=NULL routed by remote router envelope to: hans@example.com transport: remote_smtp host example.com [2606:2800:220:6d:26bf:1447:1097:aa7] host example.com [93.184.216.119] ->>>>>>>>>>>>>>>> Exim pid=9434 terminating with rc=0 >>>>>>>>>>>>>>>> -hans@example.com - router = remote, transport = remote_smtp - host example.com [2606:2800:220:6d:26bf:1447:1097:aa7] - host example.com [93.184.216.119] +>>>>>>>>>>>>>>>> Exim pid=24870 terminating with rc=0 >>>>>>>>>>>>>>>>