
%
% mxallowd 1.7 Manual
% (c) 2007-2009 Michael Stapelberg
%
% See http://michael.stapelberg.de/mxallowd
%
\documentclass[12pt, a4paper]{scrartcl}

\usepackage{ngerman}
\usepackage[latin1]{inputenc}

\usepackage{graphicx}
\usepackage{fancyhdr}
\usepackage{url}
\usepackage{listings}
\usepackage{palatino,avant}
\usepackage[pdftex,bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,colorlinks=true,filecolor=black,
		linkcolor=red,urlcolor=blue,plainpages=false,pdfpagelabels,citecolor=black,
		pdftitle={mxallowd-Dokumentation},pdfauthor={Michael Stapelberg}]{hyperref}

% New paragraph
\newcommand{\np}{\bigskip\noindent}
% Program name
\newcommand{\prog}[1]{\textit{#1}}
% Command name
\newcommand{\cmd}[1]{\textit{#1}}
% Left and right angle brackets
\newcommand{\la}{\textless}
\newcommand{\ra}{\textgreater}

% Figure names
\renewcommand{\figurename}{Abb.}
% No indention at new paragraphs
\setlength{\parindent}{0pt}
% listing-options
\lstset{frame=trbl,basicstyle=\ttfamily\small,captionpos=b}
% No tt-style
\urlstyle{rm}

\begin{document}

\title{mxallowd-Dokumentation}
\author{Michael Stapelberg}
\date{Version 1.7, Dokumentation \today}

\maketitle

\tableofcontents

\clearpage

\section{Einleitung}

\prog{mxallowd} ist ein Daemon für Linux/Netfilter (via libnetfilter\_queue) oder BSD/pf (via pflog), der eine Verfeinerung der nolisting-Methode darstellt. Hierbei werden für eine Domain zwei MX-Einträge vom Nameserver ausgeliefert, wobei auf der IP-Adresse des ersten MX-Eintrags kein Mailserver läuft. Einige Spammer versuchen nun, nur auf den ersten Mailserver Spam auszuliefern und werden damit keinen Erfolg haben. Auf der IP-Adresse des zweiten MX-Eintrags läuft dann ein richtiger Mailserver, der die E-Mails entgegennimmt. Echte Mailserver probieren -- im Gegensatz zu Spammern -- alle MX-Einträge in der angegeben Reihenfolge (geordnet nach Priorität) durch, bis sie die Mail zustellen können. Somit kommen echte Mails an und Spam bleibt draußen.\np

Das Problem beim nolisting ist nun, dass einige Spammer (vermutlich aufgrunddessen) direkt den zweiten MX-Eintrag benutzen ("`direct-to-second-mx"'). Hier kommt nun \prog{mxallowd} ins Spiel: Auf den zweiten Mailserver darf man sich nicht verbinden (das Paket wird einfach via netfilter/iptables verworfen), außer, wenn man es zuvor beim ersten Mailserver probiert hat.\np

Dieses Problem hätte man prinzipiell auch nur via iptables mit dem Modul \prog{ipt\_recent} lösen können, wenn es nicht ein kleines Problem dabei gäbe: Einige Anbieter (wie zum Beispiel Google Mail) verwenden zwar den gleichen DNS-Namen, aber unterschiedliche IP-Adressen im selben Zustellzyklus. Das heißt, dass \prog{ipt\_recent}, welches ausschließlich auf IP-Adress-Basis arbeitet, E-Mails von Google nicht durchlässt. \prog{mxallowd} fügt daher alle IP-Adressen des DNS-Eintrags in die Whitelist ein (außer, wenn man die Option $--$no-rdns-whitelist angibt).\np

\subsection{Lizenz}

\prog{mxallowd} ist freie Open-Source-Software unter der GPLv2\footnote{\url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html}}.

\subsection{Entwicklung}

Den momentanen Stand der Entwicklung kann man auf \url{https://code.stapelberg.de/mxallowd/} begutachten.\np

Über Patches, Feature-Requests oder Bugreports bin ich natürlich erfreut, meine E-Mail-Adresse und meinen GPG-Key findest du auf \url{http://michael.stapelberg.de/Kontakt}.

\clearpage
\subsection{Funktionsweise}

Auf folgender Grafik ist abgebildet, wie ein Verbindungsaufbau ablaufen kann. Dabei ist mit "`Spammer"' ein nicht-RFC-konformer Mailsender gemeint und mit "`Mailserver"' ein RFC-konformer. Das SMTP-RFC schreibt vor, dass ein Mailsender alle MX-Einträge in der angegebenen Priorität durchprobieren muss, um die Mail zu versenden.\np

Der Spammer verbindet sich in dieser Grafik entweder direkt mit dem ersten (falschen) Mailserver oder direkt mit dem zweiten, während der Mailserver beide nacheinander durchprobiert.

\begin{figure}[h!]
	\centering
	\includegraphics[width=0.75\textwidth]{scheme1.png}
	\caption{Funktionsweise}
\end{figure}

\clearpage
\section{Installation unter Linux}

Damit neue Verbindungen an \prog{mxallowd} geleitet werden, muss man folgende iptables-Regel hinzufügen:

\begin{lstlisting}
iptables -A INPUT -p tcp --dport 25 -m state --state NEW \
	 -j NFQUEUE --queue-num 23
\end{lstlisting}

Falls das Einfügen dieser Regel nicht klappt, muss zuvor das Queue-Modul geladen werden:

\begin{lstlisting}
modprobe nfnetlink_queue
\end{lstlisting}

Die Regel kann man selbstverständlich anpassen, sodass zum Beispiel nur an bestimmte IP-Adressen gerichtete Verbindungen gefiltert werden, oder dass Verbindungen von bestimmten IP-Adressen von vorneherein akzeptiert werden (-j ACCEPT am Ende).\np

Seit Version 1.5 funktioniert das auch mit ip6tables und IPv6-Verbindungen.

\section{Installation unter BSD}

Eine \prog{/etc/pf.conf} könnte so aussehen:

\begin{lstlisting}
table <mx-white> persist

real_mailserver="192.168.1.4"
fake_mailserver="192.168.1.3"

real_mailserver6="2001:dead:beef::1"
fake_mailserver6="2001:dead:beef::2"

pass in quick log on fxp0 proto tcp from <mx-white> \
	     to $real_mailserver port smtp
pass in quick log on fxp0 inet6 proto tcp from <mx-white> \
	     to $real_mailserver6 port smtp
block in log on fxp0 proto tcp \
	      to { $fake_mailserver $real_mailserver } port smtp
block in log on fxp0 inet6 proto tcp \
	      to { $fake_mailserver6 $real_mailserver6 } port smtp
\end{lstlisting}

Wichtig dabei ist, dass die Table \prog{mx-white} existiert und dass sowohl die pass- als auch die block-Regeln loggen.

Wenn man ein anderes pflog-interface verwendet, kann man mxallowd das via Parameter mitteilen.

\section{Hilfe, ich kann keine Mails mehr versenden!}

Das stimmt -- wenn du den selben Mailserver auch verwendest, um Mails zu versenden, probiert dein Mailclient in der Regel nur eine Verbindung. Ich würde raten, die Mails über SMTPS (SSL) zu versenden, denn dieser Port (465) wird nicht von \prog{mxallowd} gefiltert. Ansonsten kannst du deinen Mailserver auch zusätzlich auf einem anderen Port laufen lassen, den nur zu benutzt (Spammer treiben nicht den Aufwand, einen Portscan durchzuführen, wenn sie nicht mal standardkonforme Mailer verwenden...). Falls du eine fixe IP-Adresse hast, kannst du diese natürlich auch via iptables whitelisten:\np

\begin{lstlisting}
iptables -I INPUT 1 -p tcp --dport 25 --s 192.168.2.3 -j ACCEPT
\end{lstlisting}


\end{document}
