[[Vorlage(getestet, general)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:sudo:Als Systemverwalter root arbeiten] }}} [[Inhaltsverzeichnis(2)]] Mit Hilfe von [https://netfilter.org/projects/iptables/index.html iptables] {en} wird [https://www.netfilter.org Netfilter] {en}, der IP-Paketfilter des [:Kernel: Linux-Kernels] konfiguriert. Paketfilter werden üblicherweise in Routern und Firewalls eingesetzt. iptables und Netfilter wurden mit dem Linux Kernel 2.4 eingeführt und unverändert in den Kernel 2.6 übernommen. iptables selbst dient nur zur Kommunikation mit Netfilter im Linux-Kernel. Eine modernere Alternative hierfür ist [#Links Nft], welches das Netfilter-Projekt ebenfalls entwickelt und pflegt. = Installation = Das Paket '''iptables''' ist üblicherweise in der Standardinstallation von Ubuntu enthalten und muss daher in der Regel nicht selbst installiert werden.[1] {{{#!vorlage Paketinstallation iptables, Verwaltungswerkzeuge für Paketfilterung und Network Address Translation (NAT) }}} {{{#!vorlage Hinweis Die Installation des Pakets '''iptables''' erstellt die Befehle '''iptables''' und '''ip6tables''' als symbolische Verknüpfungen (über mehrere Zwischenstufen) auf ein allgemeineres Programm (bis 20.04: '''xtables-legacy-multi''', ab 22.04: '''xtables-nft-multi'''). Diese verhalten sich beim Aufruf mit den alten Namen so wie die früher eigenständigen Programme iptables und ip6tables: * iptables bearbeitet Regeln für IPv4-Pakete * ip6tables bearbeitet Regeln für IPv6-Pakete Wenn im Artikel nur von iptables als Programm gesprochen wird, gilt das entsprechend auch für ip6tables. }}} = Grundlagen der Paketprüfung = Ist der Paketfilter des Kernel aktiv (d.h. sind mit iptables erstellte Filterregeln konfiguriert), so werden alle IP-Datenpakete geprüft. Ankommende Pakete werden geprüft, bevor sie an die Zielanwendung geleitet werden, ausgehende Pakete werden geprüft, bevor sie den Rechner verlassen. Agiert der Rechner als Router (z.B. in einem Netzwerk), so werden die Pakete während der Weiterleitung geprüft. Außerdem besteht auch die Möglichkeit der Paketmanipulation. Die Art der Prüfung lässt sich mit Hilfe von iptables sehr detailliert vorgeben. = Funktionsweise von iptables = Die Paketprüfung und die mit iptables zu erstellenden Filterregeln sind dreistufig aufgebaut. Es gibt (hierarchisch von oben nach unten): * Tabellen (''tables''), diese enthalten * Regelketten (''chains''), davon gibt es vordefinierte Standardketten und vom Benutzer selbst erstellte zusätzliche Ketten, und in diesen stehen * die eigentliche Filterregeln Man kann sich vereinfachend die Regelketten als Prozeduren vorstellen, die in einer bestimmten Reihenfolge aufgerufen werden und dann die enthaltenen Filterregeln sequentiell abarbeiten. Abhängig von der in einer Regel enthaltenen Aktion kann diese die Bearbeitung der Regelkette beenden oder nicht. Eine Regelkette kann auch eine andere aufrufen und die aufgerufene kann wieder zurückkehren. Aus Sicht eines IP-Paketes betrachtet, erklärt man die Arbeitsweise von Netfilter als eine Reise durch die verschiedenen [#Tabellen Tabellen] und [#Regelketten Regelketten], wie in folgender Abbildung dargestellt. [[Bild(Netfilter.png, 600, align=right, alt="Abb. Reise von IP-Paketen durch Netfilter", title="Diese Grafik ist eigenständiges Werk von kB @ UbuntuUsers.de und ist lizenziert unter Creative Commons Attribution Non-Commercial 3.0 License." )]] Ein von einem externen Prozess gesendetes IP-Paket trifft über das Netzwerk (blauer Blockpfeil) an einer der Schnittstellen ''interface 1-N'' ein und reist in Pfeilrichtung auf den blauen Wegen durch die Tabellen und Standardketten. Nach den PREROUTING-Ketten erfolgt das (gelb dargestellte) [:Router/Routing-Funktion:Routing], welches möglicherweise das Paket in die Warteschlangen INPUT zur lokalen Zustellung und/oder FORWARD zur Weitergabe an andere Rechner einreiht oder verwirft. ''conntrack'' ist keine Tabelle, sondern eine interne Klassifizierung des Pakets, die in den Ketten der folgenden Tabellen ausgewertet werden kann. Für ein von einem lokalen Prozess stammendes Paket wird zunächst per Routing die zuständige Schnittstelle ermittelt, dann durchlaufen diese Pakete aus OUTPUT zusammen mit den Paketen aus FORWARD noch POSTROUTING, bevor sie entweder über die Schnittstelle ''lo'' wieder zurück geführt werden oder über die Schnittstellen ''interface 1-N'' und das Netzwerk zu anderen Rechnern gelangen. In jeder der gezeigten Ketten kann das Paket spezifisch für die jeweilige Tabelle bearbeitet oder ggf. auch endgültig verworfen (`DROP`) werden. Eine „Akzeptierung“ (`ACCEPT`) bedeutet also im Grunde nur ein „darf weiter zur nächsten Stelle“. Dies gilt auch für die Standardkette INPUT. Nicht jedes Paket, welches hier akzeptiert wird, kann auch – möglicherweise schädlich – auf den Rechner einwirken. Vielmehr prüft noch als letzte Instanz der (rot dargestellte) Netzwerk-Stack im Kernel jedes Paket, ob überhaupt ein aktiver Prozess auf ein IP-Paket mit den Eigenschaften Empfänger-Adresse, Protokoll und Empfänger-Port wartet. Wenn dies nicht der Fall ist, wird des Paket stillschweigend vernichtet. Trifft eine in einer Tabelle und Kette definierte Regel zu, so wird die in der Regel hinterlegte [#aktion Aktion] ausgeführt. Sollte keine Regel zutreffen (was durchaus nichts ungewöhnliches ist), so wird die in der Tabelle hinterlegte, allgemein gültige [#Policy Policy] angewendet. Bein praktischen Umgang mit dem Programm '''iptables''' muss man in den meisten Fällen ziemlich viele Optionen angeben. Dies ist Folge der indirekten Arbeitsweise: iptables selbst filtert gar nichts, sondern mit Hilfe dieses Programms erklärt der Systemverwalter dem Linux-Kernel, was dieser tun soll. Bei jedem Aufruf des Programms muss man also angeben, an welcher Stelle im Regelwerk – d.h. in welcher Tabelle (''table'') und welcher Regelkette (''chain'') sowie ggf. an welcher Position in der Kette – etwas verändert werden soll, wie diese Veränderung aussehen soll, und zusätzlich muss man sagen, welche Regel an der so festgelegten Stelle denn stehen soll. Dabei besteht die Regel selbst auch noch aus möglicherweise mehreren Bedingungen (Selektoren), die für das Paket alle zutreffen müssen, damit dann die in der Regel definierte Aktion ausgeführt wird. == Tabellen == Die Tabellen unterteilen das gesamte Regelwerk nach der grundsätzlichen Aufgabe. Es gibt vier wichtige Tabellen (= Regelsätze): [[Anker(Tabelle1)]] ||<-2 rowclass="titel">'''Tabelle 1: Tabellen von iptables'''|| ||'''Tabelle'''||'''Beschreibung'''|| || `filter` || Diese Standardtabelle enthält alle reinen Filterregeln. || || `nat` || Diese Tabelle wird für Adressumsetzung (NAT = Network Address Translation) und spezielle Weiterleitungen (Port Forwarding) eingesetzt. || || `mangle` || Diese Tabelle wird zur Manipulation des Pakets eingesetzt.|| || `raw` || Diese Tabelle ermöglicht, Ausnahmen vom normalerweise aktiven ''Connection Tracking'' zu definieren oder dieses sogar ganz auszuschalten.|| Es gibt eine fünfte, noch ungebräuchliche Tabelle `security`. Eigene Tabellen kann man nicht anlegen. == Regelketten == Jede Tabelle enthält verschiedene Regelketten. Es gibt fünf verschiedene Standardketten, davon kommt nicht jede in jeder Tabelle vor. Diese bestimmen, wann ein Paket geprüft wird und unterscheiden, woher ein Paket stammt und/oder wohin es gesendet werden soll: [[Anker(Tabelle2)]] ||<-4 rowclass="titel">'''Tabelle 2: Standardketten von iptables'''|| || '''Chain''' || '''für Tabelle''' || '''Wann?''' || '''Beschreibung''' || || `PREROUTING` || `raw`, `mangle`, `nat` || bevor Routing || von einer Schnittstelle (inkl. `lo`) empfangene Pakete || || `INPUT` || `mangle`, `nat`, `filter` || nach Routing || an eine lokalen IP-Adresse gerichtete Pakete || || `FORWARD` || `mangle`, `filter` || nach Routing || von anderen Rechnern stammende und für einen anderen Rechner bestimmte Pakete || || `OUTPUT` || `raw`, `mangle`, `nat`, `filter` || bevor Routing || von einem lokalen Prozess stammende Pakete || || `POSTROUTING` || `mangle`, `nat` || nach Routing || alle Pakete vor Übergabe an ihre vorgesehene Schnittstelle (inkl. `lo`) || Man kann in jeder Tabelle zusätzliche Regelketten anlegen, eine solche ist dann aus den Standardketten quasi als Unterprogramm aufrufbar. == Definition der Filterregel == In den Regelketten werden die Regeln festgelegt. Dies geschieht über einen Aufruf von iptables im Terminal[2]. {{{#!vorlage Hinweis Der Aufruf von iptables erfordert immer [:sudo: Root-Rechte]: {{{#!vorlage Befehl sudo iptables OPTION… \}}} Im folgenden Text wird immer voraus gesetzt, dass bei Befehlen mit `iptables` als `root` gearbeitet wird[3] oder `sudo` voran gestellt wird. }}} Bei der Arbeit mit iptables sollte man wegen der Übersichtlichkeit die benötigten Optionen in einer einheitlichen Reihenfolge angeben, z.B.: {{{#!vorlage Befehl iptables «Stelle-im-Regelwerk-und-Art-der-Bearbeitung» «Eigenschaft-des-IP-Pakets»… «Aktion» }}} Durch die Notation „«...»“ wird angedeutet, dass hierfür mehrere zusammengehörende Optionen stehen können: * Für «Stelle-im-Regelwerk-und-Art-der-Bearbeitung» benötigt man die Option `-t` mit dem Namen einer Tabelle, eine der Optionen `-I/A/D` usw., ggf. mit einer Regelkette und ggf. eine Zahl zur Angabe der Position in der Regelkette. * Für «Eigenschaft-des-IP-Pakets» benutzt man die Optionen `-i`, `-o`, `-s`, `-d`, `-p`, `--sport`, `--dport` und `-m` und ggf. weitere zusätzliche Optionen. Man muss keinen und kann mehrere Selektoren angeben. * Die ggf. auszuführende «Aktion» wird mit der Option `-j` bezeichnet. Man kann höchstens eine Aktion angeben; wenn man für bestimmte IP-Pakete mehrere Aktionen benötigt, muss man mehrere Regeln anlegen. Dazu kennt iptables eine Vielzahl von Optionen, von den im folgenden einige (primär für die Tabelle `filter` und die Chains `INPUT`, `OUTPUT` und `FORWARD`) erklärt werden. [[Anker(optionen)]] ||<-2 rowclass="titel">'''Tabelle 3: Optionen für Filterregeln''' || ||'''Option'''||'''Beschreibung''' || ||<-2> '''Optionen für «Stelle-im-Regelwerk-und-Art-der-Bearbeitung»''' || || `-t TABLE` || Auswahl der Tabelle TABLE zur Bearbeitung. Für TABLE ist eine Bezeichnung aus [#Tabelle1 Tabelle 1] einzusetzen. Zur Auswahl der Tabelle `filter` kann man diese Option weglassen. || || `-A CHAIN` || Regel wird an die Kette CHAIN angehängt.|| || `-I CHAIN INDEX` || Regel wird an Position INDEX der Kette CHAIN eingefügt. Für INDEX ist eine positive ganze Zahl oder nichts anzugeben; bei Nichtangabe der Position wird die Regel am Anfang der Kette eingefügt. || || `-D CHAIN INDEX` || Regel an der Position INDEX wird aus der Kette CHAIN entfernt. Die Position muss angegeben werden. || ||<-2> '''Optionen für «Eigenschaft-des-IP-Pakets»''' || || `-i SCHNITTSTELLE` || Das Paket muss über Netzwerkschnittstelle SCHNITTSTELLE eingegangen ist. Aus Sicht von iptables kann man für SCHNITTSTELLE fast jede beliebige Zeichenkette einsetzen, Sinn macht aber nur ein Name für eine vom Befehl `ip link` aufgeführte Schnittstelle. || || `-o SCHNITTSTELLE` || Das Paket muss zur Versendung über die angegebene Netzwerkschnittstelle SCHNITTSTELLE vorgesehen sein. || || `-s IP-ADRESSE` || Das Paket enthält die IP-Adresse IP-ADRESSE als Absender. || || `-d IP-ADRESSE` || Das Paket enthält die IP-Adresse IP-ADRESSE als Empfänger. || || `-p PROTOKOLL` || Das Paket muss das angegebene höhere Protokoll PROTOKOLL (z.B. TCP, UDP, ICMP) enthalten. Für PROTOKOLL ist dessen Identifizierungsnummer oder der in der Datei '''/etc/protocols''' definierte Kurzname einzusetzen, also z.B. für TCP: `6` oder `tcp`|| || `--sport PORT` oder `--source-port PORT` || Das Paket enthält die Port-Nummer PORT als Absender. Dieser Selektor ist nur möglich nach der Option `-p` zur Auswahl eines Protokolls, welches Ports benutzt! || || `--dport PORT` oder `--destination-port PORT` || Das Paket enthält die Port-Nummer PORT als Empfänger. Muss zwingend in Verbindung mit `-p` benutzt werden! || || `! OPTION` || Negation: Das Paket wird selektiert, wenn es die folgende Option OPTION nicht erfüllt. Beispiel: "`! -o lo"` selektiert alle Pakete, die __nicht__ von der Schnittstelle `lo` stammen. || || `-m MODUL` || Lädt für die aktuelle Regel die zusätzliche Funktionalität mit dem Namen MODUL. Nach dieser Option werden abhängig von MODUL weitere Optionen verfügbar. || ||<-2> '''Optionen für «Aktion»''' || || `-j AKTION` || Legt fest, dass die Aktion AKTION auf das Paket angewendet wird, wenn alle Prüfkriterien erfüllt wurden. AKTION kann eine der [#aktion Tabelle 4] beschriebenen durch iptables implementierten Aktionen oder der Name einer selbst definierten Regelkette sein; in diesem Fall besteht die Aktion in der Prüfung der dort hinterlegten Regeln. || ||<-2> '''Optionen zur Bearbeitung ganzer Regelketten''' || || `-P STANDARD-CHAIN METHODE` || Legt für die Standard-Regelkette STANDARD-CHAIN [#Tabelle2 Tabelle 2] die Methode METHODE fest, wie mit dem Paket verfahren werden soll, falls keine Filterregel zutrifft. Für METHODE ist `DROP` oder `ACCEPT` einzusetzen. Weitere Details siehe [#Policy Policy]. || || `-L CHAIN` || Listet alle Regeln in der Regelkette CHAIN oder ohne Angabe von CHAIN in allen Regelketten der ausgewählten Tabelle. || || `-N NEUER-NAME` || Erzeugt in der ausgewählten Tabelle eine neue leere Regelkette mit dem Namen NEUER-NAME. || || `-F CHAIN` || Löscht alle Regeln in der Regelkette CHAIN oder ohne Angabe von CHAIN in allen Regelketten der ausgewählten Tabelle. || || `-X CHAIN` || Löscht in der ausgewählten Tabelle eine leere Regelkette mit dem Namen CHAIN. || [[Anker(aktion)]] Trifft eine Filterregel auf ein Paket zu, muss noch festgelegt werden, wie mit dem Paket verfahren werden soll (Option `-j Aktion`, siehe oben). Bei normaler Filterung sind die häufigsten Aktionen: ||<-2 rowclass="titel">'''Tabelle 4: Häufig angewendete Aktionen'''|| ||'''Aktion'''||'''Beschreibung'''|| ||`ACCEPT`|| Das Paket wird vorläufig akzeptiert und die Bearbeitung dieses Paketes in dieser Tabelle wird beendet. Es kann aber noch in später durchlaufenden Tabellen weiter bearbeitet und auch noch verworfen werden. || ||`DROP`|| Das Paket wird endgültig verworfen, der Sender erhält keine Nachricht. || ||`REJECT`|| Das Paket wird endgültig verworfen, der Sender wird benachrichtigt. Diese Aktion kann nicht in allen Chains, sondern nur in INPUT, FORWARD und OUTPUT verwendet werden. || ||`LOG`|| Die Paketdaten werden lediglich im System-Log festgehalten, damit ist aber keine Entscheidung über das spätere Schicksal des Pakets verbunden. || ||`RETURN`|| Die Bearbeitung des Pakets in der aktuellen Regelkette wird beendet. Wenn diese Aktion in einer Standardkette (wie z.B. INPUT) verwendet wird, entscheidet die Policy dieser Standardkette über das Schicksal des Pakets. Bei Verwendung in einer selbst definierten Regelkette wird die Bearbeitung des Paketes nach der aufrufenden Stelle fortgesetzt.|| || (keine) || Man kann auf die Option `-j` verzichten. Das Paket wird dann nur gezählt und seine Prüfung mit der nächsten Regel fortgesetzt. || Das sind nur einige wenige Optionen und Aktionen, welche hauptsächlich zur reinen Filterung angewendet werden. iptables kennt noch viele [#Weitere-Optionen-und-Moeglichkeiten weitere Optionen und Möglichkeiten]. == Policy == Aufgrund der Vielzahl von Möglichkeiten wird nicht immer für jedes mögliche Paket (d.h. Kombination aus Protokoll, Netzwerkschnittstelle, Port etc.) eine Filterregel existieren. Daher wird für jede Standardkette als Grundsatzregel (''policy'') eine Methode für den Fall vereinbart, dass keine Filterregel zutrifft. Die Policy setzt sich aus dem Tabellennamen, dem Namen der Standardkette und der Methode (DROP oder ACCEPT) zusammen. Beispiele: {{{#!vorlage Befehl iptables -P INPUT DROP iptables -t mangle -P PREROUTING ACCEPT }}} Im ersten Beispiel wird festgelegt, dass für die Standardkette INPUT in der Tabelle `filter` (im Befehl nicht explizit erwähnt, da Standard) alle eingehenden Pakete verworfen werden, sofern sie keiner Filterregel entsprechen. Im zweiten Beispiel wird für die Standardkette `PREROUTING` in der Tabelle `mangle` als Standard-Verfahrensweise „vorläufig annehmen“ eingestellt, was auch der Vorgabe für alle Standardketten entspricht. Für eine selbst definierte Regelkette kann keine Policy festgelegt werden; sie ist unveränderlich immer `RETURN`. = Weitere Optionen und Möglichkeiten = Neben den oben beschriebenen Funktionen können mit Hilfe von iptables noch viele andere Regeln und Aktionen für Netfilter erstellt werden. * Beispielsweise beherrscht iptables / Netfilter mit dem Modul ''Connection Tracking'' auch ''"stateful inspection"'', d.h. Pakete werden in Abhängigkeit vom Zustand der Verbindung geprüft. „Zustand der Verbindung“ bedeutet, ob das Paket z.B. zu einer bestehenden Verbindung gehört (also ein Folgepaket ist) oder ob es sich um eine neue Verbindung handelt. Lese weitere Erläuterungen im Beispiel [#Firewall Firewall]. * Weiterhin lassen sich mit iptables in Abhängigkeit vom Paket (bzw. der Paketprüfung) Sprünge in andere Regelketten realisieren. * Außerdem können mit iptables eine Vielzahl von Paketmanipulationen durchgeführt werden, die unter dem Begriff NAT (engl. ''Network Address Translation'', Netzwerkadressumschreibung) zusammengefasst werden. Die Konfiguration solcher Funktionen wird in einem eigenen Artikel behandelt: [:Router/NAT:] Eine sehr ausführliche Übersicht und Anleitung geben die [https://netfilter.org/documentation/index.html Dokumentation] {en} auf der Homepage sowie die [:man: Manpages] zu iptables: {{{#!vorlage Befehl man iptables man iptables-extensions }}} = Beispiele = == Regelwerk anzeigen == Zur Überprüfung, welche Filterregeln in einer Tabelle bereits hinterlegt sind, kann man diesen Befehl benutzen: {{{#!vorlage Befehl iptables -t filter -L }}} {{{ Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination }}} Das funktioniert natürlich auch mit den anderen Tabellen, wenn man anstatt `filter` deren Namen `raw`, `mangle` oder `nat` einträgt. In der Grundinstallation von Ubuntu sollten in jeder Tabelle nur leere Standardketten mit jeweils der Policy `ACCEPT` angezeigt werden. Die Ausgabe von iptables mit Option `-L` kann noch mit zusätzlichen Optionen beeinflusst werden: ||<-2 rowclass="titel">'''Zusätze für Option `-L`'''|| ||'''Aktion'''||'''Beschreibung'''|| || `-v` || Die Regeln werden mit ihren Zählern gezeigt. || || `-n` || Es wird nicht versucht, numerische Angaben bei Adressen und Ports in Namen zu übersetzen. (Eine solche Übersetzung verursacht zusätzlichen Netzwerkverkehr, welcher bei einer Diagnose stören kann.)|| Im laufenden Betrieb ist zur Kontrolle der Arbeitsweise dieser Befehl praktisch: (Hier am Beispiel der Tabelle `nat`.) {{{#!vorlage Befehl iptables -t nat -nvL }}} == Regelsatz löschen == Zur Entfernung eines Regelsatzes (also aller Regeln in jeder Regelkette einer Tabelle, hier beispielhaft. `mangle`) dient dieser Befehl: {{{#!vorlage Befehl iptables -t mangle -F }}} Damit werden in selbst definierten Regelketten zwar alle Regeln gelöscht, jedoch die dann leeren Ketten selbst nicht entfernt. Das erfolgt erst mit einem weiteren Befehl, der jedoch nur bei leeren Regelketten funktioniert: {{{#!vorlage Befehl iptables -t mangle -X }}} Vorstehende Befehle ändern auch nicht die Policy! Die Rücksetzung auf den Standardwert `ACCEPT` muss man für jede Standardkette einzeln vornehmen: {{{#!vorlage Befehl iptables -t mangle -L | grep Chain | while read _ Chain _ ; do iptables -P $Chain ACCEPT ; done }}} == Firewall == Im Artikel [:Router/Paketfilter:] wird ein mit iptables realisierter Paketfilter als Firewall für einen [:Router:] auf der Grenze (''border'') des eigenen Bereiches zum Internet vorgestellt. Hier wird zur Illustration der Bedienung von iptables eine rudimentäre [:Personal Firewalls:Personal Firewall] betrachtet, welche 1. die Kommunikation im Rechner intern und 1. im lokalen Netzwerk (hier beispielhaft: `192.168.178/24`) uneingeschränkt zulässt, 1. allen Stationen im Internet die Kontaktaufnahme mit diesem Rechner verbietet, 1. dem lokalen Rechner die Kontaktaufnahme zu Stationen im Internet nur über die Protokolle HTTP (= Port 80) und HTTPS (= Port 443) erlaubt. {{{#!vorlage Hinweis In der Desktop Grundinstallation hat Ubuntu keine offenen Ports, die speziell über eine ''Personal Firewall'' geschützt werden müssten. Die bei einer Grundinstallation wenigen offenen Ports sind nur vom eigenen Rechner aus oder aus dem Netzwerk vor dem Gateway zum Internet (d.h.z.B. LAN des eigenen Routers) erreichbar, jedoch nicht aus dem Internet. Weitere Informationen findet man in den Artikeln [:Sicherheit:] und [:Personal Firewalls:]. }}} Zur Einrichtung des Regelwerks ist iptables mehrmals mit folgenden Optionen aufzurufen: {{{#!code bash -F # in Tabelle filter alle Regeln löschen -X # in Tabelle filter zusätzliche Ketten löschen -P INPUT ACCEPT # Policy für Tabelle filter, INPUT Chain -P OUTPUT ACCEPT # Policy für Tabelle filter, OUTPUT Chain -P FORWARD ACCEPT # Policy für Tabelle filter, FORWARD Chain -N LogDrop -A LogDrop -j LOG -A LogDrop -j DROP -A INPUT -i lo -j ACCEPT # eingehende Kommunikation für lo (Localhost) zulassen -A INPUT -m state --state INVALID,UNTRACKED -j DROP # Schrott von draussen verbieten -A INPUT -s 192.168.178.0/24 -j ACCEPT # LAN erlauben -A INPUT -m state ! --state NEW -j ACCEPT # Verbindungsaufbau aus dem Internet verbieten -A INPUT -j LogDrop # Catch all -A OUTPUT -o lo -j ACCEPT # ausgehende Kommunikation für lo (Localhost) zulassen -A OUTPUT -d 192.168.178.0/24 -j ACCEPT # LAN erlauben -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # ausgehende Pakete für existierende Verbindungen zulassen -A OUTPUT -p tcp --dport 80 -j ACCEPT # Verbindungsaufbau von drinnen für HTTP Verbindungen zulassen -A OUTPUT -p tcp --dport 443 -j ACCEPT # und ebenso für HTTPS -A OUTPUT -j LogDrop # Catch all }}} * In der Zeilen 1-5 werden in der Tabelle filter zuerst alle Regeln gelöscht und ggf. verbliebene leere selbst definierte Regelketten entfernt und dann für die Standardketten die Standard-Policy `ACCEPT` definiert. * Oft wird empfohlen, die Policies auf `DROP` zu ändern, weil dann alle „Ports geschlossen werden“ und man dann „sicherer“ wäre. Das beruht auf einem Missverständnis: Da Setzen der Policies selbst ändert gar nichts daran, ob ein Port im fremden Portscanner als „offen“, „geschlossen“ oder „gefiltert“ erscheint. Das Ergebnis des fremden Portscanners kann nur dadurch geändert werden, indem man Pakete tatsächlich verwirft oder nicht verwirft und ob man verworfene Pakete zurück meldet oder nicht. In diesem Beispiel werden die Policies auf dem Standardwert `ACCEPT` belassen, weil die Policies ohnehin niemals benutzt werden sollen. Dies erfordert Regelsätze, die ausnahmslos jedes Paket erfassen. * In den Zeilen 7-9 wird eine eigene Regelkette definiert, welche später als Unterprogramm aufgerufen werden kann. Alles was in diese Regelkette gerät, wird im Systemlog notiert und vernichtet. * Die Zeilen 11 und 17 realisieren Aufgabe 1. Unter Linux läuft ein Teil der Interprozesskommunikation über das (interne) Netzwerk unter Verwendung der Netzwerkschnittstelle `lo` (z.B. [:XServer:] oder [:CUPS:]). Blockierung dieser Schnittstelle kann zu Fehlfunktionen bis hin zum Einfrieren/Absturz des Systems führen. * Zeilen 13 bzw. 18 erlauben eingehenden Verkehr von allen Stationen im LAN (d.h. Absender Adresse in `192.168.178/24`) bzw. ausgehenden Verkehr an alle Stationen im LAN (d.h. Empfänger Adresse in `192.168.178/24`). * Zeile 12 ist optional und verbietet mit Hilfe des zusätzlichen Moduls ''Connection Tracking'', hier in der Variante `state`, Paket mit Sonderstatus `INVALID` oder `UNTRACKED`, die aber ohnehin vom Netzwerkstack verworfen würden. Da solcher Schrott auch von Stationen im LAN unerwünscht ist, steht die Regel vor der Regel in Zeile 13. Das Modul `state` kennt außer diesen beiden auch als Status `NEW`, `ESTABLISHED` und `RELATED`, die in anderen Zeilen verwendet werden. * Zeile 14 realisiert Aufgabe 3: Nach der Regel in Zeile 13 erreichen nur noch Pakete von Absendern außerhalb des LANs diese Zeile, also aus dem Internet. (Das stimmt nicht exakt, weil es Multicast-Verkehr übersieht! Aber für das Beispiel ist es richtig genug.) Verkehr von Stationen im Internet erlauben wir, aber nur, wenn es keine neue Kontaktaufnahme ist. * Zeile 15 (und entsprechend auch Zeile 22) übergibt alle restlichen Pakete an die Regelkette `LogDrop` zur Vernichtung. Es ist eine gute Praxis, die Regelketten immer mit einer solchen "Catch-All"-Regel zu beenden. Alternativ kann man auch andere Aktionen vorsehen oder auch eine reine Zählregel verwenden. Die Aktion `LOG` macht natürlich nur dann Sinn, wenn man auch regelmäßig die Systemlogs liest. Eine Überwachung und Nachdenken über die Pakete, welche das Ende der Regelketten `INPUT` und `OUTPUT` erreichen, sollte sich aber jeder Systemverwalter als Pflicht auferlegen. * Aufgabe 4: Zeile 19 erlaubt dem lokalen Rechner, bestehende Verbindungen weiterhin aufrecht zu erhalten, indem Pakete an Rechner im Internet gesendet werden. Der Empfang solcher Pakete wurde bereits in Zeile 14 erlaubt. Diese beiden Zeilen erlauben aber noch nicht den Aufbau neuer Verbindungen. * Um dem lokalen Rechner den Aufbau von Verbindungen zu erlauben, wird dies in Zeilen 20 und 21 explizit erlaubt. Jedoch werden nicht beliebige Verbindungen, sondern nur Verkehr über das Protokoll TCP mit den Zielports 80 und 443 zugelassen. In der Datei '''/etc/services''' befindet sich eine vollständige Liste aller (systemspezifischen) Ports und der zugehörigen Protokolle. Es handelt sich hier um ein Beispiel und __keine__ vollständig eingerichtete Firewall! == Regelwerk speichern und laden == {{{#!vorlage Hinweis Die mit iptables erstellten Regeln sind __flüchtig__, d.h. sie bleiben nur bis zum Ausschalten des Computers erhalten! }}} Will man dauerhaft Regeln einrichten, müssen die Regeln in Dateien gesichert und beim Hochlauf wieder aus diesen Dateien in den Kernel geladen werden. Dazu kann man ein Skript verwenden, welches von Init-System ([:systemd:]) automatisch gestartet wird. Das Paket '''iptables''' bringt auch die Programme '''iptables-save''' und '''iptables-restore''' mit, die tun, was ihre Namen versprechen, wenn sie von `root` benutzt werden. {{{#!vorlage Befehl iptables-save > /etc/Netfilter ip6tables-save > /etc/Netfilter-6 }}} bzw. {{{#!vorlage Befehl iptables-restore < /etc/Netfilter ip6tables-restore < /etc/Netfilter-6 }}} iptables-restore löscht die aktiven Regeln, bevor es die Regeln aus der Datei in den Kernel schreibt. Wenn man dies nicht möchte, sondern die Regeln aus der Datei den aktiven Regelsatz ergänzen sollen, kann man dies mit der Option `--noflush` erreichen. Weitere Details kann man der [:Manpage:] des Programms entnehmen: {{{#!vorlage Befehl man iptables-save man iptables-restore }}} Alternativ zur Benutzung dieser beiden Programme kann man natürlich auch die vollständigen Befehle für iptables in ein Skript schreiben. Im UbuntuUsers.de-Wiki gibt es hierfür bereits einige nützliche Skripte: * [:Skripte/IPTadmin: IPTadmin] – Bash-Skript zum Laden/Überwachen/Sichern/Verwalten von Netfilter-Regelwerken * [:Skripte/nathelper: nathelper] – Perl-Skript zum Einrichten von NAT In den Ubuntu-Paketquellen gibt es mehrere Hilfsprogramme zur Einrichtung und Verwaltung von Regelwerken, teilweise auch mit graphischer Bedienoberfläche. = Graphische Benutzeroberfläche = Die richtige Konfiguration von iptables auf der Kommandozeile ist sicherlich alles andere als trivial oder übersichtlich, insbesondere wenn man komplexere Regelwerke erstellen möchte (z.B. für einen Netzwerkrouter, der ggf. auch noch Firewall-Funktionalität haben soll). Es gibt eine Reihe von (teilweise graphischen) Benutzeroberflächen, die diese Arbeit mit iptables erleichtern sollen. So sind z.B. folgende Oberflächen über die Paketverwaltung[1] von Ubuntu verfügbar: * [packages:firehol:] – Konfigurationswerkzeug für Firewalls, benutzt eigene Sprache zur Formulierung der Regeln * [packages:guidedog:] – Qt5-GUI für NAT * [packages:pyroman:] – Konfigurationswerkzeug für Firewalls in komplexen Netzwerken * [packages:shorewall:] – Konfigurator für Router-/Firewall-/Gateway-Anwendungen, arbeitet mit Beschreibungen in Dateien * [:ufw:] – Frontend für iptables, um die Handhabung der Netfilter-Module zu vereinfachen = Links = * [:Router:] – Einrichtung eines einfachen Routers unter Linux * [:Router/NAT:] * [:Router/Paketfilter:] ## * [:Router/Beispiel:] * [:ufw:] – Beschreibung von UFW im UbutuUsers.de-Wiki * [https://www.netfilter.org/ The netfilter.org project] {en} – Projektseite von Linux-Netfilter, iptables, nftables * [https://www.pro-linux.de/artikel/2/761/iptables-die-firewall-des-kernels-24.html Einführung in iptables] - {de} Relativ ausführliche Einführung in iptables (Artikel auf Pro-Linux, November 2001) * [wikipedia:Netfilter:Netfilter] - Wikipedia-Eintrag zu Netfilter * [wikipedia:Iptables:iptables] - Wikipedia-Eintrag zu iptables * [ubuntu_doc:community/IptablesHowTo:Basic iptables howto] {en} - Official Ubuntu Documentation, Community Help Wiki * [https://www.howtogeek.com/177621/the-beginners-guide-to-iptables-the-linux-firewall The Beginner’s Guide to iptables, the Linux Firewall] {en} #tag: Internet, Netzwerk, Sicherheit, Firewall, Paketfilter, Netfilter