\documentclass[10pt]{beamer}

%\usepackage[utf8x]{inputenc}
\usepackage{ngerman}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{bbm}

\usepackage{tabularx}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{url}
%\usepackage{hyperref}
\usepackage{eurosym}
\usepackage{listings}

\usepackage{multirow}
\usepackage{colortbl}
\usepackage{booktabs}
\usepackage{setspace}

\usepackage[utf8]{inputenc}

\input{theme/theme}

\title{Linux Cluster in Theorie und Praxis}
\subtitle{\texttt{iptables} und \texttt{nftables}}
\author{Alfred Krohmer}
\date{4. März 2014}
\institute[ZIH TUD]{Zentrum für Informationsdienste und Hochleistungsrechnen -- TU Dresden}
%\room{INF 1046}
\address{Nöthnitzer Straße 46}
\city{01189 Dresden}
%\phone{+49 0351 - 463 38783}
\email{s4039299@mail.zih.tu-dresden.de}

\setbeamercovered{transparent}
\begin{document}

\zihmaketitle

\begin{frame}
\frametitle{Inhalt}
 \tableofcontents
\end{frame}


\section{Einführung}

\begin{frame}
\frametitle{Einführung}

Zielstellungen bei der Entwicklung bei \texttt{nftables}
\begin{itemize}
	\item Vereinfachung der Kernel-ABI
	\item Vermeidung von Code-Redundanz
	\item effizientere Abarbeitung der Regeln
	\item bessere Fehlermeldungen
\end{itemize}

\end{frame}


\section{Rückblick / bisherige Firewall-Lösungen}

\begin{frame}
\frametitle{Rückblick / bisherige Firewall-Lösungen}

\begin{itemize}
	\item 1994: ipfw
	\item 1996: ipfwadm
	\item 1999: ipchains
	\item 2000: iptables
	\item \textbf{2014: nftables}
\end{itemize}

\end{frame}


\section{Funktionsweise iptables vs. nftables}

\begin{frame}
\frametitle{Funktionsweise iptables vs. nftables}

iptables:
\begin{itemize}
	\item nur für IPv4
	\item andere Tools für andere Protokolle:
	\begin{itemize}
		\item ip6tables
		\item arptables
		\item ebtables
	\end{itemize}
	\item für jedes Protokoll eine eigenständige Implementierung im Kernel
	\item Code für jedes Protokoll sehr spezifisch
	\begin{itemize}
		\item viel replizierter Code
		\item hohe Performance
	\end{itemize}
\end{itemize}

\end{frame}

\begin{frame}
\frametitle{Funktionsweise iptables vs. nftables}
\begin{center}
\includegraphics[width=10cm]{../iptables.png}
\end{center}
\end{frame}

\begin{frame}
\frametitle{Funktionsweise iptables vs. nftables}

nftables:
\begin{itemize}
	\item ein Tool für alle Protokolle \\
	(IPv4, IPv6, Ethernet-Bridging, ARP)
	\item inheitliche Schnittstelle zum Kernel
	\item Implementierung als kleine virtuelle Maschine im Kernel
	\item Regeln werden im Userspace zu Byte-Code kompiliert
	\item Byte-Code kann auf Feldern und Bits der Pakete Operationen ausführen:
	\begin{itemize}
		\item vergleichen (matching) $\rightarrow$ bedingte Sprünge
		\item arithmetische und logische Operationen
		\item beliebige Änderungen am Paketinhalt
	\end{itemize}
	\item atomares Ersetzen von Regeln über Netlink-Transaktionen
	\item funktioniert mit bisher verfügbaren Tools noch nicht effektiv
\end{itemize}

\end{frame}

\begin{frame}
\frametitle{Funktionsweise iptables vs. nftables}
\begin{center}
\includegraphics[width=8cm]{../nftables.jpg}
\end{center}
\end{frame}

\lstset{
  basicstyle=\ttfamily\small
}

\begin{frame}[fragile]
\frametitle{Funktionsweise iptables vs. nftables}
\begin{itemize}
	\item \hspace{0.3cm}
\begin{minipage}{.45\linewidth}%
\begin{lstlisting}
payload load 4 offset network header + 16 => reg 1
compare reg 1 192.168.0.1
\end{lstlisting}
\end{minipage}
 
	\item \hspace{0.3cm}
\begin{minipage}{.45\linewidth}%
\begin{lstlisting}
payload load 4 offset network header + 16 => reg 1
set lookup reg 1 load result in verdict register
    { "192.168.0.1" : jump chain1,
      "192.168.0.2" : drop,
      "192.168.0.3" : jump chain2 }
\end{lstlisting}
\end{minipage}
\end{itemize}
\end{frame}


\section{Syntax und Tools}

