\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{iptables und 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} \textbf{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} \textbf{nftables:} \begin{itemize} \item ein Tool für alle Protokolle \\ (IPv4, IPv6, Ethernet-Bridging, ARP) \item einheitliche 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 effizient \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}{0.97\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}{0.97\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{Syntax und Tools} \textbf{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{Syntax und Tools} \textbf{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}{.75\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{Ermittlung der optimalen Paketgröße} \begin{center} \includegraphics[width=11cm]{../../../bericht/benchmarks/nft-size-load-rate-send.pdf} \end{center} \end{frame} \begin{frame} \frametitle{Ermittlung der optimalen Paketgröße} \begin{center} \includegraphics[width=11cm]{../../../bericht/benchmarks/nft-size-load-rate-recv.pdf} \end{center} \end{frame} \begin{frame} \frametitle{Daten- und Paketdurchsatz} \begin{center} \includegraphics[width=11cm]{../../../bericht/benchmarks/nft-ipt-drop.pdf} \end{center} \end{frame} \begin{frame} \frametitle{Verarbeitungsgeschwindigkeit / Antwortzeit} \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} \item Fazit: (noch) nicht für den Produktiveinsatz bereit \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}