\begin{frame}
\frametitle{Funktionsweise iptables vs. nftables}

iptables:
\begin{itemize}
	\item iptables -A INPUT -p tcp --dport 22 -j LOG
	\item iptables -A INPUT -p tcp --dport 22 -j DROP
\end{itemize}

\end{frame}

\begin{frame}[fragile]
\frametitle{Funktionsweise iptables vs. nftables}

nftables: nft
\begin{itemize}
	\item nft add table filter
	\item nft add chain filter input "\{ type filter hook input priority 0; \}" \\ \vspace{0.3cm}
    \item nft add rule filter input \
    tcp dport 22 log drop \\ \vspace{0.3cm}

	\item als Script: \\
\begin{minipage}{.45\linewidth}%
\begin{lstlisting}
#!/usr/bin/nft -f
table filter {
  chain input {
    type filter hook input priority 0;
    ip protocol tcp dport 22 drop log
  }
\end{lstlisting}
\end{minipage}

	\item nft bisher noch kaum in Linux-Distributionen verfügbar
	\item in Arch Linux bisher nur im AUR verfügbar
  
\end{itemize}

\end{frame}


\section{Performance-Vergleich}

\begin{frame}
\frametitle{Performance-Vergleich}

Testaufbau:
\begin{center}
\includegraphics[width=10cm]{../../../bericht/bilder/nft-layout.pdf}
\end{center}

\end{frame}

\begin{frame}
\frametitle{Performance-Vergleich}

\begin{itemize}
	\item Hardware:
	\begin{itemize}
		\item Sender / Empfänger:
		\begin{itemize}
			\item Intel Atom 330 (1,6 GHz)
			\item NVIDIA MCP79 Ethernet Controller
			\item 2 GB RAM
		\end{itemize}
		\item Firewall:
		\begin{itemize}
			\item Intel Core 2 Duo E6750 (2,6 GHz)
			\item Intel 82572EI und 82566DM-2 Ethernet Controller
			\item 2 GB RAM
		\end{itemize}
	\end{itemize}
	
	\item Software:
	\begin{itemize}
		\item Paket-Generator: pktgen
		\item Netzwerk-Monitor: ifpps (aus netsniff-ng)
	\end{itemize}
	
	\item Testablauf:
	\begin{itemize}
		\item zotac3 sendet Pakete über zotac-firewall an zotac4
		\item Firewall hat entsprechend viele Regeln
		\item Empfänger verwirft Pakete noch im iptables-Stack
	\end{itemize}
\end{itemize}

\end{frame}


\begin{frame}
\frametitle{Performance-Vergleich}
\begin{center}
\includegraphics[width=11cm]{../../../bericht/benchmarks/nft-size-load-rate-send.pdf}
\end{center}
\end{frame}


\begin{frame}
\frametitle{Performance-Vergleich}
\begin{center}
\includegraphics[width=11cm]{../../../bericht/benchmarks/nft-size-load-rate-recv.pdf}
\end{center}
\end{frame}


\begin{frame}
\frametitle{Performance-Vergleich}
\begin{center}
\includegraphics[width=11cm]{../../../bericht/benchmarks/nft-ipt-drop.pdf}
\end{center}
\end{frame}


\begin{frame}
\frametitle{Performance-Vergleich}
\begin{center}
\includegraphics[width=11cm]{../../../bericht/benchmarks/nft-ipt-drop-response.pdf}
\end{center}
\end{frame}

\section{Schlussfolgerung}

\begin{frame}
\frametitle{Schlussfolgerung}

\begin{itemize}
	\item iptables bezüglich Durchsatz noch überlegen, bei sehr vielen Regeln etwa gleich bzw. etwas schlechter als nftables
	\item nftables skaliert bezüglich Antwortzeit besser
	\item Vorteile nftables:
	\begin{itemize}
		\item Konzept mit virtueller Maschine mächtig
		\item leichte Erweiterbarkeit
	\end{itemize}
	\item aber:
	\begin{itemize}
		\item momentan bei mittlerer Regelanzahl noch wesentlich schlechter performant als iptables
		\item bisher so gut wie keine Dokumentation verfügbar
	\end{itemize}
\end{itemize}

\end{frame}

\section{Quellen}

\begin{frame}
\frametitle{Quellen}

\begin{itemize}
	\item Projekt-Website von nftables: \\
	\url{http://netfilter.org/projects/nftables/}
	\item Tutorial von Eric Leblond:
	\url{https://home.regit.org/netfilter-en/nftables-quick-howto/}
	\item nftables Wiki: \\
	\url{http://wiki.nftables.org/wiki-nftables/}
	\item Wikipedia-Artikel: \\
	\url{http://en.wikipedia.org/wiki/Nftables}
\end{itemize}

\end{frame}


\end{document}